195 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| test_description='undoing resolution'
 | |
| 
 | |
| . ./test-lib.sh
 | |
| 
 | |
| check_resolve_undo () {
 | |
| 	msg=$1
 | |
| 	shift
 | |
| 	while case $# in
 | |
| 	0)	break ;;
 | |
| 	1|2|3)	die "Bug in check-resolve-undo test" ;;
 | |
| 	esac
 | |
| 	do
 | |
| 		path=$1
 | |
| 		shift
 | |
| 		for stage in 1 2 3
 | |
| 		do
 | |
| 			sha1=$1
 | |
| 			shift
 | |
| 			case "$sha1" in
 | |
| 			'') continue ;;
 | |
| 			esac
 | |
| 			sha1=$(git rev-parse --verify "$sha1")
 | |
| 			printf "100644 %s %s\t%s\n" $sha1 $stage $path
 | |
| 		done
 | |
| 	done >"$msg.expect" &&
 | |
| 	git ls-files --resolve-undo >"$msg.actual" &&
 | |
| 	test_cmp "$msg.expect" "$msg.actual"
 | |
| }
 | |
| 
 | |
| prime_resolve_undo () {
 | |
| 	git reset --hard &&
 | |
| 	git checkout second^0 &&
 | |
| 	test_tick &&
 | |
| 	test_must_fail git merge third^0 &&
 | |
| 	echo merge does not leave anything &&
 | |
| 	check_resolve_undo empty &&
 | |
| 	echo different >fi/le &&
 | |
| 	git add fi/le &&
 | |
| 	echo resolving records &&
 | |
| 	check_resolve_undo recorded fi/le initial:fi/le second:fi/le third:fi/le
 | |
| }
 | |
| 
 | |
| test_expect_success setup '
 | |
| 	mkdir fi &&
 | |
| 	printf "a\0a" >binary &&
 | |
| 	git add binary &&
 | |
| 	test_commit initial fi/le first &&
 | |
| 	git branch side &&
 | |
| 	git branch another &&
 | |
| 	printf "a\0b" >binary &&
 | |
| 	git add binary &&
 | |
| 	test_commit second fi/le second &&
 | |
| 	git checkout side &&
 | |
| 	test_commit third fi/le third &&
 | |
| 	git branch add-add &&
 | |
| 	git checkout another &&
 | |
| 	test_commit fourth fi/le fourth &&
 | |
| 	git checkout add-add &&
 | |
| 	test_commit fifth add-differently &&
 | |
| 	git checkout master
 | |
| '
 | |
| 
 | |
| test_expect_success 'add records switch clears' '
 | |
| 	prime_resolve_undo &&
 | |
| 	test_tick &&
 | |
| 	git commit -m merged &&
 | |
| 	echo committing keeps &&
 | |
| 	check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
 | |
| 	git checkout second^0 &&
 | |
| 	echo switching clears &&
 | |
| 	check_resolve_undo cleared
 | |
| '
 | |
| 
 | |
| test_expect_success 'rm records reset clears' '
 | |
| 	prime_resolve_undo &&
 | |
| 	test_tick &&
 | |
| 	git commit -m merged &&
 | |
| 	echo committing keeps &&
 | |
| 	check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
 | |
| 
 | |
| 	echo merge clears upfront &&
 | |
| 	test_must_fail git merge fourth^0 &&
 | |
| 	check_resolve_undo nuked &&
 | |
| 
 | |
| 	git rm -f fi/le &&
 | |
| 	echo resolving records &&
 | |
| 	check_resolve_undo recorded fi/le initial:fi/le HEAD:fi/le fourth:fi/le &&
 | |
| 
 | |
| 	git reset --hard &&
 | |
| 	echo resetting discards &&
 | |
| 	check_resolve_undo discarded
 | |
| '
 | |
| 
 | |
| test_expect_success 'plumbing clears' '
 | |
| 	prime_resolve_undo &&
 | |
| 	test_tick &&
 | |
| 	git commit -m merged &&
 | |
| 	echo committing keeps &&
 | |
| 	check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
 | |
| 
 | |
| 	echo plumbing clear &&
 | |
| 	git update-index --clear-resolve-undo &&
 | |
| 	check_resolve_undo cleared
 | |
| '
 | |
