(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'test dumb fetching over http via static file'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<.>} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) <'/lib-httpd.sh'>})
    (C {<start_httpd>})
    (C {<test_expect_success>} {(SQ <'setup repository'>)} 
      {
        (SQ <'\n'> <'\tgit config push.default matching &&\n'> <'\techo content1 >file &&\n'> 
          <'\tgit add file &&\n'> <'\tgit commit -m one &&\n'> <'\techo content2 >file &&\n'> <'\tgit add file &&\n'> 
          <'\tgit commit -m two\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'create http-accessible bare repository with loose objects'>)} 
      {
        (SQ <'\n'> <'\tcp -R .git "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&\n'> 
          <'\t(cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&\n'> <'\t git config core.bare true &&\n'> <'\t mkdir -p hooks &&\n'> 
          <'\t echo "exec git update-server-info" >hooks/post-update &&\n'> <'\t chmod +x hooks/post-update &&\n'> <'\t hooks/post-update\n'> <'\t) &&\n'> 
          <'\tgit remote add public "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&\n'> <'\tgit push public master:master\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'clone http repository'>)} 
      {
        (SQ <'\n'> <'\tgit clone $HTTPD_URL/dumb/repo.git clone-tmpl &&\n'> 
          <'\tcp -R clone-tmpl clone &&\n'> <'\ttest_cmp file clone/file\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'create password-protected repository'>)} 
      {
        (SQ <'\n'> <'\tmkdir -p "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/" &&\n'> 
          <'\tcp -Rf "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \\\n'> <'\t       "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/repo.git"\n'>
        )
      }
    )
    (C {<setup_askpass_helper>})
    (C {<test_expect_success>} {(SQ <'cloning password-protected repository can fail'>)} 
      {
        (SQ <'\n'> <'\tset_askpass wrong &&\n'> 
          <'\ttest_must_fail git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-fail &&\n'> <'\texpect_askpass both wrong\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'http auth can use user/pass in URL'>)} 
      {
        (SQ <'\n'> <'\tset_askpass wrong &&\n'> 
          <'\tgit clone "$HTTPD_URL_USER_PASS/auth/dumb/repo.git" clone-auth-none &&\n'> <'\texpect_askpass none\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'http auth can use just user in URL'>)} 
      {
        (SQ <'\n'> <'\tset_askpass wrong pass@host &&\n'> 
          <'\tgit clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-pass &&\n'> <'\texpect_askpass pass user@host\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'http auth can request both user and pass'>)} 
      {
        (SQ <'\n'> <'\tset_askpass user@host pass@host &&\n'> 
          <'\tgit clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-both &&\n'> <'\texpect_askpass both user@host\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'http auth respects credential helper config'>)} 
      {
        (SQ <'\n'> <'\ttest_config_global credential.helper "!f() {\n'> <'\t\tcat >/dev/null\n'> 
          <'\t\techo username=user@host\n'> <'\t\techo password=pass@host\n'> <'\t}; f" &&\n'> <'\tset_askpass wrong &&\n'> 
          <'\tgit clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-helper &&\n'> <'\texpect_askpass none\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'http auth can get username from config'>)} 
      {
        (SQ <'\n'> <'\ttest_config_global "credential.$HTTPD_URL.username" user@host &&\n'> 
          <'\tset_askpass wrong pass@host &&\n'> <'\tgit clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-user &&\n'> 
          <'\texpect_askpass pass user@host\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'configured username does not override URL'>)} 
      {
        (SQ <'\n'> <'\ttest_config_global "credential.$HTTPD_URL.username" wrong &&\n'> 
          <'\tset_askpass wrong pass@host &&\n'> <'\tgit clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-user2 &&\n'> 
          <'\texpect_askpass pass user@host\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'set up repo with http submodules'>)} 
      {
        (SQ <'\n'> <'\tgit init super &&\n'> <'\tset_askpass user@host pass@host &&\n'> <'\t(\n'> 
          <'\t\tcd super &&\n'> <'\t\tgit submodule add "$HTTPD_URL/auth/dumb/repo.git" sub &&\n'> 
          <'\t\tgit commit -m "add submodule"\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cmdline credential config passes to submodule via clone'>)} 
      {
        (SQ <'\n'> <'\tset_askpass wrong pass@host &&\n'> 
          <'\ttest_must_fail git clone --recursive super super-clone &&\n'> <'\trm -rf super-clone &&\n'> <'\n'> <'\tset_askpass wrong pass@host &&\n'> 
          <'\tgit -c "credential.$HTTPD_URL.username=user@host" \\\n'> <'\t\tclone --recursive super super-clone &&\n'> <'\texpect_askpass pass user@host\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cmdline credential config passes submodule via fetch'>)} 
      {
        (SQ <'\n'> <'\tset_askpass wrong pass@host &&\n'> 
          <'\ttest_must_fail git -C super-clone fetch --recurse-submodules &&\n'> <'\n'> <'\tset_askpass wrong pass@host &&\n'> <'\tgit -C super-clone \\\n'> 
          <'\t    -c "credential.$HTTPD_URL.username=user@host" \\\n'> <'\t    fetch --recurse-submodules &&\n'> <'\texpect_askpass pass user@host\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cmdline credential config passes submodule update'>)} 
      {
        (SQ <'\n'> <'\t# advance the submodule HEAD so that a fetch is required\n'> 
          <'\tgit commit --allow-empty -m foo &&\n'> <'\tgit push "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/repo.git" HEAD &&\n'> 
          <'\tsha1=$(git rev-parse HEAD) &&\n'> <'\tgit -C super-clone update-index --cacheinfo 160000,$sha1,sub &&\n'> <'\n'> 
          <'\tset_askpass wrong pass@host &&\n'> <'\ttest_must_fail git -C super-clone submodule update &&\n'> <'\n'> 
          <'\tset_askpass wrong pass@host &&\n'> <'\tgit -C super-clone \\\n'> <'\t    -c "credential.$HTTPD_URL.username=user@host" \\\n'> 
          <'\t    submodule update &&\n'> <'\texpect_askpass pass user@host\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'fetch changes via http'>)} 
      {
        (SQ <'\n'> <'\techo content >>file &&\n'> <'\tgit commit -a -m two &&\n'> 
          <'\tgit push public &&\n'> <'\t(cd clone && git pull) &&\n'> <'\ttest_cmp file clone/file\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'fetch changes via manual http-fetch'>)} 
      {
        (SQ <'\n'> <'\tcp -R clone-tmpl clone2 &&\n'> <'\n'> 
          <'\tHEAD=$(git rev-parse --verify HEAD) &&\n'> <'\t(cd clone2 &&\n'> 
          <'\t git http-fetch -a -w heads/master-new $HEAD $(git config remote.origin.url) &&\n'> <'\t git checkout master-new &&\n'> <'\t test $HEAD = $(git rev-parse --verify HEAD)) &&\n'> 
          <'\ttest_cmp file clone2/file\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'http remote detects correct HEAD'>)} 
      {
        (SQ <'\n'> <'\tgit push public master:other &&\n'> <'\t(cd clone &&\n'> 
          <'\t git remote set-head origin -d &&\n'> <'\t git remote set-head origin -a &&\n'> 
          <'\t git symbolic-ref refs/remotes/origin/HEAD > output &&\n'> <'\t echo refs/remotes/origin/master > expect &&\n'> <'\t test_cmp expect output\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'fetch packed objects'>)} 
      {
        (SQ <'\n'> 
          <
'\tcp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git &&\n'
          > <'\t(cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git &&\n'> <'\t git --bare repack -a -d\n'> <'\t) &&\n'> 
          <'\tgit clone $HTTPD_URL/dumb/repo_pack.git\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'fetch notices corrupt pack'>)} 
      {
        (SQ <'\n'> 
          <
'\tcp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad1.git &&\n'
          > <'\t(cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad1.git &&\n'> <'\t p=$(ls objects/pack/pack-*.pack) &&\n'> 
          <'\t chmod u+w $p &&\n'> <'\t printf %0256d 0 | dd of=$p bs=256 count=1 seek=1 conv=notrunc\n'> <'\t) &&\n'> 
          <'\tmkdir repo_bad1.git &&\n'> <'\t(cd repo_bad1.git &&\n'> <'\t git --bare init &&\n'> 
          <'\t test_must_fail git --bare fetch $HTTPD_URL/dumb/repo_bad1.git &&\n'> <'\t test 0 = $(ls objects/pack/pack-*.pack | wc -l)\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'fetch notices corrupt idx'>)} 
      {
        (SQ <'\n'> 
          <
'\tcp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad2.git &&\n'
          > <'\t(cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad2.git &&\n'> <'\t p=$(ls objects/pack/pack-*.idx) &&\n'> 
          <'\t chmod u+w $p &&\n'> <'\t printf %0256d 0 | dd of=$p bs=256 count=1 seek=1 conv=notrunc\n'> <'\t) &&\n'> 
          <'\tmkdir repo_bad2.git &&\n'> <'\t(cd repo_bad2.git &&\n'> <'\t git --bare init &&\n'> 
          <'\t test_must_fail git --bare fetch $HTTPD_URL/dumb/repo_bad2.git &&\n'> <'\t test 0 = $(ls objects/pack | wc -l)\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'fetch can handle previously-fetched .idx files'>)} 
      {
        (SQ <'\n'> <'\tgit checkout --orphan branch1 &&\n'> <'\techo base >file &&\n'> 
          <'\tgit add file &&\n'> <'\tgit commit -m base &&\n'> 
          <'\tgit --bare init "$HTTPD_DOCUMENT_ROOT_PATH"/repo_packed_branches.git &&\n'> <'\tgit push "$HTTPD_DOCUMENT_ROOT_PATH"/repo_packed_branches.git branch1 &&\n'> 
          <'\tgit --git-dir="$HTTPD_DOCUMENT_ROOT_PATH"/repo_packed_branches.git repack -d &&\n'> <'\tgit checkout -b branch2 branch1 &&\n'> <'\techo b2 >>file &&\n'> <'\tgit commit -a -m b2 &&\n'> 
          <'\tgit push "$HTTPD_DOCUMENT_ROOT_PATH"/repo_packed_branches.git branch2 &&\n'> <'\tgit --git-dir="$HTTPD_DOCUMENT_ROOT_PATH"/repo_packed_branches.git repack -d &&\n'> 
          <'\tgit --bare init clone_packed_branches.git &&\n'> 
          <
'\tgit --git-dir=clone_packed_branches.git fetch "$HTTPD_URL"/dumb/repo_packed_branches.git branch1:branch1 &&\n'
          > 
          <
'\tgit --git-dir=clone_packed_branches.git fetch "$HTTPD_URL"/dumb/repo_packed_branches.git branch2:branch2\n'
          >
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'did not use upload-pack service'>)} 
      {(SQ <'\n'> <'\ttest_might_fail grep '>) <'/git-upload-pack'> 
        (SQ <' <"$HTTPD_ROOT_PATH"/access.log >act &&\n'> <'\t: >exp &&\n'> <'\ttest_cmp exp act\n'>)
      }
    )
    (C {<test_expect_success>} {(SQ <'git client shows text/plain errors'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git clone "$HTTPD_URL/error/text" 2>stderr &&\n'> 
          <'\tgrep "this is the error message" stderr\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'git client does not show html errors'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git clone "$HTTPD_URL/error/html" 2>stderr &&\n'> 
          <'\t! grep "this is the error message" stderr\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'git client shows text/plain with a charset'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git clone "$HTTPD_URL/error/charset" 2>stderr &&\n'> 
          <'\tgrep "this is the error message" stderr\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'http error messages are reencoded'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git clone "$HTTPD_URL/error/utf16" 2>stderr &&\n'> 
          <'\tgrep "this is the error message" stderr\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'reencoding is robust to whitespace oddities'>)} 
      {
        (SQ <'\n'> <'\ttest_must_fail git clone "$HTTPD_URL/error/odd-spacing" 2>stderr &&\n'> 
          <'\tgrep "this is the error message" stderr\n'>
        )
      }
    )
    (command.ShFunction
      name: check_language
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Case
                  to_match: {(DQ ($ Id.VSub_Number '$2'))}
                  arms: [
                    (case_arm
                      pat_list: [{(SQ )}]
                      action: [
                        (command.Simple
                          redirects: [
                            (redir
                              op: <Id.Redir_Great '>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<expect>}
                            )
                          ]
                          do_fork: F
                        )
                      ]
                      spids: [521 523 530 -1]
                    )
                    (case_arm
                      pat_list: [{<Id.Lit_QMark '?'> <Id.Lit_Star '*'>}]
                      action: [
                        (command.Simple
                          words: [
                            {<echo>}
                            {(DQ <'=> Send header: Accept-Language: '> ($ Id.VSub_Number '$1'))}
                          ]
                          redirects: [
                            (redir
                              op: <Id.Redir_Great '>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<expect>}
                            )
                          ]
                          do_fork: T
                        )
                      ]
                      spids: [533 535 549 -1]
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {<git>}
                    {<ls-remote>}
                    {(DQ ($ Id.VSub_DollarName '$HTTPD_URL') <'/dumb/repo.git'>)}
                  ]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<output>}
                    )
                    (redir
                      op: <Id.Redir_GreatAnd '2>&'>
                      loc: (redir_loc.Fd fd:2)
                      arg: {<1>}
                    )
                  ]
                  more_env: [
                    (env_pair name:GIT_TRACE_CURL val:{<true>} spids:[557])
                    (env_pair
                      name: LANGUAGE
                      val: {($ Id.VSub_Number '$2')}
                      spids: [562]
                    )
                  ]
                  do_fork: T
                )
                (command.Pipeline
                  children: [
                    (command.Simple
                      words: [{<tr>} {<-d>} {(SQ <'\\015'>)}]
                      redirects: [(redir op:<Id.Redir_Less '<'> loc:(redir_loc.Fd fd:0) arg:{<output>})]
                      do_fork: T
                    )
                    (C {<sort>} {<-u>})
                    (command.Simple
                      words: [{<sed>} {<-ne>} {(SQ <'/^=> Send header: Accept-Language:/ p'>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<actual>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  negated: F
                )
                (C {<test_cmp>} {<expect>} {<actual>})
              ]
            )
          ]
        )
    )
    (C {<test_expect_success>} {(SQ <'git client sends Accept-Language based on LANGUAGE'>)} 
      {(SQ <'\n'> <'\tcheck_language "ko-KR, *;q=0.9" ko_KR.UTF-8'>)}
    )
    (C {<test_expect_success>} 
      {(SQ <'git client sends Accept-Language correctly with unordinary LANGUAGE'>)} 
      {
        (SQ <'\n'> <'\tcheck_language "ko-KR, *;q=0.9" "ko_KR:" &&\n'> 
          <'\tcheck_language "ko-KR, en-US;q=0.9, *;q=0.8" "ko_KR::en_US" &&\n'> <'\tcheck_language "ko-KR, *;q=0.9" ":::ko_KR" &&\n'> 
          <'\tcheck_language "ko-KR, en-US;q=0.9, *;q=0.8" "ko_KR!!:en_US" &&\n'> <'\tcheck_language "ko-KR, ja-JP;q=0.9, *;q=0.8" "ko_KR en_US:ja_JP"'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'git client sends Accept-Language with many preferred languages'>)} 
      {
        (SQ <'\n'> <'\tcheck_language "ko-KR, en-US;q=0.9, fr-CA;q=0.8, de;q=0.7, sr;q=0.6, \\\n'> 
          <'ja;q=0.5, zh;q=0.4, sv;q=0.3, pt;q=0.2, *;q=0.1" \\\n'> <'\t\tko_KR.EUC-KR:en_US.UTF-8:fr_CA:de.UTF-8@euro:sr@latin:ja:zh:sv:pt &&\n'> 
          <'\tcheck_language "ko-KR, en-US;q=0.99, fr-CA;q=0.98, de;q=0.97, sr;q=0.96, \\\n'> <'ja;q=0.95, zh;q=0.94, sv;q=0.93, pt;q=0.92, nb;q=0.91, *;q=0.90" \\\n'> 
          <'\t\tko_KR.EUC-KR:en_US.UTF-8:fr_CA:de.UTF-8@euro:sr@latin:ja:zh:sv:pt:nb\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'git client does not send an empty Accept-Language'>)} 
      {
        (SQ <'\n'> 
          <'\tGIT_TRACE_CURL=true LANGUAGE= git ls-remote "$HTTPD_URL/dumb/repo.git" 2>stderr &&\n'> <'\t! grep "^=> Send header: Accept-Language:" stderr\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'remote-http complains cleanly about malformed urls'>)} 
      {
        (SQ <'\n'> <'\t# do not actually issue "list" or other commands, as we do not\n'> 
          <'\t# want to rely on what curl would actually do with such a broken\n'> <'\t# URL. This is just about making sure we do not segfault during\n'> <'\t# initialization.\n'> 
          <'\ttest_must_fail git remote-http http::/example.com/repo.git\n'>
        )
      }
    )
    (C {<stop_httpd>})
    (C {<test_done>})
  ]
)