aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-05-21 02:42:35 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-21 09:58:03 -0700
commitc3e7fbcbd0561cd13abc8cefcea3e09ab6090d50 (patch)
treeee4065e9e7607efef9451ee696be44333496bccc
parent52e9578985fb636ec1d3f6cf794fdadd5ec896fc (diff)
downloadgit-c3e7fbcbd0561cd13abc8cefcea3e09ab6090d50.tar.gz
git-c3e7fbcbd0561cd13abc8cefcea3e09ab6090d50.tar.xz
[PATCH] Diff overhaul, adding the other half of copy detection.
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>
-rw-r--r--diff-cache.c3
-rw-r--r--diff-files.c2
-rw-r--r--t/t4003-diff-rename-1.sh38
3 files changed, 40 insertions, 3 deletions
diff --git a/diff-cache.c b/diff-cache.c
index a5deb8c7a..b47b45a40 100644
--- a/diff-cache.c
+++ b/diff-cache.c
@@ -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);
diff --git a/diff-files.c b/diff-files.c
index d3b80a072..a3c523ff6 100644
--- a/diff-files.c
+++ b/diff-files.c
@@ -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);
diff --git a/t/t4003-diff-rename-1.sh b/t/t4003-diff-rename-1.sh
index 20d8ac5f8..fc773897b 100644
--- a/t/t4003-diff-rename-1.sh
+++ b/t/t4003-diff-rename-1.sh
@@ -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