Code

merge: loosen overcautious "working file will be lost" check.
authorJunio C Hamano <junkio@cox.net>
Mon, 9 Oct 2006 05:48:06 +0000 (22:48 -0700)
committerJunio C Hamano <junkio@cox.net>
Sat, 28 Oct 2006 00:16:39 +0000 (17:16 -0700)
The three-way merge complained unconditionally when a path that
does not exist in the index is involved in a merge when it
existed in the working tree.  If we are merging an old version
that had that path tracked, but the path is not tracked anymore,
and if we are merging that old version in, the result will be
that the path is not tracked.  In that case we should not
complain.

Signed-off-by: Junio C Hamano <junkio@cox.net>
git-merge-one-file.sh
t/t1004-read-tree-m-u-wf.sh [new file with mode: 0755]
unpack-trees.c

index fba4b0cb5fffbb1ad3f39c670c6364975c52186a..c49e4c65af606496c7e65b5147e36fee105d9ae7 100755 (executable)
@@ -23,6 +23,12 @@ case "${1:-.}${2:-.}${3:-.}" in
 "$1.." | "$1.$1" | "$1$1.")
        if [ "$2" ]; then
                echo "Removing $4"
+       else
+               # read-tree checked that index matches HEAD already,
+               # so we know we do not have this path tracked.
+               # there may be an unrelated working tree file here,
+               # which we should just leave unmolested.
+               exit 0
        fi
        if test -f "$4"; then
                rm -f -- "$4" &&
@@ -34,8 +40,16 @@ case "${1:-.}${2:-.}${3:-.}" in
 #
 # Added in one.
 #
-".$2." | "..$3" )
+".$2.")
+       # the other side did not add and we added so there is nothing
+       # to be done.
+       ;;
+"..$3")
        echo "Adding $4"
+       test -f "$4" || {
+               echo "ERROR: untracked $4 is overwritten by the merge."
+               exit 1
+       }
        git-update-index --add --cacheinfo "$6$7" "$2$3" "$4" &&
                exec git-checkout-index -u -f -- "$4"
        ;;
diff --git a/t/t1004-read-tree-m-u-wf.sh b/t/t1004-read-tree-m-u-wf.sh
new file mode 100755 (executable)
index 0000000..018fbea
--- /dev/null
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+test_description='read-tree -m -u checks working tree files'
+
+. ./test-lib.sh
+
+# two-tree test
+
+test_expect_success 'two-way setup' '
+
+       echo >file1 file one &&
+       echo >file2 file two &&
+       git update-index --add file1 file2 &&
+       git commit -m initial &&
+
+       git branch side &&
+       git tag -f branch-point &&
+
+       echo file2 is not tracked on the master anymore &&
+       rm -f file2 &&
+       git update-index --remove file2 &&
+       git commit -a -m "master removes file2"
+'
+
+test_expect_success 'two-way not clobbering' '
+
+       echo >file2 master creates untracked file2 &&
+       if err=`git read-tree -m -u master side 2>&1`
+       then
+               echo should have complained
+               false
+       else
+               echo "happy to see $err"
+       fi
+'
+
+# three-tree test
+
+test_expect_success 'three-way not complaining' '
+
+       rm -f file2 &&
+       git checkout side &&
+       echo >file3 file three &&
+       git update-index --add file3 &&
+       git commit -a -m "side adds file3" &&
+
+       git checkout master &&
+       echo >file2 file two is untracked on the master side &&
+
+       git-read-tree -m -u branch-point master side
+'
+
+test_done
index 3ac0289b3a3309fca9ade4e271dbd8b0d2f148ea..7cfd628d8e1c576115cb934e72138535fb7d2db3 100644 (file)
@@ -642,7 +642,7 @@ int threeway_merge(struct cache_entry **stages,
                    (remote_deleted && head && head_match)) {
                        if (index)
                                return deleted_entry(index, index, o);
-                       else if (path)
+                       else if (path && !head_deleted)
                                verify_absent(path, "removed", o);
                        return 0;
                }
@@ -661,8 +661,6 @@ int threeway_merge(struct cache_entry **stages,
        if (index) {
                verify_uptodate(index, o);
        }
-       else if (path)
-               verify_absent(path, "overwritten", o);
 
        o->nontrivial_merge = 1;