git-commit-vandalism/t/t5801-remote-helpers.sh

170 lines
3.8 KiB
Bash
Raw Normal View History

#!/bin/sh
#
# Copyright (c) 2010 Sverre Rabbelier
#
test_description='Test remote-helper import and export commands'
. ./test-lib.sh
if ! type "${BASH-bash}" >/dev/null 2>&1; then
skip_all='skipping remote-testgit tests, bash not available'
test_done
fi
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_failure '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 'cloning without refspec' '
GIT_REMOTE_TESTGIT_REFSPEC="" \
git clone "testgit::${PWD}/server" local2 &&
compare_refs local2 HEAD server HEAD
'
test_expect_success 'pulling without refspecs' '
(cd local2 &&
git reset --hard &&
GIT_REMOTE_TESTGIT_REFSPEC="" git pull) &&
compare_refs local2 HEAD server HEAD
'
test_expect_failure '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="" git push) &&
compare_refs local2 HEAD server HEAD
'
test_expect_success 'pulling with straight refspec' '
(cd local2 &&
GIT_REMOTE_TESTGIT_REFSPEC="*:*" git pull) &&
compare_refs local2 HEAD server HEAD
'
test_expect_failure 'pushing with straight refspec' '
test_when_finished "(cd local2 && git reset --hard origin)" &&
(cd local2 &&
echo content >>file &&
git commit -a -m eleven &&
GIT_REMOTE_TESTGIT_REFSPEC="*:*" git push) &&
compare_refs local2 HEAD server HEAD
'
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
'
fast-export: don't handle uninteresting refs They have been marked as UNINTERESTING for a reason, lets respect that. Currently the first ref is handled properly, but not the rest. Assuming that all the refs point at the same commit in the following example: % git fast-export master ^uninteresting ^foo ^bar reset refs/heads/bar from :0 reset refs/heads/foo from :0 reset refs/heads/uninteresting from :0 % git fast-export ^uninteresting ^foo ^bar master reset refs/heads/master from :0 reset refs/heads/bar from :0 reset refs/heads/foo from :0 Clearly this is wrong; the negative refs should be ignored. After this patch: % git fast-export ^uninteresting ^foo ^bar master # nothing % git fast-export master ^uninteresting ^foo ^bar # nothing And even more, it would only happen if the ref is pointing to exactly the same commit, but not otherwise: % git fast-export ^next next reset refs/heads/next from :0 % git fast-export ^next next^{commit} # nothing % git fast-export ^next next~0 # nothing % git fast-export ^next next~1 # nothing % git fast-export ^next next~2 # nothing The reason this happens is that before traversing the commits, fast-export checks if any of the refs point to the same object, and any duplicated ref gets added to a list in order to issue 'reset' commands after the traversing. Unfortunately, it's not even checking if the commit is flagged as UNINTERESTING. The fix of course, is to check it. However, in order to do it properly we need to get the UNINTERESTING flag from the command line, not from the commit object, because "^foo bar" will mark the commit 'bar' uninteresting if foo and bar points at the same commit. rev_cmdline_info, which was introduced exactly to handle this situation, contains all the information we need for get_tags_and_duplicates(), plus the ref flag. This way the rest of the positive refs will remain untouched; it's only the negative ones that change in behavior. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-11-28 23:23:59 +01:00
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_done