[PATCH] Diff overhaul, adding the other half of copy detection.
authorJunio C Hamano <junkio@cox.net>
Sat, 21 May 2005 09:42:35 +0000 (02:42 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Sat, 21 May 2005 16:58:03 +0000 (09:58 -0700)
This patch extends diff-cache and diff-files to report the
unmodified files to diff-core as well when -C (copy detection)
is in effect, so that the unmodified files can also be used as
the source candidates.  The existing test t4003 has been
extended to cover this case.

Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
diff-cache.c
diff-files.c
t/t4003-diff-rename-1.sh

index a5deb8c..b47b45a 100644 (file)
@@ -71,7 +71,8 @@ static int show_modified(struct cache_entry *old,
        }
 
        oldmode = old->ce_mode;
-       if (mode == oldmode && !memcmp(sha1, old->sha1, 20))
+       if (mode == oldmode && !memcmp(sha1, old->sha1, 20) &&
+           detect_rename < 2)
                return 0;
 
        mode = ntohl(mode);
index d3b80a0..a3c523f 100644 (file)
@@ -126,7 +126,7 @@ int main(int argc, char **argv)
                        continue;
                }
                changed = ce_match_stat(ce, &st);
-               if (!changed)
+               if (!changed && detect_rename < 2)
                        continue;
 
                oldmode = ntohl(ce->ce_mode);
index 20d8ac5..fc77389 100644 (file)
@@ -22,6 +22,10 @@ test_expect_success \
     rm -f COPYING &&
     git-update-cache --add --remove COPYING COPYING.?'
 
+# tree has COPYING.  work tree has COPYING.1 and COPYING.2,
+# both are slightly edited.  So we say you copy-and-edit one,
+# and rename-and-edit the other.
+
 GIT_DIFF_OPTS=-u0 git-diff-cache -M $tree |
 sed -e 's/\([0-9][0-9]*\)/#/g' >current &&
 cat >expected <<\EOF
@@ -58,7 +62,11 @@ test_expect_success \
 test_expect_success \
     'prepare work tree again' \
     'mv COPYING.2 COPYING &&
-     git-update-cache --add --remove COPYING COPYING.1'
+     git-update-cache --add --remove COPYING COPYING.1 COPYING.2'
+
+# tree has COPYING.  work tree has COPYING and COPYING.1,
+# both are slightly edited.  So we say you edited one,
+# and copy-and-edit the other.
 
 GIT_DIFF_OPTS=-u0 git-diff-cache -C $tree |
 sed -e 's/\([0-9][0-9]*\)/#/g' >current
@@ -90,4 +98,32 @@ test_expect_success \
     'validate output from rename/copy detection' \
     'diff -u current expected'
 
+test_expect_success \
+    'prepare work tree once again' \
+    'cat ../../COPYING >COPYING &&
+     git-update-cache --add --remove COPYING COPYING.1'
+
+# tree has COPYING.  work tree has the same COPYING and COPYING.1,
+# but COPYING is not edited.  We say you copy-and-edit COPYING.1;
+# this is only possible because -C mode now reports the unmodified
+# file to the diff-core.
+
+GIT_DIFF_OPTS=-u0 git-diff-cache -C $tree |
+sed -e 's/\([0-9][0-9]*\)/#/g' >current
+cat >expected <<\EOF
+diff --git a/COPYING b/COPYING.#
+similarity index #%
+copy from COPYING
+copy to COPYING.#
+--- a/COPYING
++++ b/COPYING.#
+@@ -# +# @@
+- HOWEVER, in order to allow a migration to GPLv# if that seems like
++ However, in order to allow a migration to GPLv# if that seems like
+EOF
+
+test_expect_success \
+    'validate output from rename/copy detection' \
+    'diff -u current expected'
+
 test_done