Browse Source

[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>
maint
Junio C Hamano 20 years ago committed by Linus Torvalds
parent
commit
c3e7fbcbd0
  1. 3
      diff-cache.c
  2. 2
      diff-files.c
  3. 38
      t/t4003-diff-rename-1.sh

3
diff-cache.c

@ -71,7 +71,8 @@ static int show_modified(struct cache_entry *old, @@ -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);

2
diff-files.c

@ -126,7 +126,7 @@ int main(int argc, char **argv) @@ -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);

38
t/t4003-diff-rename-1.sh

@ -22,6 +22,10 @@ test_expect_success \ @@ -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 \ @@ -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
@ -86,6 +94,34 @@ diff --git a/COPYING b/COPYING @@ -86,6 +94,34 @@ diff --git a/COPYING b/COPYING
+ This file is licensed under the G.P.L v#, or a later version
EOF

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'

Loading…
Cancel
Save