t6022: Add tests for reversing order of merges when D/F conflicts present
authorElijah Newren <newren@gmail.com>
Mon, 20 Sep 2010 08:28:38 +0000 (02:28 -0600)
committerJunio C Hamano <gitster@pobox.com>
Thu, 30 Sep 2010 00:32:36 +0000 (17:32 -0700)
When merging two branches with some path involved in a D/F conflict, the
choice of which branch to merge into the other matters for (at least) two
reasons: (1) whether the working copy has a directory full of files that
is in the way of a file, or a file exists that is in the way of a
directory of files, (2) when the directory full of files does not disappear
due to the merge, what files at the same paths should be renamed to
(e.g. filename~HEAD vs. filename~otherbranch).

Add some tests that reverse the merge order of two other tests, and which
verify the contents are as expected (namely, that the results are identical
other than modified-for-uniqueness filenames involving branch names).

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t6022-merge-rename.sh

index a992206077dfcae140a4259a821ad1168f401f39..2839dfb5e0ec7f20856e04faef13406dd95e3496 100755 (executable)
@@ -415,6 +415,28 @@ test_expect_failure 'Rename+D/F conflict; renamed file merges but dir in way' '
        test_cmp expected dir~HEAD
 '
 
+test_expect_failure 'Same as previous, but merged other way' '
+       git reset --hard &&
+       rm -rf dir~* &&
+       git checkout -q dir-in-way^0 &&
+       test_must_fail git merge --strategy=recursive renamed-file-has-no-conflicts >output 2>errors &&
+
+       ! grep "error: refusing to lose untracked file at" errors &&
+       grep "CONFLICT (delete/modify): dir/file-in-the-way" output &&
+       grep "Auto-merging dir" output &&
+       grep "Adding as dir~renamed-file-has-no-conflicts instead" output &&
+
+       test 2 = "$(git ls-files -u | wc -l)" &&
+       test 2 = "$(git ls-files -u dir/file-in-the-way | wc -l)" &&
+
+       test_must_fail git diff --quiet &&
+       test_must_fail git diff --cached --quiet &&
+
+       test -f dir/file-in-the-way &&
+       test -f dir~renamed-file-has-no-conflicts &&
+       test_cmp expected dir~renamed-file-has-no-conflicts
+'
+
 cat >expected <<\EOF &&
 1
 2
@@ -469,4 +491,40 @@ test_expect_failure 'Rename+D/F conflict; renamed file cannot merge and dir in t
        test_cmp expected dir~HEAD
 '
 
+cat >expected <<\EOF &&
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+<<<<<<< HEAD
+11
+=======
+12
+>>>>>>> renamed-file-has-conflicts
+EOF
+
+test_expect_failure 'Same as previous, but merged other way' '
+       git reset --hard &&
+       rm -rf dir~* &&
+       git checkout -q dir-in-way^0 &&
+       test_must_fail git merge --strategy=recursive renamed-file-has-conflicts &&
+
+       test 5 = "$(git ls-files -u | wc -l)" &&
+       test 3 = "$(git ls-files -u dir | grep -v file-in-the-way | wc -l)" &&
+       test 2 = "$(git ls-files -u dir/file-in-the-way | wc -l)" &&
+
+       test_must_fail git diff --quiet &&
+       test_must_fail git diff --cached --quiet &&
+
+       test -f dir/file-in-the-way &&
+       test -f dir~renamed-file-has-conflicts &&
+       test_cmp expected dir~renamed-file-has-conflicts
+'
+
 test_done