branch: allow a no-op "branch -M <current-branch> HEAD"
[gitweb.git] / t / t6020-merge-df.sh
index 490d3971142a87e940f3d27e7e7f068b276ff602..27c3d73961dfc9b50c3eafc7360662076cb31260 100755 (executable)
@@ -6,21 +6,26 @@
 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 commit" &&
-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_code 1 'Merge with d/f conflicts' 'git merge "merge msg" B master'
+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 &&
@@ -45,4 +50,61 @@ test_expect_success 'F/D conflict' '
        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