[PATCH] Mode only changes from diff.
authorJunio C Hamano <junkio@cox.net>
Wed, 25 May 2005 23:00:04 +0000 (16:00 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Wed, 25 May 2005 23:06:24 +0000 (16:06 -0700)
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>
diff-helper.c
diff.c
t/t4006-diff-mode.sh [new file with mode: 0644]

index 4da2614..2dd6bda 100644 (file)
@@ -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);
diff --git a/diff.c b/diff.c
index 8e3f495..dd4b4ff 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -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 (file)
index 0000000..90fd21f
--- /dev/null
@@ -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
+