(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ (Token id:Id.Lit_Chars val:'test describe\n' span_id:6) 
                (Token id:Id.Lit_Chars val:'\n' span_id:7) (Token id:Id.Lit_Chars val:'                       B\n' span_id:8) 
                (Token
                  id: Id.Lit_Chars
                  val: '        .--------------o----o----o----x\n'
                  span_id: 9
                ) (Token id:Id.Lit_Chars val:'       /                   /    /\n' span_id:10) 
                (Token
                  id: Id.Lit_Chars
                  val: ' o----o----o----o----o----.    /\n'
                  span_id: 11
                ) (Token id:Id.Lit_Chars val:'       \\        A    c        /\n' span_id:12) 
                (Token
                  id: Id.Lit_Chars
                  val: '        .------------o---o---o\n'
                  span_id: 13
                ) (Token id:Id.Lit_Chars val:'                   D,R   e\n' span_id:14)
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: check_describe
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:expect)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$1'))}
                  spids: [30]
                )
              ]
            )
            (C {(shift)})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:R)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:40)
                        command_list: 
                          (command.CommandList
                            children: [
                              (command.Simple
                                words: [{(git)} {(describe)} {(DQ ($ Id.VSub_At '$@'))}]
                                redirects: [
                                  (redir.Redir
                                    op: (Token id:Id.Redir_Great val:'2>' span_id:49)
                                    fd: 2
                                    arg_word: {(err.actual)}
                                  )
                                ]
                              )
                            ]
                          )
                      )
                    }
                  spids: [39]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:S)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_QMark '$?')}
                  spids: [54]
                )
              ]
            )
            (command.Simple
              words: [{(cat)} {(err.actual)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:62)
                  fd: -1
                  arg_word: {(3)}
                )
              ]
            )
            (C {(test_expect_success)} {(DQ ('describe ') ($ Id.VSub_Star '$*'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:74) 
                  (Token id:Id.Lit_Chars val:'\ttest $S = 0 &&\n' span_id:75) (Token id:Id.Lit_Chars val:'\tcase "$R" in\n' span_id:76) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t$expect)\techo happy ;;\n'
                    span_id: 77
                  ) (Token id:Id.Lit_Chars val:'\t*)\techo "Oops - $R is not $expect";\n' span_id:78) 
                  (Token id:Id.Lit_Chars val:'\t\tfalse ;;\n' span_id:79) (Token id:Id.Lit_Chars val:'\tesac\n' span_id:80) (Token id:Id.Lit_Chars val:'\t' span_id:81)
                )
              }
            )
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:92) (Token id:Id.Lit_Chars val:'\n' span_id:93) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:94) 
          (Token
            id: Id.Lit_Chars
            val: '\techo one >file && git add file && git commit -m initial &&\n'
            span_id: 95
          ) (Token id:Id.Lit_Chars val:'\tone=$(git rev-parse HEAD) &&\n' span_id:96) 
          (Token id:Id.Lit_Chars val:'\n' span_id:97) (Token id:Id.Lit_Chars val:'\tgit describe --always HEAD &&\n' span_id:98) 
          (Token id:Id.Lit_Chars val:'\n' span_id:99) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:100) 
          (Token
            id: Id.Lit_Chars
            val: '\techo two >file && git add file && git commit -m second &&\n'
            span_id: 101
          ) (Token id:Id.Lit_Chars val:'\ttwo=$(git rev-parse HEAD) &&\n' span_id:102) 
          (Token id:Id.Lit_Chars val:'\n' span_id:103) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:104) 
          (Token
            id: Id.Lit_Chars
            val: '\techo three >file && git add file && git commit -m third &&\n'
            span_id: 105
          ) (Token id:Id.Lit_Chars val:'\n' span_id:106) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:107) (Token id:Id.Lit_Chars val:'\techo A >file && git add file && git commit -m A &&\n' span_id:108) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:109) (Token id:Id.Lit_Chars val:'\tgit tag -a -m A A &&\n' span_id:110) 
          (Token id:Id.Lit_Chars val:'\n' span_id:111) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:112) 
          (Token
            id: Id.Lit_Chars
            val: '\techo c >file && git add file && git commit -m c &&\n'
            span_id: 113
          ) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:114) 
          (Token id:Id.Lit_Chars val:'\tgit tag c &&\n' span_id:115) (Token id:Id.Lit_Chars val:'\n' span_id:116) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard $two &&\n' span_id:117) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:118) 
          (Token
            id: Id.Lit_Chars
            val: '\techo B >side && git add side && git commit -m B &&\n'
            span_id: 119
          ) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:120) 
          (Token id:Id.Lit_Chars val:'\tgit tag -a -m B B &&\n' span_id:121) (Token id:Id.Lit_Chars val:'\n' span_id:122) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:123) (Token id:Id.Lit_Chars val:'\tgit merge -m Merged c &&\n' span_id:124) 
          (Token id:Id.Lit_Chars val:'\tmerged=$(git rev-parse HEAD) &&\n' span_id:125) (Token id:Id.Lit_Chars val:'\n' span_id:126) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard $two &&\n' span_id:127) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:128) 
          (Token
            id: Id.Lit_Chars
            val: '\techo D >another && git add another && git commit -m D &&\n'
            span_id: 129
          ) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\tgit tag -a -m D D &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:132) 
          (Token id:Id.Lit_Chars val:'\tgit tag -a -m R R &&\n' span_id:133) (Token id:Id.Lit_Chars val:'\n' span_id:134) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:135) (Token id:Id.Lit_Chars val:'\techo DD >another && git commit -a -m another &&\n' span_id:136) 
          (Token id:Id.Lit_Chars val:'\n' span_id:137) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:138) 
          (Token id:Id.Lit_Chars val:'\tgit tag e &&\n' span_id:139) (Token id:Id.Lit_Chars val:'\n' span_id:140) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:141) (Token id:Id.Lit_Chars val:'\techo DDD >another && git commit -a -m "yet another" &&\n' span_id:142) 
          (Token id:Id.Lit_Chars val:'\n' span_id:143) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:144) 
          (Token id:Id.Lit_Chars val:'\tgit merge -m Merged $merged &&\n' span_id:145) (Token id:Id.Lit_Chars val:'\n' span_id:146) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:147) (Token id:Id.Lit_Chars val:'\techo X >file && echo X >side && git add file side &&\n' span_id:148) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m x\n' span_id:149) (Token id:Id.Lit_Chars val:'\n' span_id:150)
        )
      }
    )
    (C {(check_describe)} {(A-) (Id.Lit_Star '*')} {(HEAD)})
    (C {(check_describe)} {(A-) (Id.Lit_Star '*')} {(HEAD) (Id.Lit_Other '^')})
    (C {(check_describe)} {(R-) (Id.Lit_Star '*')} {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^')})
    (C {(check_describe)} {(A-) (Id.Lit_Star '*')} {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^') (2)})
    (C {(check_describe)} {(B)} {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^') (2) (Id.Lit_Other '^')})
    (C {(check_describe)} {(R-) (Id.Lit_Star '*')} 
      {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^') (Id.Lit_Other '^')}
    )
    (C {(check_describe)} {(c-) (Id.Lit_Star '*')} {(--tags)} {(HEAD)})
    (C {(check_describe)} {(c-) (Id.Lit_Star '*')} {(--tags)} {(HEAD) (Id.Lit_Other '^')})
    (C {(check_describe)} {(e-) (Id.Lit_Star '*')} {(--tags)} 
      {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^')}
    )
    (C {(check_describe)} {(c-) (Id.Lit_Star '*')} {(--tags)} 
      {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^') (2)}
    )
    (C {(check_describe)} {(B)} {(--tags)} 
      {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^') (2) (Id.Lit_Other '^')}
    )
    (C {(check_describe)} {(e)} {(--tags)} 
      {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^') (Id.Lit_Other '^')}
    )
    (C {(check_describe)} {(heads/master)} {(--all)} {(HEAD)})
    (C {(check_describe)} {(tags/c-) (Id.Lit_Star '*')} {(--all)} {(HEAD) (Id.Lit_Other '^')})
    (C {(check_describe)} {(tags/e)} {(--all)} 
      {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^') (Id.Lit_Other '^')}
    )
    (C {(check_describe)} {(B-0-) (Id.Lit_Star '*')} {(--long)} 
      {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^') (2) (Id.Lit_Other '^')}
    )
    (C {(check_describe)} {(A-3-) (Id.Lit_Star '*')} {(--long)} 
      {(HEAD) (Id.Lit_Other '^') (Id.Lit_Other '^') (2)}
    )
    (C {(check_describe)} {(c-7-) (Id.Lit_Star '*')} {(--tags)})
    (C {(check_describe)} {(e-3-) (Id.Lit_Star '*')} {(--first-parent)} {(--tags)})
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'describe --contains defaults to HEAD without commit-ish'
            span_id: 351
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:355) 
          (Token id:Id.Lit_Chars val:'\techo "A^0" >expect &&\n' span_id:356) (Token id:Id.Lit_Chars val:'\tgit checkout A &&\n' span_id:357) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "git checkout -" &&\n'
            span_id: 358
          ) (Token id:Id.Lit_Chars val:'\tgit describe --contains >actual &&\n' span_id:359) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:360)
        )
      }
    )
    (command.Simple
      words: [{(Id.Lit_Other ':')}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:366)
          fd: -1
          arg_word: {(err.expect)}
        )
      ]
    )
    (C {(check_describe)} {(A)} {(--all)} {(A) (Id.Lit_Other '^') (0)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'no warning was displayed for A' span_id:382))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:386) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp err.expect err.actual\n' span_id:387)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rename tag A to Q locally' span_id:394))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:398) 
          (Token
            id: Id.Lit_Chars
            val: '\tmv .git/refs/tags/A .git/refs/tags/Q\n'
            span_id: 399
          )
        )
      }
    )
    (command.Simple
      words: [{(cat)} {(-)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:406)
          fd: -1
          arg_word: {(err.expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:409)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 414
          stdin_parts: [("warning: tag 'A' is really 'Q' here\n")]
        )
      ]
    )
    (C {(check_describe)} {(A-) (Id.Lit_Star '*')} {(HEAD)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'warning was displayed for Q' span_id:425))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:429) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ncmp err.expect err.actual\n' span_id:430)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'rename tag Q back to A' span_id:436))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:440) 
          (Token
            id: Id.Lit_Chars
            val: '\tmv .git/refs/tags/Q .git/refs/tags/A\n'
            span_id: 441
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pack tag refs' span_id:448))} 
      {(SQ (Token id:Id.Lit_Chars val:'git pack-refs' span_id:452))}
    )
    (C {(check_describe)} {(A-) (Id.Lit_Star '*')} {(HEAD)})
    (C {(check_describe)} {(DQ ('A-*[0-9a-f]'))} {(--dirty)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'set-up dirty work tree' span_id:475))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:479) 
          (Token id:Id.Lit_Chars val:'\techo >>file\n' span_id:480)
        )
      }
    )
    (C {(check_describe)} {(DQ ('A-*[0-9a-f]-dirty'))} {(--dirty)})
    (C {(check_describe)} {(DQ ('A-*[0-9a-f].mod'))} {(--dirty) (Id.Lit_Equals '=') (.mod)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'describe --dirty HEAD' span_id:507))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:511) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git describe --dirty HEAD\n'
            span_id: 512
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'set-up matching pattern tests' span_id:519))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:523) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit tag -a -m test-annotated test-annotated &&\n'
            span_id: 524
          ) (Token id:Id.Lit_Chars val:'\techo >>file &&\n' span_id:525) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:526) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "one more" &&\n' span_id:527) 
          (Token id:Id.Lit_Chars val:'\tgit tag test1-lightweight &&\n' span_id:528) (Token id:Id.Lit_Chars val:'\techo >>file &&\n' span_id:529) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:530) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "yet another" &&\n' span_id:531) 
          (Token id:Id.Lit_Chars val:'\tgit tag test2-lightweight &&\n' span_id:532) (Token id:Id.Lit_Chars val:'\techo >>file &&\n' span_id:533) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:534) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "even more"\n' span_id:535) 
          (Token id:Id.Lit_Chars val:'\n' span_id:536)
        )
      }
    )
    (C {(check_describe)} {(DQ ('test-annotated-*'))} {(--match) (Id.Lit_Equals '=') (DQ ('test-*'))})
    (C {(check_describe)} {(DQ ('test1-lightweight-*'))} {(--tags)} 
      {(--match) (Id.Lit_Equals '=') (DQ ('test1-*'))}
    )
    (C {(check_describe)} {(DQ ('test2-lightweight-*'))} {(--tags)} 
      {(--match) (Id.Lit_Equals '=') (DQ ('test2-*'))}
    )
    (C {(check_describe)} {(DQ ('test2-lightweight-*'))} {(--long)} {(--tags)} 
      {(--match) (Id.Lit_Equals '=') (DQ ('test2-*'))} {(HEAD) (Id.Lit_Other '^')}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'name-rev with exact tags' span_id:606))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:610) 
          (Token id:Id.Lit_Chars val:'\techo A >expect &&\n' span_id:611) (Token id:Id.Lit_Chars val:'\ttag_object=$(git rev-parse refs/tags/A) &&\n' span_id:612) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit name-rev --tags --name-only $tag_object >actual &&\n'
            span_id: 613
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:614) 
          (Token id:Id.Lit_Chars val:'\n' span_id:615) (Token id:Id.Lit_Chars val:'\techo "A^0" >expect &&\n' span_id:616) 
          (Token
            id: Id.Lit_Chars
            val: '\ttagged_commit=$(git rev-parse "refs/tags/A^0") &&\n'
            span_id: 617
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit name-rev --tags --name-only $tagged_commit >actual &&\n'
            span_id: 618
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:619)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'describe --contains with the exact tags' span_id:626))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:630) 
          (Token id:Id.Lit_Chars val:'\techo "A^0" >expect &&\n' span_id:631) (Token id:Id.Lit_Chars val:'\ttag_object=$(git rev-parse refs/tags/A) &&\n' span_id:632) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit describe --contains $tag_object >actual &&\n'
            span_id: 633
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:634) 
          (Token id:Id.Lit_Chars val:'\n' span_id:635) (Token id:Id.Lit_Chars val:'\techo "A^0" >expect &&\n' span_id:636) 
          (Token
            id: Id.Lit_Chars
            val: '\ttagged_commit=$(git rev-parse "refs/tags/A^0") &&\n'
            span_id: 637
          ) (Token id:Id.Lit_Chars val:'\tgit describe --contains $tagged_commit >actual &&\n' span_id:638) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:639)
        )
      }
    )
    (C {(test_done)})
  ]
)