(command.CommandList
  children: [
    (command.ShFunction
      name: test_proto
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:desc)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [24]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:proto)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [28]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:url)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$3')}
                  spids: [32]
                )
              ]
            )
            (C {(test_expect_success)} {(DQ ('clone ') ($ Id.VSub_Number '$1') (' (enabled)'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:46) 
                  (Token id:Id.Lit_Chars val:'\t\trm -rf tmp.git &&\n' span_id:47) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:48) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\tGIT_ALLOW_PROTOCOL=$proto &&\n'
                    span_id: 49
                  ) (Token id:Id.Lit_Chars val:'\t\t\texport GIT_ALLOW_PROTOCOL &&\n' span_id:50) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\tgit clone --bare "$url" tmp.git\n'
                    span_id: 51
                  ) (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:52) (Token id:Id.Lit_Chars val:'\t' span_id:53)
                )
              }
            )
            (C {(test_expect_success)} {(DQ ('fetch ') ($ Id.VSub_Number '$1') (' (enabled)'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:67) 
                  (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:68) (Token id:Id.Lit_Chars val:'\t\t\tcd tmp.git &&\n' span_id:69) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\tGIT_ALLOW_PROTOCOL=$proto &&\n'
                    span_id: 70
                  ) (Token id:Id.Lit_Chars val:'\t\t\texport GIT_ALLOW_PROTOCOL &&\n' span_id:71) 
                  (Token id:Id.Lit_Chars val:'\t\t\tgit fetch\n' span_id:72) (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:73) (Token id:Id.Lit_Chars val:'\t' span_id:74)
                )
              }
            )
            (C {(test_expect_success)} {(DQ ('push ') ($ Id.VSub_Number '$1') (' (enabled)'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:88) 
                  (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:89) (Token id:Id.Lit_Chars val:'\t\t\tcd tmp.git &&\n' span_id:90) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\tGIT_ALLOW_PROTOCOL=$proto &&\n'
                    span_id: 91
                  ) (Token id:Id.Lit_Chars val:'\t\t\texport GIT_ALLOW_PROTOCOL &&\n' span_id:92) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\tgit push origin HEAD:pushed\n'
                    span_id: 93
                  ) (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:94) (Token id:Id.Lit_Chars val:'\t' span_id:95)
                )
              }
            )
            (C {(test_expect_success)} {(DQ ('push ') ($ Id.VSub_Number '$1') (' (disabled)'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:109) 
                  (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:110) (Token id:Id.Lit_Chars val:'\t\t\tcd tmp.git &&\n' span_id:111) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\tGIT_ALLOW_PROTOCOL=none &&\n'
                    span_id: 112
                  ) (Token id:Id.Lit_Chars val:'\t\t\texport GIT_ALLOW_PROTOCOL &&\n' span_id:113) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\ttest_must_fail git push origin HEAD:pushed\n'
                    span_id: 114
                  ) (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:115) (Token id:Id.Lit_Chars val:'\t' span_id:116)
                )
              }
            )
            (C {(test_expect_success)} {(DQ ('fetch ') ($ Id.VSub_Number '$1') (' (disabled)'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:130) 
                  (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:131) (Token id:Id.Lit_Chars val:'\t\t\tcd tmp.git &&\n' span_id:132) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\tGIT_ALLOW_PROTOCOL=none &&\n'
                    span_id: 133
                  ) (Token id:Id.Lit_Chars val:'\t\t\texport GIT_ALLOW_PROTOCOL &&\n' span_id:134) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\ttest_must_fail git fetch\n'
                    span_id: 135
                  ) (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:136) (Token id:Id.Lit_Chars val:'\t' span_id:137)
                )
              }
            )
            (C {(test_expect_success)} {(DQ ('clone ') ($ Id.VSub_Number '$1') (' (disabled)'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:151) 
                  (Token id:Id.Lit_Chars val:'\t\trm -rf tmp.git &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:153) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\tGIT_ALLOW_PROTOCOL=none &&\n'
                    span_id: 154
                  ) (Token id:Id.Lit_Chars val:'\t\t\texport GIT_ALLOW_PROTOCOL &&\n' span_id:155) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\ttest_must_fail git clone --bare "$url" tmp.git\n'
                    span_id: 156
                  ) (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:157) (Token id:Id.Lit_Chars val:'\t' span_id:158)
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: setup_ssh_wrapper
      body: 
        (command.BraceGroup
          children: [
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:'setup ssh wrapper' span_id:181))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:185) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\twrite_script ssh-wrapper <<-\\EOF &&\n'
                    span_id: 186
                  ) (Token id:Id.Lit_Chars val:'\t\techo >&2 "ssh: $*"\n' span_id:187) 
                  (Token id:Id.Lit_Chars val:'\t\thost=$1; shift\n' span_id:188) (Token id:Id.Lit_Chars val:'\t\tcd "$TRASH_DIRECTORY/$host" &&\n' span_id:189) 
                  (Token id:Id.Lit_Chars val:'\t\teval "$*"\n' span_id:190) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:191) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tGIT_SSH="$PWD/ssh-wrapper" &&\n'
                    span_id: 192
                  ) (Token id:Id.Lit_Chars val:'\t\texport GIT_SSH &&\n' span_id:193) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\texport TRASH_DIRECTORY\n'
                    span_id: 194
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:195)
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: setup_ext_wrapper
      body: 
        (command.BraceGroup
          children: [
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:'setup ext wrapper' span_id:221))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:225) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\twrite_script fake-remote <<-\\EOF &&\n'
                    span_id: 226
                  ) (Token id:Id.Lit_Chars val:'\t\techo >&2 "fake-remote: $*"\n' span_id:227) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcd "$TRASH_DIRECTORY/remote" &&\n'
                    span_id: 228
                  ) (Token id:Id.Lit_Chars val:'\t\teval "$*"\n' span_id:229) 
                  (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:230) (Token id:Id.Lit_Chars val:'\t\tPATH=$TRASH_DIRECTORY:$PATH &&\n' span_id:231) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\texport TRASH_DIRECTORY\n'
                    span_id: 232
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:233)
                )
              }
            )
          ]
        )
    )
  ]
)