| #!/bin/sh | 
 |  | 
 | test_description="merges with unrelated index changes" | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | # Testcase for some simple merges | 
 | #   A | 
 | #   o-------o B | 
 | #    \ | 
 | #     \-----o C | 
 | #      \ | 
 | #       \---o D | 
 | #        \ | 
 | #         \-o E | 
 | #          \ | 
 | #           o F | 
 | #   Commit A: some file a | 
 | #   Commit B: adds file b, modifies end of a | 
 | #   Commit C: adds file c | 
 | #   Commit D: adds file d, modifies beginning of a | 
 | #   Commit E: renames a->subdir/a, adds subdir/e | 
 | #   Commit F: empty commit | 
 |  | 
 | test_expect_success 'setup trivial merges' ' | 
 | 	test_seq 1 10 >a && | 
 | 	git add a && | 
 | 	test_tick && git commit -m A && | 
 |  | 
 | 	git branch A && | 
 | 	git branch B && | 
 | 	git branch C && | 
 | 	git branch D && | 
 | 	git branch E && | 
 | 	git branch F && | 
 |  | 
 | 	git checkout B && | 
 | 	echo b >b && | 
 | 	echo 11 >>a && | 
 | 	git add a b && | 
 | 	test_tick && git commit -m B && | 
 |  | 
 | 	git checkout C && | 
 | 	echo c >c && | 
 | 	git add c && | 
 | 	test_tick && git commit -m C && | 
 |  | 
 | 	git checkout D && | 
 | 	test_seq 2 10 >a && | 
 | 	echo d >d && | 
 | 	git add a d && | 
 | 	test_tick && git commit -m D && | 
 |  | 
 | 	git checkout E && | 
 | 	mkdir subdir && | 
 | 	git mv a subdir/a && | 
 | 	echo e >subdir/e && | 
 | 	git add subdir && | 
 | 	test_tick && git commit -m E && | 
 |  | 
 | 	git checkout F && | 
 | 	test_tick && git commit --allow-empty -m F | 
 | ' | 
 |  | 
 | test_expect_success 'ff update' ' | 
 | 	git reset --hard && | 
 | 	git checkout A^0 && | 
 |  | 
 | 	touch random_file && git add random_file && | 
 |  | 
 | 	git merge E^0 && | 
 |  | 
 | 	test_must_fail git rev-parse HEAD:random_file && | 
 | 	test "$(git diff --name-only --cached E)" = "random_file" | 
 | ' | 
 |  | 
 | test_expect_success 'ff update, important file modified' ' | 
 | 	git reset --hard && | 
 | 	git checkout A^0 && | 
 |  | 
 | 	mkdir subdir && | 
 | 	touch subdir/e && | 
 | 	git add subdir/e && | 
 |  | 
 | 	test_must_fail git merge E^0 && | 
 | 	test_path_is_missing .git/MERGE_HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'resolve, trivial' ' | 
 | 	git reset --hard && | 
 | 	git checkout B^0 && | 
 |  | 
 | 	touch random_file && git add random_file && | 
 |  | 
 | 	test_must_fail git merge -s resolve C^0 && | 
 | 	test_path_is_missing .git/MERGE_HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'resolve, non-trivial' ' | 
 | 	git reset --hard && | 
 | 	git checkout B^0 && | 
 |  | 
 | 	touch random_file && git add random_file && | 
 |  | 
 | 	test_must_fail git merge -s resolve D^0 && | 
 | 	test_path_is_missing .git/MERGE_HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'recursive' ' | 
 | 	git reset --hard && | 
 | 	git checkout B^0 && | 
 |  | 
 | 	touch random_file && git add random_file && | 
 |  | 
 | 	test_must_fail git merge -s recursive C^0 && | 
 | 	test_path_is_missing .git/MERGE_HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'recursive, when merge branch matches merge base' ' | 
 | 	git reset --hard && | 
 | 	git checkout B^0 && | 
 |  | 
 | 	touch random_file && git add random_file && | 
 |  | 
 | 	test_must_fail git merge -s recursive F^0 && | 
 | 	test_path_is_missing .git/MERGE_HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'merge-recursive, when index==head but head!=HEAD' ' | 
 | 	git reset --hard && | 
 | 	git checkout C^0 && | 
 |  | 
 | 	# Make index match B | 
 | 	git diff C B -- | git apply --cached && | 
 | 	# Merge B & F, with B as "head" | 
 | 	git merge-recursive A -- B F > out && | 
 | 	test_i18ngrep "Already up to date" out | 
 | ' | 
 |  | 
 | test_expect_success 'recursive, when file has staged changes not matching HEAD nor what a merge would give' ' | 
 | 	git reset --hard && | 
 | 	git checkout B^0 && | 
 |  | 
 | 	mkdir subdir && | 
 | 	test_seq 1 10 >subdir/a && | 
 | 	git add subdir/a && | 
 |  | 
 | 	# We have staged changes; merge should error out | 
 | 	test_must_fail git merge -s recursive E^0 2>err && | 
 | 	test_i18ngrep "changes to the following files would be overwritten" err | 
 | ' | 
 |  | 
 | test_expect_success 'recursive, when file has staged changes matching what a merge would give' ' | 
 | 	git reset --hard && | 
 | 	git checkout B^0 && | 
 |  | 
 | 	mkdir subdir && | 
 | 	test_seq 1 11 >subdir/a && | 
 | 	git add subdir/a && | 
 |  | 
 | 	# We have staged changes; merge should error out | 
 | 	test_must_fail git merge -s recursive E^0 2>err && | 
 | 	test_i18ngrep "changes to the following files would be overwritten" err | 
 | ' | 
 |  | 
 | test_expect_success 'octopus, unrelated file touched' ' | 
 | 	git reset --hard && | 
 | 	git checkout B^0 && | 
 |  | 
 | 	touch random_file && git add random_file && | 
 |  | 
 | 	test_must_fail git merge C^0 D^0 && | 
 | 	test_path_is_missing .git/MERGE_HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'octopus, related file removed' ' | 
 | 	git reset --hard && | 
 | 	git checkout B^0 && | 
 |  | 
 | 	git rm b && | 
 |  | 
 | 	test_must_fail git merge C^0 D^0 && | 
 | 	test_path_is_missing .git/MERGE_HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'octopus, related file modified' ' | 
 | 	git reset --hard && | 
 | 	git checkout B^0 && | 
 |  | 
 | 	echo 12 >>a && git add a && | 
 |  | 
 | 	test_must_fail git merge C^0 D^0 && | 
 | 	test_path_is_missing .git/MERGE_HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'ours' ' | 
 | 	git reset --hard && | 
 | 	git checkout B^0 && | 
 |  | 
 | 	touch random_file && git add random_file && | 
 |  | 
 | 	test_must_fail git merge -s ours C^0 && | 
 | 	test_path_is_missing .git/MERGE_HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'subtree' ' | 
 | 	git reset --hard && | 
 | 	git checkout B^0 && | 
 |  | 
 | 	touch random_file && git add random_file && | 
 |  | 
 | 	test_must_fail git merge -s subtree E^0 && | 
 | 	test_path_is_missing .git/MERGE_HEAD | 
 | ' | 
 |  | 
 | test_done |