(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:'ext::cmd remote "connect" helper' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:19) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:20) (Token id:Id.Lit_Chars val:'\tgit commit --allow-empty -m initial &&\n' span_id:21) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:22) (Token id:Id.Lit_Chars val:'\tgit commit --allow-empty -m second &&\n' span_id:23) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\tgit commit --allow-empty -m third &&\n' span_id:25) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:26) (Token id:Id.Lit_Chars val:'\tgit tag -a -m "tip three" three &&\n' span_id:27) 
          (Token id:Id.Lit_Chars val:'\n' span_id:28) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:29) 
          (Token id:Id.Lit_Chars val:'\tgit commit --allow-empty -m fourth\n' span_id:30)
        )
      }
    )
    (C {(test_expect_success)} {(clone)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:39) 
          (Token
            id: Id.Lit_Chars
            val: '\tcmd=$(echo "echo >&2 ext::sh invoked && %S .." | sed -e "s/ /% /g") &&\n'
            span_id: 40
          ) (Token id:Id.Lit_Chars val:'\tgit clone "ext::sh -c %S% ." dst &&\n' span_id:41) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit for-each-ref refs/heads/ refs/tags/ >expect &&\n'
            span_id: 42
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:43) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:44) (Token id:Id.Lit_Chars val:'\t\tgit config remote.origin.url "ext::sh -c $cmd" &&\n' span_id:45) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit for-each-ref refs/heads/ refs/tags/\n'
            span_id: 46
          ) (Token id:Id.Lit_Chars val:'\t) >actual &&\n' span_id:47) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:48)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'update following tag' span_id:55))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:59) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:60) (Token id:Id.Lit_Chars val:'\tgit commit --allow-empty -m fifth &&\n' span_id:61) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:62) (Token id:Id.Lit_Chars val:'\tgit tag -a -m "tip five" five &&\n' span_id:63) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit for-each-ref refs/heads/ refs/tags/ >expect &&\n'
            span_id: 64
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:65) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:66) (Token id:Id.Lit_Chars val:'\t\tgit pull &&\n' span_id:67) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit for-each-ref refs/heads/ refs/tags/ >../actual\n'
            span_id: 68
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:69) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:70)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'update backfilled tag' span_id:77))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:81) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:82) (Token id:Id.Lit_Chars val:'\tgit commit --allow-empty -m sixth &&\n' span_id:83) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:84) (Token id:Id.Lit_Chars val:'\tgit tag -a -m "tip two" two three^1 &&\n' span_id:85) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit for-each-ref refs/heads/ refs/tags/ >expect &&\n'
            span_id: 86
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:87) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:88) (Token id:Id.Lit_Chars val:'\t\tgit pull &&\n' span_id:89) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit for-each-ref refs/heads/ refs/tags/ >../actual\n'
            span_id: 90
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:91) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:92)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'update backfilled tag without primary transfer' span_id:99))} 
      {
        (SQ (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:'\tgit tag -a -m "tip one " one two^1 &&\n' span_id:105) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit for-each-ref refs/heads/ refs/tags/ >expect &&\n'
            span_id: 106
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:107) 
          (Token id:Id.Lit_Chars val:'\t\tcd dst &&\n' span_id:108) (Token id:Id.Lit_Chars val:'\t\tgit pull &&\n' span_id:109) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit for-each-ref refs/heads/ refs/tags/ >../actual\n'
            span_id: 110
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:112)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'set up fake git-daemon' span_id:120))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:124) 
          (Token id:Id.Lit_Chars val:'\tmkdir remote &&\n' span_id:125) (Token id:Id.Lit_Chars val:'\tgit init --bare remote/one.git &&\n' span_id:126) 
          (Token id:Id.Lit_Chars val:'\tmkdir remote/host &&\n' span_id:127) (Token id:Id.Lit_Chars val:'\tgit init --bare remote/host/two.git &&\n' span_id:128) 
          (Token
            id: Id.Lit_Chars
            val: '\twrite_script fake-daemon <<-\\EOF &&\n'
            span_id: 129
          ) (Token id:Id.Lit_Chars val:'\tgit daemon --inetd \\\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\t\t--informative-errors \\\n' span_id:131) (Token id:Id.Lit_Chars val:'\t\t--export-all \\\n' span_id:132) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t--base-path="$TRASH_DIRECTORY/remote" \\\n'
            span_id: 133
          ) (Token id:Id.Lit_Chars val:'\t\t--interpolated-path="$TRASH_DIRECTORY/remote/%H%D" \\\n' span_id:134) 
          (Token id:Id.Lit_Chars val:'\t\t"$TRASH_DIRECTORY/remote"\n' span_id:135) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:136) 
          (Token id:Id.Lit_Chars val:'\texport TRASH_DIRECTORY &&\n' span_id:137) (Token id:Id.Lit_Chars val:'\tPATH=$TRASH_DIRECTORY:$PATH\n' span_id:138)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'ext command can connect to git daemon (no vhost)'
            span_id: 145
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:149) 
          (Token id:Id.Lit_Chars val:'\trm -rf dst &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\tgit clone "ext::fake-daemon %G/one.git" dst\n' span_id:151)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'ext command can connect to git daemon (vhost)' span_id:158))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:162) 
          (Token id:Id.Lit_Chars val:'\trm -rf dst &&\n' span_id:163) (Token id:Id.Lit_Chars val:'\tgit clone "ext::fake-daemon %G/two.git %Vhost" dst\n' span_id:164)
        )
      }
    )
    (C {(test_done)})
  ]
)