(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <"Test remote-helper import and export commands">)}
          spids: [13]
        )
      ]
      spids: [13]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ VSub_Name "$TEST_DIRECTORY")) (/lib-gpg.sh)})
    (FuncDef
      name: compare_refs
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (SimpleCommand
                  words: [
                    {(git)}
                    {(--git-dir) (Lit_Other "=") (DQ ($ VSub_Number "$1") (/.git))}
                    {(rev-parse)}
                    {(--verify)}
                    {($ VSub_Number "$2")}
                  ]
                  redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(expect)} spids:[53])]
                )
                (AndOr
                  children: [
                    (SimpleCommand
                      words: [
                        {(git)}
                        {(--git-dir) (Lit_Other "=") (DQ ($ VSub_Number "$3") (/.git))}
                        {(rev-parse)}
                        {(--verify)}
                        {($ VSub_Number "$4")}
                      ]
                      redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(actual)} spids:[74])]
                    )
                    (C {(test_cmp)} {(expect)} {(actual)})
                  ]
                  op_id: Op_DAmp
                )
              ]
              op_id: Op_DAmp
            )
          ]
          spids: [35]
        )
      spids: [31 34]
    )
    (C {(test_expect_success)} {(SQ <"setup repository">)} 
      {
        (SQ <"\n"> <"\tgit init server &&\n"> <"\t(cd server &&\n"> <"\t echo content >file &&\n"> 
          <"\t git add file &&\n"> <"\t git commit -m one)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"cloning from local repo">)} 
      {
        (SQ <"\n"> <"\tgit clone \"testgit::${PWD}/server\" local &&\n"> 
          <"\ttest_cmp server/file local/file\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"create new commit on remote">)} 
      {
        (SQ <"\n"> <"\t(cd server &&\n"> <"\t echo content >>file &&\n"> <"\t git commit -a -m two)\n">)
      }
    )
    (C {(test_expect_success)} {(SQ <"pulling from local repo">)} 
      {(SQ <"\n"> <"\t(cd local && git pull) &&\n"> <"\ttest_cmp server/file local/file\n">)}
    )
    (C {(test_expect_success)} {(SQ <"pushing to local repo">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\techo content >>file &&\n"> <"\tgit commit -a -m three &&\n"> 
          <"\tgit push) &&\n"> <"\tcompare_refs local HEAD server HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"fetch new branch">)} 
      {
        (SQ <"\n"> <"\t(cd server &&\n"> <"\t git reset --hard &&\n"> <"\t git checkout -b new &&\n"> 
          <"\t echo content >>file &&\n"> <"\t git commit -a -m five\n"> <"\t) &&\n"> <"\t(cd local &&\n"> <"\t git fetch origin new\n"> 
          <"\t) &&\n"> <"\tcompare_refs server HEAD local FETCH_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"fetch multiple branches">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\t git fetch\n"> <"\t) &&\n"> 
          <"\tcompare_refs server master local refs/remotes/origin/master &&\n"> <"\tcompare_refs server new local refs/remotes/origin/new\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"push when remote has extra refs">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\t git reset --hard origin/master &&\n"> 
          <"\t echo content >>file &&\n"> <"\t git commit -a -m six &&\n"> <"\t git push\n"> <"\t) &&\n"> 
          <"\tcompare_refs local master server master\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"push new branch by name">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\t git checkout -b new-name  &&\n"> 
          <"\t echo content >>file &&\n"> <"\t git commit -a -m seven &&\n"> <"\t git push origin new-name\n"> <"\t) &&\n"> 
          <"\tcompare_refs local HEAD server refs/heads/new-name\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"push new branch with old:new refspec">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\t git push origin new-name:new-refspec\n"> <"\t) &&\n"> 
          <"\tcompare_refs local HEAD server refs/heads/new-refspec\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"push new branch with HEAD:new refspec">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\t git checkout new-name\n"> 
          <"\t git push origin HEAD:new-refspec-2\n"> <"\t) &&\n"> <"\tcompare_refs local HEAD server refs/heads/new-refspec-2\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"push delete branch">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\t git push origin :new-name\n"> <"\t) &&\n"> 
          <"\ttest_must_fail git --git-dir=\"server/.git\" \\\n"> <"\t rev-parse --verify refs/heads/new-name\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"forced push">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\tgit checkout -b force-test &&\n"> 
          <"\techo content >> file &&\n"> <"\tgit commit -a -m eight &&\n"> <"\tgit push origin force-test &&\n"> <"\techo content >> file &&\n"> 
          <"\tgit commit -a --amend -m eight-modified &&\n"> <"\tgit push --force origin force-test\n"> <"\t) &&\n"> 
          <"\tcompare_refs local refs/heads/force-test server refs/heads/force-test\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"cloning without refspec">)} 
      {
        (SQ <"\n"> <"\tGIT_REMOTE_TESTGIT_REFSPEC=\"\" \\\n"> 
          <"\tgit clone \"testgit::${PWD}/server\" local2 2>error &&\n"> <"\tgrep \"This remote helper should implement refspec capability\" error &&\n"> 
          <"\tcompare_refs local2 HEAD server HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"pulling without refspecs">)} 
      {
        (SQ <"\n"> <"\t(cd local2 &&\n"> <"\tgit reset --hard &&\n"> 
          <"\tGIT_REMOTE_TESTGIT_REFSPEC=\"\" git pull 2>../error) &&\n"> <"\tgrep \"This remote helper should implement refspec capability\" error &&\n"> 
          <"\tcompare_refs local2 HEAD server HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"pushing without refspecs">)} 
      {
        (SQ <"\n"> <"\ttest_when_finished \"(cd local2 && git reset --hard origin)\" &&\n"> 
          <"\t(cd local2 &&\n"> <"\techo content >>file &&\n"> <"\tgit commit -a -m ten &&\n"> 
          <"\tGIT_REMOTE_TESTGIT_REFSPEC=\"\" &&\n"> <"\texport GIT_REMOTE_TESTGIT_REFSPEC &&\n"> <"\ttest_must_fail git push 2>../error) &&\n"> 
          <"\tgrep \"remote-helper doesn.t support push; refspec needed\" error\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"pulling without marks">)} 
      {
        (SQ <"\n"> <"\t(cd local2 &&\n"> <"\tGIT_REMOTE_TESTGIT_NO_MARKS=1 git pull) &&\n"> 
          <"\tcompare_refs local2 HEAD server HEAD\n">
        )
      }
    )
    (C {(test_expect_failure)} {(SQ <"pushing without marks">)} 
      {
        (SQ <"\n"> <"\ttest_when_finished \"(cd local2 && git reset --hard origin)\" &&\n"> 
          <"\t(cd local2 &&\n"> <"\techo content >>file &&\n"> <"\tgit commit -a -m twelve &&\n"> 
          <"\tGIT_REMOTE_TESTGIT_NO_MARKS=1 git push) &&\n"> <"\tcompare_refs local2 HEAD server HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"push all with existing object">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\tgit branch dup2 master &&\n"> <"\tgit push origin --all\n"> 
          <"\t) &&\n"> <"\tcompare_refs local dup2 server dup2\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"push ref with existing object">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\tgit branch dup master &&\n"> <"\tgit push origin dup\n"> 
          <"\t) &&\n"> <"\tcompare_refs local dup server dup\n">
        )
      }
    )
    (C {(test_expect_success)} {(GPG)} {(SQ <"push signed tag">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\tgit checkout master &&\n"> 
          <"\tgit tag -s -m signed-tag signed-tag &&\n"> <"\tgit push origin signed-tag\n"> <"\t) &&\n"> 
          <"\tcompare_refs local signed-tag^{} server signed-tag^{} &&\n"> <"\ttest_must_fail compare_refs local signed-tag server signed-tag\n">
        )
      }
    )
    (C {(test_expect_success)} {(GPG)} {(SQ <"push signed tag with signed-tags capability">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\tgit checkout master &&\n"> 
          <"\tgit tag -s -m signed-tag signed-tag-2 &&\n"> <"\tGIT_REMOTE_TESTGIT_SIGNED_TAGS=1 git push origin signed-tag-2\n"> <"\t) &&\n"> 
          <"\tcompare_refs local signed-tag-2 server signed-tag-2\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"push update refs">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\tgit checkout -b update master &&\n"> 
          <"\techo update >>file &&\n"> <"\tgit commit -a -m update &&\n"> <"\tgit push origin update &&\n"> 
          <"\tgit rev-parse --verify remotes/origin/update >expect &&\n"> <"\tgit rev-parse --verify testgit/origin/heads/update >actual &&\n"> <"\ttest_cmp expect actual\n"> 
          <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"push update refs disabled by no-private-update">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\techo more-update >>file &&\n"> 
          <"\tgit commit -a -m more-update &&\n"> <"\tgit rev-parse --verify testgit/origin/heads/update >expect &&\n"> 
          <"\tGIT_REMOTE_TESTGIT_NO_PRIVATE_UPDATE=t git push origin update &&\n"> <"\tgit rev-parse --verify testgit/origin/heads/update >actual &&\n"> <"\ttest_cmp expect actual\n"> 
          <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"push update refs failure">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\tgit checkout update &&\n"> 
          <"\techo \"update fail\" >>file &&\n"> <"\tgit commit -a -m \"update fail\" &&\n"> 
          <"\tgit rev-parse --verify testgit/origin/heads/update >expect &&\n"> <"\ttest_expect_code 1 env GIT_REMOTE_TESTGIT_FAILURE=\"non-fast forward\" \\\n"> 
          <"\t\tgit push origin update &&\n"> <"\tgit rev-parse --verify testgit/origin/heads/update >actual &&\n"> <"\ttest_cmp expect actual\n"> 
          <"\t)\n">
        )
      }
    )
    (FuncDef
      name: clean_mark
      body: 
        (BraceGroup
          children: [
            (Pipeline
              children: [
                (C {(cut)} {(-f)} {(2)} {(-d)} {(SQ <" ">)} {(DQ ($ VSub_Number "$1"))})
                (C {(git)} {(cat-file)} {(--batch-check)})
                (C {(grep)} {(commit)})
                (SimpleCommand
                  words: [{(sort)}]
                  redirects: [
                    (Redir
                      op_id: Redir_Great
                      fd: -1
                      arg_word: 
                        {
                          (CommandSubPart
                            command_list: 
                              (CommandList
                                children: [(C {(basename)} {(DQ ($ VSub_Number "$1"))})]
                              )
                            left_token: <Left_CommandSub "$(">
                            spids: [560 566]
                          )
                        }
                      spids: [559]
                    )
                  ]
                )
              ]
              negated: False
            )
          ]
          spids: [519]
        )
      spids: [514 518]
    )
    (C {(test_expect_success)} {(SQ <"proper failure checks for fetching">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> 
          <"\ttest_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error &&\n"> <"\tcat error &&\n"> <"\tgrep -q \"Error while running fast-import\" error\n"> <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"proper failure checks for pushing">)} 
      {
        (SQ <"\n"> <"\ttest_when_finished \"rm -rf local/git.marks local/testgit.marks\" &&\n"> 
          <"\t(cd local &&\n"> <"\tgit checkout -b crash master &&\n"> <"\techo crash >>file &&\n"> <"\tgit commit -a -m crash &&\n"> 
          <"\ttest_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all &&\n"> <"\tclean_mark \".git/testgit/origin/git.marks\" &&\n"> 
          <"\tclean_mark \".git/testgit/origin/testgit.marks\" &&\n"> <"\ttest_cmp git.marks testgit.marks\n"> <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"push messages">)} 
      {
        (SQ <"\n"> <"\t(cd local &&\n"> <"\tgit checkout -b new_branch master &&\n"> 
          <"\techo new >>file &&\n"> <"\tgit commit -a -m new &&\n"> <"\tgit push origin new_branch &&\n"> <"\tgit fetch origin &&\n"> 
          <"\techo new >>file &&\n"> <"\tgit commit -a -m new &&\n"> <"\tgit push origin new_branch 2> msg &&\n"> 
          <"\t! grep \"\\[new branch\\]\" msg\n"> <"\t)\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"fetch HEAD">)} 
      {
        (SQ <"\n"> <"\t(cd server &&\n"> <"\tgit checkout master &&\n"> <"\techo more >>file &&\n"> 
          <"\tgit commit -a -m more\n"> <"\t) &&\n"> <"\t(cd local &&\n"> <"\tgit fetch origin HEAD\n"> <"\t) &&\n"> 
          <"\tcompare_refs server HEAD local FETCH_HEAD\n">
        )
      }
    )
    (C {(test_expect_success)} {(SQ <"fetch url">)} 
      {
        (SQ <"\n"> <"\t(cd server &&\n"> <"\tgit checkout master &&\n"> <"\techo more >>file &&\n"> 
          <"\tgit commit -a -m more\n"> <"\t) &&\n"> <"\t(cd local &&\n"> <"\tgit fetch \"testgit::${PWD}/../server\"\n"> <"\t) &&\n"> 
          <"\tcompare_refs server HEAD local FETCH_HEAD\n">
        )
      }
    )
    (C {(test_done)})
  ]
)