| #!/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 |