#!/bin/sh # # Copyright (c) 2010 Sverre Rabbelier # global test_description := ''Test remote-helper import and export commands'' source ./test-lib.sh source "$TEST_DIRECTORY"/lib-gpg.sh proc compare_refs { git --git-dir="$1/.git" rev-parse --verify $2 >expect && git --git-dir="$3/.git" rev-parse --verify $4 >actual && test_cmp expect actual } test_expect_success 'setup repository' ' git init server && (cd server && echo content >file && git add file && git commit -m one) ' test_expect_success 'cloning from local repo' ' git clone "testgit::${PWD}/server" local && test_cmp server/file local/file ' test_expect_success 'create new commit on remote' ' (cd server && echo content >>file && git commit -a -m two) ' test_expect_success 'pulling from local repo' ' (cd local && git pull) && test_cmp server/file local/file ' test_expect_success 'pushing to local repo' ' (cd local && echo content >>file && git commit -a -m three && git push) && compare_refs local HEAD server HEAD ' test_expect_success 'fetch new branch' ' (cd server && git reset --hard && git checkout -b new && echo content >>file && git commit -a -m five ) && (cd local && git fetch origin new ) && compare_refs server HEAD local FETCH_HEAD ' test_expect_success 'fetch multiple branches' ' (cd local && git fetch ) && compare_refs server master local refs/remotes/origin/master && compare_refs server new local refs/remotes/origin/new ' test_expect_success 'push when remote has extra refs' ' (cd local && git reset --hard origin/master && echo content >>file && git commit -a -m six && git push ) && compare_refs local master server master ' test_expect_success 'push new branch by name' ' (cd local && git checkout -b new-name && echo content >>file && git commit -a -m seven && git push origin new-name ) && compare_refs local HEAD server refs/heads/new-name ' test_expect_success 'push new branch with old:new refspec' ' (cd local && git push origin new-name:new-refspec ) && compare_refs local HEAD server refs/heads/new-refspec ' test_expect_success 'push new branch with HEAD:new refspec' ' (cd local && git checkout new-name git push origin HEAD:new-refspec-2 ) && compare_refs local HEAD server refs/heads/new-refspec-2 ' test_expect_success 'push delete branch' ' (cd local && git push origin :new-name ) && test_must_fail git --git-dir="server/.git" \ rev-parse --verify refs/heads/new-name ' test_expect_success 'forced push' ' (cd local && git checkout -b force-test && echo content >> file && git commit -a -m eight && git push origin force-test && echo content >> file && git commit -a --amend -m eight-modified && git push --force origin force-test ) && compare_refs local refs/heads/force-test server refs/heads/force-test ' test_expect_success 'cloning without refspec' ' GIT_REMOTE_TESTGIT_REFSPEC="" \ git clone "testgit::${PWD}/server" local2 2>error && grep "This remote helper should implement refspec capability" error && compare_refs local2 HEAD server HEAD ' test_expect_success 'pulling without refspecs' ' (cd local2 && git reset --hard && GIT_REMOTE_TESTGIT_REFSPEC="" git pull 2>../error) && grep "This remote helper should implement refspec capability" error && compare_refs local2 HEAD server HEAD ' test_expect_success 'pushing without refspecs' ' test_when_finished "(cd local2 && git reset --hard origin)" && (cd local2 && echo content >>file && git commit -a -m ten && GIT_REMOTE_TESTGIT_REFSPEC="" && export GIT_REMOTE_TESTGIT_REFSPEC && test_must_fail git push 2>../error) && grep "remote-helper doesn.t support push; refspec needed" error ' test_expect_success 'pulling without marks' ' (cd local2 && GIT_REMOTE_TESTGIT_NO_MARKS=1 git pull) && compare_refs local2 HEAD server HEAD ' test_expect_failure 'pushing without marks' ' test_when_finished "(cd local2 && git reset --hard origin)" && (cd local2 && echo content >>file && git commit -a -m twelve && GIT_REMOTE_TESTGIT_NO_MARKS=1 git push) && compare_refs local2 HEAD server HEAD ' test_expect_success 'push all with existing object' ' (cd local && git branch dup2 master && git push origin --all ) && compare_refs local dup2 server dup2 ' test_expect_success 'push ref with existing object' ' (cd local && git branch dup master && git push origin dup ) && compare_refs local dup server dup ' test_expect_success GPG 'push signed tag' ' (cd local && git checkout master && git tag -s -m signed-tag signed-tag && git push origin signed-tag ) && compare_refs local signed-tag^{} server signed-tag^{} && test_must_fail compare_refs local signed-tag server signed-tag ' test_expect_success GPG 'push signed tag with signed-tags capability' ' (cd local && git checkout master && git tag -s -m signed-tag signed-tag-2 && GIT_REMOTE_TESTGIT_SIGNED_TAGS=1 git push origin signed-tag-2 ) && compare_refs local signed-tag-2 server signed-tag-2 ' test_expect_success 'push update refs' ' (cd local && git checkout -b update master && echo update >>file && git commit -a -m update && git push origin update && git rev-parse --verify remotes/origin/update >expect && git rev-parse --verify testgit/origin/heads/update >actual && test_cmp expect actual ) ' test_expect_success 'push update refs disabled by no-private-update' ' (cd local && echo more-update >>file && git commit -a -m more-update && git rev-parse --verify testgit/origin/heads/update >expect && GIT_REMOTE_TESTGIT_NO_PRIVATE_UPDATE=t git push origin update && git rev-parse --verify testgit/origin/heads/update >actual && test_cmp expect actual ) ' test_expect_success 'push update refs failure' ' (cd local && git checkout update && echo "update fail" >>file && git commit -a -m "update fail" && git rev-parse --verify testgit/origin/heads/update >expect && test_expect_code 1 env GIT_REMOTE_TESTGIT_FAILURE="non-fast forward" \ git push origin update && git rev-parse --verify testgit/origin/heads/update >actual && test_cmp expect actual ) ' proc clean_mark { cut -f 2 -d ' ' $1 | git cat-file --batch-check | grep commit | sort >$[basename $1] } test_expect_success 'proper failure checks for fetching' ' (cd local && test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error && cat error && grep -q "Error while running fast-import" error ) ' test_expect_success 'proper failure checks for pushing' ' test_when_finished "rm -rf local/git.marks local/testgit.marks" && (cd local && git checkout -b crash master && echo crash >>file && git commit -a -m crash && test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all && clean_mark ".git/testgit/origin/git.marks" && clean_mark ".git/testgit/origin/testgit.marks" && test_cmp git.marks testgit.marks ) ' test_expect_success 'push messages' ' (cd local && git checkout -b new_branch master && echo new >>file && git commit -a -m new && git push origin new_branch && git fetch origin && echo new >>file && git commit -a -m new && git push origin new_branch 2> msg && ! grep "\[new branch\]" msg ) ' test_expect_success 'fetch HEAD' ' (cd server && git checkout master && echo more >>file && git commit -a -m more ) && (cd local && git fetch origin HEAD ) && compare_refs server HEAD local FETCH_HEAD ' test_expect_success 'fetch url' ' (cd server && git checkout master && echo more >>file && git commit -a -m more ) && (cd local && git fetch "testgit::${PWD}/../server" ) && compare_refs server HEAD local FETCH_HEAD ' test_done (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: 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)}) ] )