git-merge-one-file: fix longstanding stupid thinko
authorJunio C Hamano <gitster@pobox.com>
Mon, 17 Mar 2008 23:47:18 +0000 (16:47 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 19 Mar 2008 05:17:17 +0000 (22:17 -0700)
When a merge result creates a new file, and when our side already has a
file in the path, taking the merge result may clobber the untracked file.
However, the logic to detect this situation was totally the wrong way.  We
should complain when the file exists, not when the file does not exist.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-merge-one-file.sh
t/t1004-read-tree-m-u-wf.sh

index 9ee3f804520eadb322de3d0ea70a2bf9f092b089..e1eb9632660146396a0b5f3f2a410d8cb027ff9d 100755 (executable)
@@ -48,10 +48,11 @@ case "${1:-.}${2:-.}${3:-.}" in
        ;;
 "..$3")
        echo "Adding $4"
-       test -f "$4" || {
+       if test -f "$4"
+       then
                echo "ERROR: untracked $4 is overwritten by the merge."
                exit 1
-       }
+       fi
        git update-index --add --cacheinfo "$7" "$3" "$4" &&
                exec git checkout-index -u -f -- "$4"
        ;;
index 9d1371c2c61fd9fb57e3719590d601c3b9ad21b2..283e77cc51d241bedbd016bbfa4d418e521e49e8 100755 (executable)
@@ -157,4 +157,50 @@ test_expect_success '3-way not overwriting local changes (their side)' '
 
 '
 
+test_expect_success 'D/F setup' '
+
+       git reset --hard &&
+
+       git checkout side-a &&
+       rm -f subdir/file2 &&
+       mkdir subdir/file2 &&
+       echo qfwfq >subdir/file2/another &&
+       git add subdir/file2/another &&
+       test_tick &&
+       git commit -m "side-a changes file2 to directory"
+
+'
+
+test_expect_success 'D/F' '
+
+       git checkout side-b &&
+       git read-tree -m -u branch-point side-b side-a &&
+       git ls-files -u >actual &&
+       (
+               a=$(git rev-parse branch-point:subdir/file2)
+               b=$(git rev-parse side-a:subdir/file2/another)
+               echo "100644 $a 1       subdir/file2"
+               echo "100644 $a 2       subdir/file2"
+               echo "100644 $b 3       subdir/file2/another"
+       ) >expect &&
+       test_cmp actual expect
+
+'
+
+test_expect_success 'D/F resolve' '
+
+       git reset --hard &&
+       git checkout side-b &&
+       git merge-resolve branch-point -- side-b side-a
+
+'
+
+test_expect_success 'D/F recursive' '
+
+       git reset --hard &&
+       git checkout side-b &&
+       git merge-recursive branch-point -- side-b side-a
+
+'
+
 test_done