diff options
Diffstat (limited to 't/t5536-fetch-conflicts.sh')
| -rwxr-xr-x | t/t5536-fetch-conflicts.sh | 100 | 
1 files changed, 100 insertions, 0 deletions
diff --git a/t/t5536-fetch-conflicts.sh b/t/t5536-fetch-conflicts.sh new file mode 100755 index 0000000000..6c5d3a4ce0 --- /dev/null +++ b/t/t5536-fetch-conflicts.sh @@ -0,0 +1,100 @@ +#!/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  | 
