diff options
author | Junio C Hamano <junkio@cox.net> | 2005-05-25 16:00:04 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-25 16:06:24 -0700 |
commit | 9fdade06739af0b3e27422a973ae4fd83e3c918e (patch) | |
tree | 9112544543b2a807d3ca2cce5f6e4e0d6e391f38 | |
parent | 96716a197658e069557e7615ce2019107d72225e (diff) | |
download | git-9fdade06739af0b3e27422a973ae4fd83e3c918e.tar.gz |
[PATCH] Mode only changes from diff.
This fixes another bug.
- Mode-only changes were pruned incorrectly from the output.
- Added test to catch the above problem.
- Normalize rename/copy similarity score in the diff-raw output
to per-cent, no matter what scale we internally use.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | diff-helper.c | 2 | ||||
-rw-r--r-- | diff.c | 6 | ||||
-rw-r--r-- | t/t4006-diff-mode.sh | 34 |
3 files changed, 40 insertions, 2 deletions
diff --git a/diff-helper.c b/diff-helper.c index 4da2614fc6..2dd6bdac33 100644 --- a/diff-helper.c +++ b/diff-helper.c @@ -4,6 +4,7 @@ #include "cache.h" #include "strbuf.h" #include "diff.h" +#include "diffcore.h" /* just for MAX_SCORE */ static const char *pickaxe = NULL; static int line_termination = '\n'; @@ -77,6 +78,7 @@ int main(int ac, const char **av) { if (status == 'R' || status == 'C') { two_paths = 1; sscanf(cp, "%d", &score); + score = score * MAX_SCORE / 100; if (line_termination) { cp = strchr(cp, inter_name_termination); @@ -517,7 +517,8 @@ static void diff_flush_raw(struct diff_filepair *p, switch (p->status) { case 'C': case 'R': two_paths = 1; - sprintf(status, "%c%1d", p->status, p->score); + sprintf(status, "%c%03d", p->status, + (int)(0.5 + p->score * 100.0/MAX_SCORE)); break; default: two_paths = 0; @@ -750,7 +751,8 @@ static void diff_resolve_rename_copy(void) if (!p->status) p->status = 'R'; } - else if (memcmp(p->one->sha1, p->two->sha1, 20)) + else if (memcmp(p->one->sha1, p->two->sha1, 20) || + p->one->mode != p->two->mode) p->status = 'M'; else /* this is a "no-change" entry */ diff --git a/t/t4006-diff-mode.sh b/t/t4006-diff-mode.sh new file mode 100644 index 0000000000..90fd21ff1f --- /dev/null +++ b/t/t4006-diff-mode.sh @@ -0,0 +1,34 @@ +#!/bin/sh +# +# Copyright (c) 2005 Junio C Hamano +# + +test_description='Test mode change diffs. + +' +. ./test-lib.sh + +test_expect_success \ + 'setup' \ + 'echo frotz >rezrov && + git-update-cache --add rezrov && + tree=`git-write-tree` && + echo $tree' + +test_expect_success \ + 'chmod' \ + 'chmod +x rezrov && + git-update-cache rezrov && + git-diff-cache $tree >current' + +_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]' +_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" +sed -e 's/\(:100644 100755\) \('"$_x40"'\) \2 /\1 X X /' <current >check +echo ":100644 100755 X X M rezrov" >expected + +test_expect_success \ + 'verify' \ + 'diff -u expected check' + +test_done + |