You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.5 KiB
100 lines
2.5 KiB
#!/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 -E '^(fatal|warning):' <error | grep -v 'hung up' >actual | sort && |
|
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: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1 |
|
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: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1 |
|
EOF |
|
) |
|
' |
|
|
|
test_expect_success '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 2>error && |
|
verify_stderr <<-\EOF |
|
warning: refs/remotes/origin/branch1 usually tracks refs/heads/branch1, not refs/heads/branch2 |
|
warning: refs/remotes/origin/branch2 usually tracks refs/heads/branch2, not refs/heads/branch1 |
|
EOF |
|
) |
|
' |
|
|
|
test_done
|
|
|