| #!/bin/sh | 
 | # | 
 | # Copyright (c) 2005 Fredrik Kuivinen | 
 | # | 
 |  | 
 | test_description='Test merge with directory/file conflicts' | 
 | . ./test-lib.sh | 
 |  | 
 | test_expect_success 'prepare repository' ' | 
 | 	echo Hello >init && | 
 | 	git add init && | 
 | 	git commit -m initial && | 
 |  | 
 | 	git branch B && | 
 | 	mkdir dir && | 
 | 	echo foo >dir/foo && | 
 | 	git add dir/foo && | 
 | 	git commit -m "File: dir/foo" && | 
 |  | 
 | 	git checkout B && | 
 | 	echo file dir >dir && | 
 | 	git add dir && | 
 | 	git commit -m "File: dir" | 
 | ' | 
 |  | 
 | test_expect_success 'Merge with d/f conflicts' ' | 
 | 	test_expect_code 1 git merge "merge msg" B master | 
 | ' | 
 |  | 
 | test_expect_success 'F/D conflict' ' | 
 | 	git reset --hard && | 
 | 	git checkout master && | 
 | 	rm .git/index && | 
 |  | 
 | 	mkdir before && | 
 | 	echo FILE >before/one && | 
 | 	echo FILE >after && | 
 | 	git add . && | 
 | 	git commit -m first && | 
 |  | 
 | 	rm -f after && | 
 | 	git mv before after && | 
 | 	git commit -m move && | 
 |  | 
 | 	git checkout -b para HEAD^ && | 
 | 	echo COMPLETELY ANOTHER FILE >another && | 
 | 	git add . && | 
 | 	git commit -m para && | 
 |  | 
 | 	git merge master | 
 | ' | 
 |  | 
 | test_expect_success 'setup modify/delete + directory/file conflict' ' | 
 | 	git checkout --orphan modify && | 
 | 	git rm -rf . && | 
 | 	git clean -fdqx && | 
 |  | 
 | 	printf "a\nb\nc\nd\ne\nf\ng\nh\n" >letters && | 
 | 	git add letters && | 
 | 	git commit -m initial && | 
 |  | 
 | 	# Throw in letters.txt for sorting order fun | 
 | 	# ("letters.txt" sorts between "letters" and "letters/file") | 
 | 	echo i >>letters && | 
 | 	echo "version 2" >letters.txt && | 
 | 	git add letters letters.txt && | 
 | 	git commit -m modified && | 
 |  | 
 | 	git checkout -b delete HEAD^ && | 
 | 	git rm letters && | 
 | 	mkdir letters && | 
 | 	>letters/file && | 
 | 	echo "version 1" >letters.txt && | 
 | 	git add letters letters.txt && | 
 | 	git commit -m deleted | 
 | ' | 
 |  | 
 | test_expect_success 'modify/delete + directory/file conflict' ' | 
 | 	git checkout delete^0 && | 
 | 	test_must_fail git merge modify && | 
 |  | 
 | 	test 5 -eq $(git ls-files -s | wc -l) && | 
 | 	test 4 -eq $(git ls-files -u | wc -l) && | 
 | 	test 1 -eq $(git ls-files -o | wc -l) && | 
 |  | 
 | 	test -f letters/file && | 
 | 	test -f letters.txt && | 
 | 	test -f letters~modify | 
 | ' | 
 |  | 
 | test_expect_success 'modify/delete + directory/file conflict; other way' ' | 
 | 	# Yes, we really need the double reset since "letters" appears as | 
 | 	# both a file and a directory. | 
 | 	git reset --hard && | 
 | 	git reset --hard && | 
 | 	git clean -f && | 
 | 	git checkout modify^0 && | 
 |  | 
 | 	test_must_fail git merge delete && | 
 |  | 
 | 	test 5 -eq $(git ls-files -s | wc -l) && | 
 | 	test 4 -eq $(git ls-files -u | wc -l) && | 
 | 	test 1 -eq $(git ls-files -o | wc -l) && | 
 |  | 
 | 	test -f letters/file && | 
 | 	test -f letters.txt && | 
 | 	test -f letters~HEAD | 
 | ' | 
 |  | 
 | test_done |