Browse Source
Add some tests that "git fetch" handles refspec conflicts (i.e., when the same local reference should be updated from two different remote references) correctly. There is a small bug when updating references opportunistically, namely that an explicit user wish like git fetch origin \ refs/heads/branch1:refs/remotes/origin/branch2 \ refs/heads/branch2:refs/remotes/origin/branch1 should override a configured refspec like +refs/heads/*:refs/remotes/origin/* The current code incorrectly treats this as a fatal error. In a few commits we will improve the error messages for refspec conflicts in general and also turn this buggy fatal error into a warning. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint


1 changed files with 96 additions and 0 deletions
@ -0,0 +1,96 @@
@@ -0,0 +1,96 @@
|
||||
#!/bin/sh |
||||
|
||||
test_description='fetch handles conflicting refspecs correctly' |
||||
|
||||
. ./test-lib.sh |
||||
|
||||
D=$(pwd) |
||||
|
||||
setup_repository () { |
||||
git init "$1" && ( |
||||
cd "$1" && |
||||
git config remote.origin.url "$D" && |
||||
shift && |
||||
for refspec in "$@" |
||||
do |
||||
git config --add remote.origin.fetch "$refspec" |
||||
done |
||||
) |
||||
} |
||||
|
||||
verify_stderr () { |
||||
cat >expected && |
||||
# We're not interested in the error |
||||
# "fatal: The remote end hung up unexpectedly": |
||||
grep -v "hung up" <error >actual && |
||||
test_cmp expected actual |
||||
} |
||||
|
||||
test_expect_success 'setup' ' |
||||
git commit --allow-empty -m "Initial" && |
||||
git branch branch1 && |
||||
git tag tag1 && |
||||
git commit --allow-empty -m "First" && |
||||
git branch branch2 && |
||||
git tag tag2 |
||||
' |
||||
|
||||
test_expect_success 'fetch with no conflict' ' |
||||
setup_repository ok "+refs/heads/*:refs/remotes/origin/*" && ( |
||||
cd ok && |
||||
git fetch origin |
||||
) |
||||
' |
||||
|
||||
test_expect_success 'fetch conflict: config vs. config' ' |
||||
setup_repository ccc \ |
||||
"+refs/heads/branch1:refs/remotes/origin/branch1" \ |
||||
"+refs/heads/branch2:refs/remotes/origin/branch1" && ( |
||||
cd ccc && |
||||
test_must_fail git fetch origin 2>error && |
||||
verify_stderr <<-\EOF |
||||
fatal: refs/remotes/origin/branch1 tracks both refs/heads/branch1 and refs/heads/branch2 |
||||
EOF |
||||
) |
||||
' |
||||
|
||||
test_expect_success 'fetch duplicate: config vs. config' ' |
||||
setup_repository dcc \ |
||||
"+refs/heads/*:refs/remotes/origin/*" \ |
||||
"+refs/heads/branch1:refs/remotes/origin/branch1" && ( |
||||
cd dcc && |
||||
git fetch origin |
||||
) |
||||
' |
||||
|
||||
test_expect_success 'fetch conflict: arg overrides config' ' |
||||
setup_repository aoc \ |
||||
"+refs/heads/*:refs/remotes/origin/*" && ( |
||||
cd aoc && |
||||
git fetch origin refs/heads/branch2:refs/remotes/origin/branch1 |
||||
) |
||||
' |
||||
|
||||
test_expect_success 'fetch conflict: arg vs. arg' ' |
||||
setup_repository caa && ( |
||||
cd caa && |
||||
test_must_fail git fetch origin \ |
||||
refs/heads/*:refs/remotes/origin/* \ |
||||
refs/heads/branch2:refs/remotes/origin/branch1 2>error && |
||||
verify_stderr <<-\EOF |
||||
fatal: refs/remotes/origin/branch1 tracks both refs/heads/branch1 and refs/heads/branch2 |
||||
EOF |
||||
) |
||||
' |
||||
|
||||
test_expect_failure 'fetch conflict: criss-cross args' ' |
||||
setup_repository xaa \ |
||||
"+refs/heads/*:refs/remotes/origin/*" && ( |
||||
cd xaa && |
||||
git fetch origin \ |
||||
refs/heads/branch1:refs/remotes/origin/branch2 \ |
||||
refs/heads/branch2:refs/remotes/origin/branch1 |
||||
) |
||||
' |
||||
|
||||
test_done |
Loading…
Reference in new issue