(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 WebDAV http-push\n' span_id:15) 
                (Token id:Id.Lit_Chars val:'\n' span_id:16) (Token id:Id.Lit_Chars val:'This test runs various sanity checks on http-push.' span_id:17)
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.AndOr
              ops: [Id.Op_DPipe]
              children: [
                (command.Simple
                  words: [{(git)} {(http-push)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:32)
                      fd: -1
                      arg_word: {(/dev/null)}
                    )
                    (redir.Redir
                      op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:36)
                      fd: 2
                      arg_word: {(1)}
                    )
                  ]
                )
                (C {(Id.Lit_LBracket '[')} {($ Id.VSub_QMark '$?')} {(-eq)} {(128)} 
                  {(Id.Lit_RBracket ']')}
                )
              ]
            )
          ]
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:skip_all)
                  op: assign_op.Equal
                  rhs: {(DQ ('skipping test, USE_CURL_MULTI is not defined'))}
                  spids: [54]
                )
              ]
            )
            (C {(test_done)})
          ]
          spids: [26 51]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:LIB_HTTPD_DAV)
          op: assign_op.Equal
          rhs: {(t)}
          spids: [65]
        )
      ]
    )
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/lib-httpd.sh)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ROOT_PATH)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$PWD'))}
          spids: [75]
        )
      ]
    )
    (C {(start_httpd)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup remote repository' span_id:86))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:90) 
          (Token id:Id.Lit_Chars val:'\tcd "$ROOT_PATH" &&\n' span_id:91) (Token id:Id.Lit_Chars val:'\tmkdir test_repo &&\n' span_id:92) 
          (Token id:Id.Lit_Chars val:'\tcd test_repo &&\n' span_id:93) (Token id:Id.Lit_Chars val:'\tgit init &&\n' span_id:94) 
          (Token id:Id.Lit_Chars val:'\t: >path1 &&\n' span_id:95) (Token id:Id.Lit_Chars val:'\tgit add path1 &&\n' span_id:96) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:97) (Token id:Id.Lit_Chars val:'\tgit commit -m initial &&\n' span_id:98) 
          (Token id:Id.Lit_Chars val:'\tcd - &&\n' span_id:99) (Token id:Id.Lit_Chars val:'\tgit clone --bare test_repo test_repo.git &&\n' span_id:100) 
          (Token id:Id.Lit_Chars val:'\tcd test_repo.git &&\n' span_id:101) (Token id:Id.Lit_Chars val:'\tgit --bare update-server-info &&\n' span_id:102) 
          (Token
            id: Id.Lit_Chars
            val: '\tmv hooks/post-update.sample hooks/post-update &&\n'
            span_id: 103
          ) (Token id:Id.Lit_Chars val:'\tORIG_HEAD=$(git rev-parse --verify HEAD) &&\n' span_id:104) 
          (Token id:Id.Lit_Chars val:'\tcd - &&\n' span_id:105) (Token id:Id.Lit_Chars val:'\tmv test_repo.git "$HTTPD_DOCUMENT_ROOT_PATH"\n' span_id:106)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'create password-protected repository' span_id:113))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:117) 
          (Token
            id: Id.Lit_Chars
            val: '\tmkdir -p "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb" &&\n'
            span_id: 118
          ) (Token id:Id.Lit_Chars val:'\tcp -Rf "$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \\\n' span_id:119) 
          (Token
            id: Id.Lit_Chars
            val: '\t       "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/test_repo.git"\n'
            span_id: 120
          )
        )
      }
    )
    (C {(setup_askpass_helper)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'clone remote repository' span_id:130))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:134) 
          (Token id:Id.Lit_Chars val:'\tcd "$ROOT_PATH" &&\n' span_id:135) (Token id:Id.Lit_Chars val:'\tgit clone $HTTPD_URL/dumb/test_repo.git test_repo_clone\n' span_id:136)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'push to remote repository with packed refs' span_id:143))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:147) 
          (Token id:Id.Lit_Chars val:'\tcd "$ROOT_PATH"/test_repo_clone &&\n' span_id:148) (Token id:Id.Lit_Chars val:'\t: >path2 &&\n' span_id:149) 
          (Token id:Id.Lit_Chars val:'\tgit add path2 &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:151) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m path2 &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\tHEAD=$(git rev-parse --verify HEAD) &&\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\tgit push &&\n' span_id:154) (Token id:Id.Lit_Chars val:'\t(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&\n' span_id:155) 
          (Token
            id: Id.Lit_Chars
            val: '\t test $HEAD = $(git rev-parse --verify HEAD))\n'
            span_id: 156
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'push already up-to-date' span_id:163))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:167) 
          (Token id:Id.Lit_Chars val:'\tgit push\n' span_id:168)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'push to remote repository with unpacked refs' span_id:175))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:179) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&\n'
            span_id: 180
          ) (Token id:Id.Lit_Chars val:'\t rm packed-refs &&\n' span_id:181) 
          (Token
            id: Id.Lit_Chars
            val: '\t git update-ref refs/heads/master $ORIG_HEAD &&\n'
            span_id: 182
          ) (Token id:Id.Lit_Chars val:'\t git --bare update-server-info) &&\n' span_id:183) 
          (Token id:Id.Lit_Chars val:'\tgit push &&\n' span_id:184) (Token id:Id.Lit_Chars val:'\t(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git &&\n' span_id:185) 
          (Token
            id: Id.Lit_Chars
            val: '\t test $HEAD = $(git rev-parse --verify HEAD))\n'
            span_id: 186
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'http-push fetches unpacked objects' span_id:193))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:197) 
          (Token
            id: Id.Lit_Chars
            val: '\tcp -R "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \\\n'
            span_id: 198
          ) (Token id:Id.Lit_Chars val:'\t\t"$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_unpacked.git &&\n' span_id:199) 
          (Token id:Id.Lit_Chars val:'\n' span_id:200) (Token id:Id.Lit_Chars val:'\tgit clone $HTTPD_URL/dumb/test_repo_unpacked.git \\\n' span_id:201) 
          (Token id:Id.Lit_Chars val:'\t\t"$ROOT_PATH"/fetch_unpacked &&\n' span_id:202) (Token id:Id.Lit_Chars val:'\n' span_id:203) 
          (Token
            id: Id.Lit_Chars
            val: '\t# By reset, we force git to retrieve the object\n'
            span_id: 204
          ) (Token id:Id.Lit_Chars val:'\t(cd "$ROOT_PATH"/fetch_unpacked &&\n' span_id:205) 
          (Token id:Id.Lit_Chars val:'\t git reset --hard HEAD^ &&\n' span_id:206) (Token id:Id.Lit_Chars val:'\t git remote rm origin &&\n' span_id:207) 
          (Token
            id: Id.Lit_Chars
            val: '\t git reflog expire --expire=0 --all &&\n'
            span_id: 208
          ) (Token id:Id.Lit_Chars val:'\t git prune &&\n' span_id:209) 
          (Token
            id: Id.Lit_Chars
            val: '\t git push -f -v $HTTPD_URL/dumb/test_repo_unpacked.git master)\n'
            span_id: 210
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'http-push fetches packed objects' span_id:217))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:221) 
          (Token
            id: Id.Lit_Chars
            val: '\tcp -R "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo.git \\\n'
            span_id: 222
          ) (Token id:Id.Lit_Chars val:'\t\t"$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_packed.git &&\n' span_id:223) 
          (Token id:Id.Lit_Chars val:'\n' span_id:224) (Token id:Id.Lit_Chars val:'\tgit clone $HTTPD_URL/dumb/test_repo_packed.git \\\n' span_id:225) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t"$ROOT_PATH"/test_repo_clone_packed &&\n'
            span_id: 226
          ) (Token id:Id.Lit_Chars val:'\n' span_id:227) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd "$HTTPD_DOCUMENT_ROOT_PATH"/test_repo_packed.git &&\n'
            span_id: 228
          ) (Token id:Id.Lit_Chars val:'\t git --bare repack &&\n' span_id:229) 
          (Token id:Id.Lit_Chars val:'\t git --bare prune-packed) &&\n' span_id:230) (Token id:Id.Lit_Chars val:'\n' span_id:231) 
          (Token
            id: Id.Lit_Chars
            val: '\t# By reset, we force git to retrieve the packed object\n'
            span_id: 232
          ) (Token id:Id.Lit_Chars val:'\t(cd "$ROOT_PATH"/test_repo_clone_packed &&\n' span_id:233) 
          (Token id:Id.Lit_Chars val:'\t git reset --hard HEAD^ &&\n' span_id:234) (Token id:Id.Lit_Chars val:'\t git remote remove origin &&\n' span_id:235) 
          (Token
            id: Id.Lit_Chars
            val: '\t git reflog expire --expire=0 --all &&\n'
            span_id: 236
          ) (Token id:Id.Lit_Chars val:'\t git prune &&\n' span_id:237) 
          (Token
            id: Id.Lit_Chars
            val: '\t git push -f -v $HTTPD_URL/dumb/test_repo_packed.git master)\n'
            span_id: 238
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'create and delete remote branch' span_id:245))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:249) 
          (Token id:Id.Lit_Chars val:'\tcd "$ROOT_PATH"/test_repo_clone &&\n' span_id:250) (Token id:Id.Lit_Chars val:'\tgit checkout -b dev &&\n' span_id:251) 
          (Token id:Id.Lit_Chars val:'\t: >path3 &&\n' span_id:252) (Token id:Id.Lit_Chars val:'\tgit add path3 &&\n' span_id:253) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:254) (Token id:Id.Lit_Chars val:'\tgit commit -m dev &&\n' span_id:255) 
          (Token id:Id.Lit_Chars val:'\tgit push origin dev &&\n' span_id:256) (Token id:Id.Lit_Chars val:'\tgit push origin :dev &&\n' span_id:257) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git show-ref --verify refs/remotes/origin/dev\n'
            span_id: 258
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'MKCOL sends directory names with trailing slashes'
            span_id: 265
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:269) (Token id:Id.Lit_Chars val:'\n' span_id:270) 
          (Token
            id: Id.Lit_Chars
            val: '\t! grep "\\"MKCOL.*[^/] HTTP/[^ ]*\\"" < "$HTTPD_ROOT_PATH"/access.log\n'
            span_id: 271
          ) (Token id:Id.Lit_Chars val:'\n' span_id:272)
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:x1)
          op: assign_op.Equal
          rhs: {(DQ ('[0-9a-f]'))}
          spids: [276]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:x2)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$x1') ($ Id.VSub_DollarName '$x1'))}
          spids: [281]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:x5)
          op: assign_op.Equal
          rhs: 
            {
              (DQ ($ Id.VSub_DollarName '$x1') ($ Id.VSub_DollarName '$x1') 
                ($ Id.VSub_DollarName '$x1') ($ Id.VSub_DollarName '$x1') ($ Id.VSub_DollarName '$x1')
              )
            }
          spids: [287]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:x38)
          op: assign_op.Equal
          rhs: 
            {
              (DQ ($ Id.VSub_DollarName '$x5') ($ Id.VSub_DollarName '$x5') 
                ($ Id.VSub_DollarName '$x5') ($ Id.VSub_DollarName '$x5') ($ Id.VSub_DollarName '$x5') ($ Id.VSub_DollarName '$x5') 
                ($ Id.VSub_DollarName '$x5') ($ Id.VSub_DollarName '$x1') ($ Id.VSub_DollarName '$x1') ($ Id.VSub_DollarName '$x1')
              )
            }
          spids: [296]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:x40)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$x38') ($ Id.VSub_DollarName '$x2'))}
          spids: [310]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'PUT and MOVE sends object to URLs with SHA-1 hash suffix'
            span_id: 320
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:324) 
          (Token id:Id.Lit_Chars val:'\tsed \\\n' span_id:325) (Token id:Id.Lit_Chars val:'\t\t-e "s/PUT /OP /" \\\n' span_id:326) 
          (Token id:Id.Lit_Chars val:'\t\t-e "s/MOVE /OP /" \\\n' span_id:327) 
          (Token
            id: Id.Lit_Chars
            val: '\t    -e "s|/objects/$x2/${x38}_$x40|WANTED_PATH_REQUEST|" \\\n'
            span_id: 328
          ) (Token id:Id.Lit_Chars val:'\t\t"$HTTPD_ROOT_PATH"/access.log |\n' span_id:329) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep -e "\\"OP .*WANTED_PATH_REQUEST HTTP/[.0-9]*\\" 20[0-9] "\n'
            span_id: 330
          ) (Token id:Id.Lit_Chars val:'\n' span_id:331)
        )
      }
    )
    (C {(test_http_push_nonff)} 
      {(DQ ($ Id.VSub_DollarName '$HTTPD_DOCUMENT_ROOT_PATH')) (/test_repo.git)} {(DQ ($ Id.VSub_DollarName '$ROOT_PATH')) (/test_repo_clone)} {(master)}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'push to password-protected repository (user in URL)'
            span_id: 355
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:359) 
          (Token id:Id.Lit_Chars val:'\ttest_commit pw-user &&\n' span_id:360) (Token id:Id.Lit_Chars val:'\tset_askpass user@host pass@host &&\n' span_id:361) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit push "$HTTPD_URL_USER/auth/dumb/test_repo.git" HEAD &&\n'
            span_id: 362
          ) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify HEAD >expect &&\n' span_id:363) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/test_repo.git" \\\n'
            span_id: 364
          ) (Token id:Id.Lit_Chars val:'\t\trev-parse --verify HEAD >actual &&\n' span_id:365) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:366)
        )
      }
    )
    (C {(test_expect_failure)} 
      {(SQ (Token id:Id.Lit_Chars val:'user was prompted only once for password' span_id:373))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:377) 
          (Token id:Id.Lit_Chars val:'\texpect_askpass pass user@host\n' span_id:378)
        )
      }
    )
    (C {(test_expect_failure)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'push to password-protected repository (no user in URL)'
            span_id: 385
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:389) 
          (Token id:Id.Lit_Chars val:'\ttest_commit pw-nouser &&\n' span_id:390) (Token id:Id.Lit_Chars val:'\tset_askpass user@host pass@host &&\n' span_id:391) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit push "$HTTPD_URL/auth/dumb/test_repo.git" HEAD &&\n'
            span_id: 392
          ) (Token id:Id.Lit_Chars val:'\texpect_askpass both user@host &&\n' span_id:393) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit rev-parse --verify HEAD >expect &&\n'
            span_id: 394
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/test_repo.git" \\\n'
            span_id: 395
          ) (Token id:Id.Lit_Chars val:'\t\trev-parse --verify HEAD >actual &&\n' span_id:396) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:397)
        )
      }
    )
    (C {(stop_httpd)})
    (C {(test_done)})
  ]
)