(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 automatic tag following' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:45) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:46) (Token id:Id.Lit_Chars val:'\techo ichi >file &&\n' span_id:47) 
          (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:48) (Token id:Id.Lit_Chars val:'\tgit commit -m L &&\n' span_id:49) 
          (Token id:Id.Lit_Chars val:'\tL=$(git rev-parse --verify HEAD) &&\n' span_id:50) (Token id:Id.Lit_Chars val:'\n' span_id:51) (Token id:Id.Lit_Chars val:'\t(\n' span_id:52) 
          (Token id:Id.Lit_Chars val:'\t\tmkdir cloned &&\n' span_id:53) (Token id:Id.Lit_Chars val:'\t\tcd cloned &&\n' span_id:54) 
          (Token id:Id.Lit_Chars val:'\t\tgit init-db &&\n' span_id:55) (Token id:Id.Lit_Chars val:'\t\tgit remote add -f origin ..\n' span_id:56) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:57) (Token id:Id.Lit_Chars val:'\n' span_id:58) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:59) 
          (Token id:Id.Lit_Chars val:'\techo A >file &&\n' span_id:60) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:61) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m A &&\n' span_id:62) (Token id:Id.Lit_Chars val:'\tA=$(git rev-parse --verify HEAD)\n' span_id:63)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:U)
          op: assign_op.Equal
          rhs: {(UPLOAD_LOG)}
          spids: [67]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:UPATH)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:72)
                  command_list: (command.CommandList children:[(C {(pwd)})])
                ) (/) ($ Id.VSub_DollarName '$U')
              )
            }
          spids: [70]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup expect' span_id:83))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:87) 
          (Token id:Id.Lit_Chars val:'cat - <<EOF >expect\n' span_id:88) (Token id:Id.Lit_Chars val:'want $A\n' span_id:89) (Token id:Id.Lit_Chars val:'EOF\n' span_id:90)
        )
      }
    )
    (command.ShFunction
      name: get_needs
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(test)} {(-s)} {(DQ ($ Id.VSub_Number '$1'))})
                (C {(perl)} {(-alne)} 
                  {
                    (SQ (Token id:Id.Lit_Chars val:'\n' span_id:118) 
                      (Token
                        id: Id.Lit_Chars
                        val: '\t\tnext unless $F[1] eq "upload-pack<";\n'
                        span_id: 119
                      ) (Token id:Id.Lit_Chars val:'\t\tlast if $F[2] eq "0000";\n' span_id:120) 
                      (Token
                        id: Id.Lit_Chars
                        val: '\t\tprint $F[2], " ", $F[3];\n'
                        span_id: 121
                      ) (Token id:Id.Lit_Chars val:'\t' span_id:122)
                    )
                  } {(DQ ($ Id.VSub_Number '$1'))}
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'fetch A (new commit : 1 connection)' span_id:135))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:139) 
          (Token id:Id.Lit_Chars val:'\trm -f $U &&\n' span_id:140) (Token id:Id.Lit_Chars val:'\t(\n' span_id:141) 
          (Token id:Id.Lit_Chars val:'\t\tcd cloned &&\n' span_id:142) (Token id:Id.Lit_Chars val:'\t\tGIT_TRACE_PACKET=$UPATH git fetch &&\n' span_id:143) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest $A = $(git rev-parse --verify origin/master)\n'
            span_id: 144
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:145) 
          (Token id:Id.Lit_Chars val:'\tget_needs $U >actual &&\n' span_id:146) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:147)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('create tag T on A, create C on branch cat'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'\tgit tag -a -m tag1 tag1 $A &&\n' span_id:159) (Token id:Id.Lit_Chars val:'\tT=$(git rev-parse --verify tag1) &&\n' span_id:160) 
          (Token id:Id.Lit_Chars val:'\n' span_id:161) (Token id:Id.Lit_Chars val:'\tgit checkout -b cat &&\n' span_id:162) 
          (Token id:Id.Lit_Chars val:'\techo C >file &&\n' span_id:163) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:164) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m C &&\n' span_id:165) (Token id:Id.Lit_Chars val:'\tC=$(git rev-parse --verify HEAD) &&\n' span_id:166) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master\n' span_id:167)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup expect' span_id:174))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:178) 
          (Token id:Id.Lit_Chars val:'cat - <<EOF >expect\n' span_id:179) (Token id:Id.Lit_Chars val:'want $C\n' span_id:180) 
          (Token id:Id.Lit_Chars val:'want $T\n' span_id:181) (Token id:Id.Lit_Chars val:'EOF\n' span_id:182)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'fetch C, T (new branch, tag : 1 connection)' span_id:189))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:193) 
          (Token id:Id.Lit_Chars val:'\trm -f $U &&\n' span_id:194) (Token id:Id.Lit_Chars val:'\t(\n' span_id:195) 
          (Token id:Id.Lit_Chars val:'\t\tcd cloned &&\n' span_id:196) (Token id:Id.Lit_Chars val:'\t\tGIT_TRACE_PACKET=$UPATH git fetch &&\n' span_id:197) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest $C = $(git rev-parse --verify origin/cat) &&\n'
            span_id: 198
          ) (Token id:Id.Lit_Chars val:'\t\ttest $T = $(git rev-parse --verify tag1) &&\n' span_id:199) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest $A = $(git rev-parse --verify tag1^0)\n'
            span_id: 200
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:201) 
          (Token id:Id.Lit_Chars val:'\tget_needs $U >actual &&\n' span_id:202) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:203)
        )
      }
    )
    (C {(test_expect_success)} {(DQ ('create commits O, B, tag S on B'))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:214) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:215) (Token id:Id.Lit_Chars val:'\techo O >file &&\n' span_id:216) 
          (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:217) (Token id:Id.Lit_Chars val:'\tgit commit -m O &&\n' span_id:218) 
          (Token id:Id.Lit_Chars val:'\n' span_id:219) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:220) 
          (Token id:Id.Lit_Chars val:'\techo B >file &&\n' span_id:221) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:222) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m B &&\n' span_id:223) (Token id:Id.Lit_Chars val:'\tB=$(git rev-parse --verify HEAD) &&\n' span_id:224) 
          (Token id:Id.Lit_Chars val:'\n' span_id:225) (Token id:Id.Lit_Chars val:'\tgit tag -a -m tag2 tag2 $B &&\n' span_id:226) 
          (Token id:Id.Lit_Chars val:'\tS=$(git rev-parse --verify tag2)\n' span_id:227)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup expect' span_id:234))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:238) 
          (Token id:Id.Lit_Chars val:'cat - <<EOF >expect\n' span_id:239) (Token id:Id.Lit_Chars val:'want $B\n' span_id:240) 
          (Token id:Id.Lit_Chars val:'want $S\n' span_id:241) (Token id:Id.Lit_Chars val:'EOF\n' span_id:242)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'fetch B, S (commit and tag : 1 connection)' span_id:249))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:253) 
          (Token id:Id.Lit_Chars val:'\trm -f $U &&\n' span_id:254) (Token id:Id.Lit_Chars val:'\t(\n' span_id:255) 
          (Token id:Id.Lit_Chars val:'\t\tcd cloned &&\n' span_id:256) (Token id:Id.Lit_Chars val:'\t\tGIT_TRACE_PACKET=$UPATH git fetch &&\n' span_id:257) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest $B = $(git rev-parse --verify origin/master) &&\n'
            span_id: 258
          ) (Token id:Id.Lit_Chars val:'\t\ttest $B = $(git rev-parse --verify tag2^0) &&\n' span_id:259) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest $S = $(git rev-parse --verify tag2)\n'
            span_id: 260
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:261) 
          (Token id:Id.Lit_Chars val:'\tget_needs $U >actual &&\n' span_id:262) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:263)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup expect' span_id:270))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:274) 
          (Token id:Id.Lit_Chars val:'cat - <<EOF >expect\n' span_id:275) (Token id:Id.Lit_Chars val:'want $B\n' span_id:276) 
          (Token id:Id.Lit_Chars val:'want $S\n' span_id:277) (Token id:Id.Lit_Chars val:'EOF\n' span_id:278)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'new clone fetch master and tags' span_id:285))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:289) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_might_fail git branch -D cat &&\n'
            span_id: 290
          ) (Token id:Id.Lit_Chars val:'\trm -f $U &&\n' span_id:291) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:292) (Token id:Id.Lit_Chars val:'\t\tmkdir clone2 &&\n' span_id:293) 
          (Token id:Id.Lit_Chars val:'\t\tcd clone2 &&\n' span_id:294) (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:295) 
          (Token id:Id.Lit_Chars val:'\t\tgit remote add origin .. &&\n' span_id:296) (Token id:Id.Lit_Chars val:'\t\tGIT_TRACE_PACKET=$UPATH git fetch &&\n' span_id:297) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest $B = $(git rev-parse --verify origin/master) &&\n'
            span_id: 298
          ) (Token id:Id.Lit_Chars val:'\t\ttest $S = $(git rev-parse --verify tag2) &&\n' span_id:299) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest $B = $(git rev-parse --verify tag2^0) &&\n'
            span_id: 300
          ) (Token id:Id.Lit_Chars val:'\t\ttest $T = $(git rev-parse --verify tag1) &&\n' span_id:301) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest $A = $(git rev-parse --verify tag1^0)\n'
            span_id: 302
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:303) 
          (Token id:Id.Lit_Chars val:'\tget_needs $U >actual &&\n' span_id:304) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:305)
        )
      }
    )
    (C {(test_done)})
  ]
)