f096e6e826
If we find two refspecs that want to update the same local reference, emit an error message that is more informative based on whether one of the conflicting refspecs is an opportunistic update during a fetch with explicit command-line refspecs. And especially, do not die if an opportunistic reference update conflicts with an express wish of the user; rather, just emit a warning and skip the opportunistic reference update. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
101 lines
2.5 KiB
Bash
Executable File
101 lines
2.5 KiB
Bash
Executable File
#!/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
|