diff --stat: do not run diff on indentical files
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 1 May 2012 17:10:15 +0000 (19:10 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 2 May 2012 04:29:03 +0000 (21:29 -0700)
If two objects are known to be equal, there is no point running the diff.

Signed-off-by: Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
diff --git a/diff.c b/diff.c
index e61ccd1123fcb909d72c002e61cd37c1ae5b49d7..8e61f4bf857eb80ec067336604fba2382eb4219c 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -2370,6 +2370,7 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
 {
        mmfile_t mf1, mf2;
        struct diffstat_file *data;
+       int same_contents;
 
        data = diffstat_add(diffstat, name_a, name_b);
 
@@ -2378,9 +2379,11 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
                return;
        }
 
+       same_contents = !hashcmp(one->sha1, two->sha1);
+
        if (diff_filespec_is_binary(one) || diff_filespec_is_binary(two)) {
                data->is_binary = 1;
-               if (!hashcmp(one->sha1, two->sha1)) {
+               if (same_contents) {
                        data->added = 0;
                        data->deleted = 0;
                } else {
@@ -2396,7 +2399,7 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
                data->added = count_lines(two->data, two->size);
        }
 
-       else {
+       else if (!same_contents) {
                /* Crazy xdl interfaces.. */
                xpparam_t xpp;
                xdemitconf_t xecfg;