| #!/bin/sh | 
 |  | 
 | test_description='git-merge | 
 |  | 
 | Do not overwrite changes.' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | test_expect_success 'setup' ' | 
 | 	test_commit c0 c0.c && | 
 | 	test_commit c1 c1.c && | 
 | 	test_commit c1a c1.c "c1 a" && | 
 | 	git reset --hard c0 && | 
 | 	test_commit c2 c2.c && | 
 | 	git reset --hard c0 && | 
 | 	mkdir sub && | 
 | 	echo "sub/f" > sub/f && | 
 | 	mkdir sub2 && | 
 | 	echo "sub2/f" > sub2/f && | 
 | 	git add sub/f sub2/f && | 
 | 	git commit -m sub && | 
 | 	git tag sub && | 
 | 	echo "VERY IMPORTANT CHANGES" > important | 
 | ' | 
 |  | 
 | test_expect_success 'will not overwrite untracked file' ' | 
 | 	git reset --hard c1 && | 
 | 	cp important c2.c && | 
 | 	test_must_fail git merge c2 && | 
 | 	test_path_is_missing .git/MERGE_HEAD && | 
 | 	test_cmp important c2.c | 
 | ' | 
 |  | 
 | test_expect_success 'will overwrite tracked file' ' | 
 | 	git reset --hard c1 && | 
 | 	cp important c2.c && | 
 | 	git add c2.c && | 
 | 	git commit -m important && | 
 | 	git checkout c2 | 
 | ' | 
 |  | 
 | test_expect_success 'will not overwrite new file' ' | 
 | 	git reset --hard c1 && | 
 | 	cp important c2.c && | 
 | 	git add c2.c && | 
 | 	test_must_fail git merge c2 && | 
 | 	test_path_is_missing .git/MERGE_HEAD && | 
 | 	test_cmp important c2.c | 
 | ' | 
 |  | 
 | test_expect_success 'will not overwrite staged changes' ' | 
 | 	git reset --hard c1 && | 
 | 	cp important c2.c && | 
 | 	git add c2.c && | 
 | 	rm c2.c && | 
 | 	test_must_fail git merge c2 && | 
 | 	test_path_is_missing .git/MERGE_HEAD && | 
 | 	git checkout c2.c && | 
 | 	test_cmp important c2.c | 
 | ' | 
 |  | 
 | test_expect_success 'will not overwrite removed file' ' | 
 | 	git reset --hard c1 && | 
 | 	git rm c1.c && | 
 | 	git commit -m "rm c1.c" && | 
 | 	cp important c1.c && | 
 | 	test_must_fail git merge c1a && | 
 | 	test_cmp important c1.c | 
 | ' | 
 |  | 
 | test_expect_success 'will not overwrite re-added file' ' | 
 | 	git reset --hard c1 && | 
 | 	git rm c1.c && | 
 | 	git commit -m "rm c1.c" && | 
 | 	cp important c1.c && | 
 | 	git add c1.c && | 
 | 	test_must_fail git merge c1a && | 
 | 	test_path_is_missing .git/MERGE_HEAD && | 
 | 	test_cmp important c1.c | 
 | ' | 
 |  | 
 | test_expect_success 'will not overwrite removed file with staged changes' ' | 
 | 	git reset --hard c1 && | 
 | 	git rm c1.c && | 
 | 	git commit -m "rm c1.c" && | 
 | 	cp important c1.c && | 
 | 	git add c1.c && | 
 | 	rm c1.c && | 
 | 	test_must_fail git merge c1a && | 
 | 	test_path_is_missing .git/MERGE_HEAD && | 
 | 	git checkout c1.c && | 
 | 	test_cmp important c1.c | 
 | ' | 
 |  | 
 | test_expect_success 'will not overwrite untracked subtree' ' | 
 | 	git reset --hard c0 && | 
 | 	rm -rf sub && | 
 | 	mkdir -p sub/f && | 
 | 	cp important sub/f/important && | 
 | 	test_must_fail git merge sub && | 
 | 	test_path_is_missing .git/MERGE_HEAD && | 
 | 	test_cmp important sub/f/important | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | error: The following untracked working tree files would be overwritten by merge: | 
 | 	sub | 
 | 	sub2 | 
 | Please move or remove them before you can merge. | 
 | Aborting | 
 | EOF | 
 |  | 
 | test_expect_success 'will not overwrite untracked file in leading path' ' | 
 | 	git reset --hard c0 && | 
 | 	rm -rf sub && | 
 | 	cp important sub && | 
 | 	cp important sub2 && | 
 | 	test_must_fail git merge sub 2>out && | 
 | 	test_cmp out expect && | 
 | 	test_path_is_missing .git/MERGE_HEAD && | 
 | 	test_cmp important sub && | 
 | 	test_cmp important sub2 && | 
 | 	rm -f sub sub2 | 
 | ' | 
 |  | 
 | test_expect_success SYMLINKS 'will not overwrite untracked symlink in leading path' ' | 
 | 	git reset --hard c0 && | 
 | 	rm -rf sub && | 
 | 	mkdir sub2 && | 
 | 	ln -s sub2 sub && | 
 | 	test_must_fail git merge sub && | 
 | 	test_path_is_missing .git/MERGE_HEAD | 
 | ' | 
 |  | 
 | test_expect_success SYMLINKS 'will not be confused by symlink in leading path' ' | 
 | 	git reset --hard c0 && | 
 | 	rm -rf sub && | 
 | 	ln -s sub2 sub && | 
 | 	git add sub && | 
 | 	git commit -m ln && | 
 | 	git checkout sub | 
 | ' | 
 |  | 
 | cat >expect <<\EOF | 
 | error: Untracked working tree file 'c0.c' would be overwritten by merge. | 
 | fatal: read-tree failed | 
 | EOF | 
 |  | 
 | test_expect_success 'will not overwrite untracked file on unborn branch' ' | 
 | 	git reset --hard c0 && | 
 | 	git rm -fr . && | 
 | 	git checkout --orphan new && | 
 | 	cp important c0.c && | 
 | 	test_must_fail git merge c0 2>out && | 
 | 	test_i18ncmp out expect | 
 | ' | 
 |  | 
 | test_expect_success 'will not overwrite untracked file on unborn branch .git/MERGE_HEAD sanity etc.' ' | 
 | 	test_when_finished "rm c0.c" && | 
 | 	test_path_is_missing .git/MERGE_HEAD && | 
 | 	test_cmp important c0.c | 
 | ' | 
 |  | 
 | test_expect_success 'failed merge leaves unborn branch in the womb' ' | 
 | 	test_must_fail git rev-parse --verify HEAD | 
 | ' | 
 |  | 
 | test_expect_success 'set up unborn branch and content' ' | 
 | 	git symbolic-ref HEAD refs/heads/unborn && | 
 | 	rm -f .git/index && | 
 | 	echo foo > tracked-file && | 
 | 	git add tracked-file && | 
 | 	echo bar > untracked-file | 
 | ' | 
 |  | 
 | test_expect_success 'will not clobber WT/index when merging into unborn' ' | 
 | 	git merge master && | 
 | 	grep foo tracked-file && | 
 | 	git show :tracked-file >expect && | 
 | 	grep foo expect && | 
 | 	grep bar untracked-file | 
 | ' | 
 |  | 
 | test_done |