| #!/bin/sh | 
 |  | 
 | test_description='git apply --3way' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | create_file () { | 
 | 	for i | 
 | 	do | 
 | 		echo "$i" | 
 | 	done | 
 | } | 
 |  | 
 | sanitize_conflicted_diff () { | 
 | 	sed -e ' | 
 | 		/^index /d | 
 | 		s/^\(+[<>][<>][<>][<>]*\) .*/\1/ | 
 | 	' | 
 | } | 
 |  | 
 | test_expect_success setup ' | 
 | 	test_tick && | 
 | 	create_file >one 1 2 3 4 5 6 7 && | 
 | 	cat one >two && | 
 | 	git add one two && | 
 | 	git commit -m initial && | 
 |  | 
 | 	git branch side && | 
 |  | 
 | 	test_tick && | 
 | 	create_file >one 1 two 3 4 5 six 7 && | 
 | 	create_file >two 1 two 3 4 5 6 7 && | 
 | 	git commit -a -m master && | 
 |  | 
 | 	git checkout side && | 
 | 	create_file >one 1 2 3 4 five 6 7 && | 
 | 	create_file >two 1 2 3 4 five 6 7 && | 
 | 	git commit -a -m side && | 
 |  | 
 | 	git checkout master | 
 | ' | 
 |  | 
 | test_expect_success 'apply without --3way' ' | 
 | 	git diff side^ side >P.diff && | 
 |  | 
 | 	# should fail to apply | 
 | 	git reset --hard && | 
 | 	git checkout master^0 && | 
 | 	test_must_fail git apply --index P.diff && | 
 | 	# should leave things intact | 
 | 	git diff-files --exit-code && | 
 | 	git diff-index --exit-code --cached HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'apply with --3way' ' | 
 | 	# Merging side should be similar to applying this patch | 
 | 	git diff ...side >P.diff && | 
 |  | 
 | 	# The corresponding conflicted merge | 
 | 	git reset --hard && | 
 | 	git checkout master^0 && | 
 | 	test_must_fail git merge --no-commit side && | 
 | 	git ls-files -s >expect.ls && | 
 | 	git diff HEAD | sanitize_conflicted_diff >expect.diff && | 
 |  | 
 | 	# should fail to apply | 
 | 	git reset --hard && | 
 | 	git checkout master^0 && | 
 | 	test_must_fail git apply --index --3way P.diff && | 
 | 	git ls-files -s >actual.ls && | 
 | 	git diff HEAD | sanitize_conflicted_diff >actual.diff && | 
 |  | 
 | 	# The result should resemble the corresponding merge | 
 | 	test_cmp expect.ls actual.ls && | 
 | 	test_cmp expect.diff actual.diff | 
 | ' | 
 |  | 
 | test_expect_success 'apply with --3way with rerere enabled' ' | 
 | 	git config rerere.enabled true && | 
 |  | 
 | 	# Merging side should be similar to applying this patch | 
 | 	git diff ...side >P.diff && | 
 |  | 
 | 	# The corresponding conflicted merge | 
 | 	git reset --hard && | 
 | 	git checkout master^0 && | 
 | 	test_must_fail git merge --no-commit side && | 
 |  | 
 | 	# Manually resolve and record the resolution | 
 | 	create_file 1 two 3 4 five six 7 >one && | 
 | 	git rerere && | 
 | 	cat one >expect && | 
 |  | 
 | 	# should fail to apply | 
 | 	git reset --hard && | 
 | 	git checkout master^0 && | 
 | 	test_must_fail git apply --index --3way P.diff && | 
 |  | 
 | 	# but rerere should have replayed the recorded resolution | 
 | 	test_cmp expect one | 
 | ' | 
 |  | 
 | test_expect_success 'apply -3 with add/add conflict setup' ' | 
 | 	git reset --hard && | 
 |  | 
 | 	git checkout -b adder && | 
 | 	create_file 1 2 3 4 5 6 7 >three && | 
 | 	create_file 1 2 3 4 5 6 7 >four && | 
 | 	git add three four && | 
 | 	git commit -m "add three and four" && | 
 |  | 
 | 	git checkout -b another adder^ && | 
 | 	create_file 1 2 3 4 5 6 7 >three && | 
 | 	create_file 1 2 3 four 5 6 7 >four && | 
 | 	git add three four && | 
 | 	git commit -m "add three and four" && | 
 |  | 
 | 	# Merging another should be similar to applying this patch | 
 | 	git diff adder...another >P.diff && | 
 |  | 
 | 	git checkout adder^0 && | 
 | 	test_must_fail git merge --no-commit another && | 
 | 	git ls-files -s >expect.ls && | 
 | 	git diff HEAD | sanitize_conflicted_diff >expect.diff | 
 | ' | 
 |  | 
 | test_expect_success 'apply -3 with add/add conflict' ' | 
 | 	# should fail to apply ... | 
 | 	git reset --hard && | 
 | 	git checkout adder^0 && | 
 | 	test_must_fail git apply --index --3way P.diff && | 
 | 	# ... and leave conflicts in the index and in the working tree | 
 | 	git ls-files -s >actual.ls && | 
 | 	git diff HEAD | sanitize_conflicted_diff >actual.diff && | 
 |  | 
 | 	# The result should resemble the corresponding merge | 
 | 	test_cmp expect.ls actual.ls && | 
 | 	test_cmp expect.diff actual.diff | 
 | ' | 
 |  | 
 | test_expect_success 'apply -3 with add/add conflict (dirty working tree)' ' | 
 | 	# should fail to apply ... | 
 | 	git reset --hard && | 
 | 	git checkout adder^0 && | 
 | 	echo >>four && | 
 | 	cat four >four.save && | 
 | 	cat three >three.save && | 
 | 	git ls-files -s >expect.ls && | 
 | 	test_must_fail git apply --index --3way P.diff && | 
 | 	# ... and should not touch anything | 
 | 	git ls-files -s >actual.ls && | 
 | 	test_cmp expect.ls actual.ls && | 
 | 	test_cmp four.save four && | 
 | 	test_cmp three.save three | 
 | ' | 
 |  | 
 | test_done |