| 
 | |
| test_expect_success 'add records checkout -m undoes' '
 | |
| 	prime_resolve_undo &&
 | |
| 	git diff HEAD &&
 | |
| 	git checkout --conflict=merge fi/le &&
 | |
| 	echo checkout used the record and removed it &&
 | |
| 	check_resolve_undo removed &&
 | |
| 	echo the index and the work tree is unmerged again &&
 | |
| 	git diff >actual &&
 | |
| 	grep "^++<<<<<<<" actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'unmerge with plumbing' '
 | |
| 	prime_resolve_undo &&
 | |
| 	git update-index --unresolve fi/le &&
 | |
| 	git ls-files -u >actual &&
 | |
| 	test_line_count = 3 actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'rerere and rerere forget' '
 | |
| 	mkdir .git/rr-cache &&
 | |
| 	prime_resolve_undo &&
 | |
| 	echo record the resolution &&
 | |
| 	git rerere &&
 | |
| 	rerere_id=$(cd .git/rr-cache && echo */postimage) &&
 | |
| 	rerere_id=${rerere_id%/postimage} &&
 | |
| 	test -f .git/rr-cache/$rerere_id/postimage &&
 | |
| 	git checkout -m fi/le &&
 | |
| 	echo resurrect the conflict &&
 | |
| 	grep "^=======" fi/le &&
 | |
| 	echo reresolve the conflict &&
 | |
| 	git rerere &&
 | |
| 	test "z$(cat fi/le)" = zdifferent &&
 | |
| 	echo register the resolution again &&
 | |
| 	git add fi/le &&
 | |
| 	check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
 | |
| 	test -z "$(git ls-files -u)" &&
 | |
| 	git rerere forget fi/le &&
 | |
| 	! test -f .git/rr-cache/$rerere_id/postimage &&
 | |
| 	tr "\0" "\n" <.git/MERGE_RR >actual &&
 | |
| 	echo "$rerere_id	fi/le" >expect &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'rerere and rerere forget (subdirectory)' '
 | |
| 	rm -fr .git/rr-cache &&
 | |
| 	mkdir .git/rr-cache &&
 | |
| 	prime_resolve_undo &&
 | |
| 	echo record the resolution &&
 | |
| 	(cd fi && git rerere) &&
 | |
| 	rerere_id=$(cd .git/rr-cache && echo */postimage) &&
 | |
| 	rerere_id=${rerere_id%/postimage} &&
 | |
| 	test -f .git/rr-cache/$rerere_id/postimage &&
 | |
| 	(cd fi && git checkout -m le) &&
 | |
| 	echo resurrect the conflict &&
 | |
| 	grep "^=======" fi/le &&
 | |
| 	echo reresolve the conflict &&
 | |
| 	(cd fi && git rerere) &&
 | |
| 	test "z$(cat fi/le)" = zdifferent &&
 | |
| 	echo register the resolution again &&
 | |
| 	(cd fi && git add le) &&
 | |
| 	check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
 | |
| 	test -z "$(git ls-files -u)" &&
 | |
| 	(cd fi && git rerere forget le) &&
 | |
| 	! test -f .git/rr-cache/$rerere_id/postimage &&
 | |
| 	tr "\0" "\n" <.git/MERGE_RR >actual &&
 | |
| 	echo "$rerere_id	fi/le" >expect &&
 | |
| 	test_cmp expect actual
 | |
| '
 | |
| 
 | |
| test_expect_success 'rerere forget (binary)' '
 | |
| 	git checkout -f side &&
 | |
| 	printf "a\0c" >binary &&
 | |
| 	git commit -a -m binary &&
 | |
| 	test_must_fail git merge second &&
 | |
| 	git rerere forget binary
 | |
| '
 | |
| 
 | |
| test_expect_success 'rerere forget (add-add conflict)' '
 | |
| 	git checkout -f master &&
 | |
| 	echo master >add-differently &&
 | |
| 	git add add-differently &&
 | |
| 	git commit -m "add differently" &&
 | |
| 	test_must_fail git merge fifth &&
 | |
| 	git rerere forget add-differently 2>actual &&
 | |
| 	test_i18ngrep "no remembered" actual
 | |
| '
 | |
| 
 | |
| test_done
 |