(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'test automatic tag following'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<test_expect_success>} {<setup>} 
      {
        (SQ <'\n'> <'\ttest_tick &&\n'> <'\techo ichi >file &&\n'> <'\tgit add file &&\n'> 
          <'\tgit commit -m L &&\n'> <'\tL=$(git rev-parse --verify HEAD) &&\n'> <'\n'> <'\t(\n'> <'\t\tmkdir cloned &&\n'> 
          <'\t\tcd cloned &&\n'> <'\t\tgit init-db &&\n'> <'\t\tgit remote add -f origin ..\n'> <'\t) &&\n'> <'\n'> <'\ttest_tick &&\n'> 
          <'\techo A >file &&\n'> <'\tgit add file &&\n'> <'\tgit commit -m A &&\n'> <'\tA=$(git rev-parse --verify HEAD)\n'>
        )
      }
    )
    (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:<Id.Left_DollarParen '$('> child:(C {<pwd>})) <'/'> 
                ($ Id.VSub_DollarName '$U')
              )
            }
          spids: [70]
        )
      ]
    )
    (C {<test_expect_success>} {(SQ <'setup expect'>)} 
      {(SQ <'\n'> <'cat - <<EOF >expect\n'> <'want $A\n'> <'EOF\n'>)}
    )
    (command.ShFunction
      name: get_needs
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<test>} {<-s>} {(DQ ($ Id.VSub_Number '$1'))})
                (C {<perl>} {<-alne>} 
                  {
                    (SQ <'\n'> <'\t\tnext unless $F[1] eq "upload-pack<";\n'> 
                      <'\t\tlast if $F[2] eq "0000";\n'> <'\t\tprint $F[2], " ", $F[3];\n'> <'\t'>
                    )
                  } {(DQ ($ Id.VSub_Number '$1'))}
                )
              ]
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'fetch A (new commit : 1 connection)'>)} 
      {
        (SQ <'\n'> <'\trm -f $U &&\n'> <'\t(\n'> <'\t\tcd cloned &&\n'> 
          <'\t\tGIT_TRACE_PACKET=$UPATH git fetch &&\n'> <'\t\ttest $A = $(git rev-parse --verify origin/master)\n'> <'\t) &&\n'> 
          <'\tget_needs $U >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'create tag T on A, create C on branch cat'>)} 
      {
        (SQ <'\n'> <'\tgit tag -a -m tag1 tag1 $A &&\n'> <'\tT=$(git rev-parse --verify tag1) &&\n'> 
          <'\n'> <'\tgit checkout -b cat &&\n'> <'\techo C >file &&\n'> <'\tgit add file &&\n'> 
          <'\tgit commit -m C &&\n'> <'\tC=$(git rev-parse --verify HEAD) &&\n'> <'\tgit checkout master\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'setup expect'>)} 
      {(SQ <'\n'> <'cat - <<EOF >expect\n'> <'want $C\n'> <'want $T\n'> <'EOF\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'fetch C, T (new branch, tag : 1 connection)'>)} 
      {
        (SQ <'\n'> <'\trm -f $U &&\n'> <'\t(\n'> <'\t\tcd cloned &&\n'> 
          <'\t\tGIT_TRACE_PACKET=$UPATH git fetch &&\n'> <'\t\ttest $C = $(git rev-parse --verify origin/cat) &&\n'> 
          <'\t\ttest $T = $(git rev-parse --verify tag1) &&\n'> <'\t\ttest $A = $(git rev-parse --verify tag1^0)\n'> <'\t) &&\n'> <'\tget_needs $U >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {(DQ <'create commits O, B, tag S on B'>)} 
      {
        (SQ <'\n'> <'\ttest_tick &&\n'> <'\techo O >file &&\n'> <'\tgit add file &&\n'> 
          <'\tgit commit -m O &&\n'> <'\n'> <'\ttest_tick &&\n'> <'\techo B >file &&\n'> <'\tgit add file &&\n'> <'\tgit commit -m B &&\n'> 
          <'\tB=$(git rev-parse --verify HEAD) &&\n'> <'\n'> <'\tgit tag -a -m tag2 tag2 $B &&\n'> <'\tS=$(git rev-parse --verify tag2)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'setup expect'>)} 
      {(SQ <'\n'> <'cat - <<EOF >expect\n'> <'want $B\n'> <'want $S\n'> <'EOF\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'fetch B, S (commit and tag : 1 connection)'>)} 
      {
        (SQ <'\n'> <'\trm -f $U &&\n'> <'\t(\n'> <'\t\tcd cloned &&\n'> 
          <'\t\tGIT_TRACE_PACKET=$UPATH git fetch &&\n'> <'\t\ttest $B = $(git rev-parse --verify origin/master) &&\n'> 
          <'\t\ttest $B = $(git rev-parse --verify tag2^0) &&\n'> <'\t\ttest $S = $(git rev-parse --verify tag2)\n'> <'\t) &&\n'> <'\tget_needs $U >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'setup expect'>)} 
      {(SQ <'\n'> <'cat - <<EOF >expect\n'> <'want $B\n'> <'want $S\n'> <'EOF\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'new clone fetch master and tags'>)} 
      {
        (SQ <'\n'> <'\ttest_might_fail git branch -D cat &&\n'> <'\trm -f $U &&\n'> <'\t(\n'> 
          <'\t\tmkdir clone2 &&\n'> <'\t\tcd clone2 &&\n'> <'\t\tgit init &&\n'> <'\t\tgit remote add origin .. &&\n'> 
          <'\t\tGIT_TRACE_PACKET=$UPATH git fetch &&\n'> <'\t\ttest $B = $(git rev-parse --verify origin/master) &&\n'> 
          <'\t\ttest $S = $(git rev-parse --verify tag2) &&\n'> <'\t\ttest $B = $(git rev-parse --verify tag2^0) &&\n'> 
          <'\t\ttest $T = $(git rev-parse --verify tag1) &&\n'> <'\t\ttest $A = $(git rev-parse --verify tag1^0)\n'> <'\t) &&\n'> <'\tget_needs $U >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)