(command.CommandList children: [ (command.Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (lhs_expr.LhsName name:test_description) op: Equal rhs: {(SQ <'Test remote-helper import and export commands'>)} ) ] ) (C {(.)} {(./test-lib.sh)}) (C {(.)} {(DQ ($ VSub_DollarName '$TEST_DIRECTORY')) (/lib-gpg.sh)}) (command.FuncDef name: compare_refs body: (command.BraceGroup children: [ (command.AndOr ops: [Op_DAmp Op_DAmp] children: [ (command.SimpleCommand words: [ {(git)} {(--git-dir) (Lit_Other '=') (DQ ($ VSub_Number '$1') (/.git))} {(rev-parse)} {(--verify)} {($ VSub_Number '$2')} ] redirects: [(redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(expect)})] ) (command.SimpleCommand words: [ {(git)} {(--git-dir) (Lit_Other '=') (DQ ($ VSub_Number '$3') (/.git))} {(rev-parse)} {(--verify)} {($ VSub_Number '$4')} ] redirects: [(redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(actual)})] ) (C {(test_cmp)} {(expect)} {(actual)}) ] ) ] ) ) (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'> ) } ) (command.FuncDef name: clean_mark body: (command.BraceGroup children: [ (command.Pipeline children: [ (C {(cut)} {(-f)} {(2)} {(-d)} {(SQ <' '>)} {(DQ ($ VSub_Number '$1'))}) (C {(git)} {(cat-file)} {(--batch-check)}) (C {(grep)} {(commit)}) (command.SimpleCommand words: [{(sort)}] redirects: [ (redir.Redir op: <Redir_Great '>'> fd: 16777215 arg_word: { (word_part.CommandSubPart command_list: (command.CommandList children: [(C {(basename)} {(DQ ($ VSub_Number '$1'))})] ) left_token: <Left_CommandSub '$('> ) } ) ] ) ] negated: F ) ] ) ) (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)}) ] )