diff: shortcut for diff'ing two binary SHA-1 objects
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Sat, 16 Aug 2014 03:08:06 +0000 (10:08 +0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 18 Aug 2014 17:16:55 +0000 (10:16 -0700)
If we are given two SHA-1 and asked to determine if they are different
(but not _what_ differences), we know right away by comparing SHA-1.

A side effect of this patch is, because large files are marked binary,
diff-tree will not need to unpack them. 'diff-index --cached' will not
either. But 'diff-files' still does.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff.c
t/t1050-large.sh
diff --git a/diff.c b/diff.c
index d381a6f446f36c441396077075d33d0daefd4b71..b85bcfbf52e52dbd5521dde1078de9593d772f67 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -2324,6 +2324,19 @@ static void builtin_diff(const char *name_a,
        } else if (!DIFF_OPT_TST(o, TEXT) &&
            ( (!textconv_one && diff_filespec_is_binary(one)) ||
              (!textconv_two && diff_filespec_is_binary(two)) )) {
+               if (!one->data && !two->data &&
+                   S_ISREG(one->mode) && S_ISREG(two->mode) &&
+                   !DIFF_OPT_TST(o, BINARY)) {
+                       if (!hashcmp(one->sha1, two->sha1)) {
+                               if (must_show_header)
+                                       fprintf(o->file, "%s", header.buf);
+                               goto free_ab_and_return;
+                       }
+                       fprintf(o->file, "%s", header.buf);
+                       fprintf(o->file, "%sBinary files %s and %s differ\n",
+                               line_prefix, lbl[0], lbl[1]);
+                       goto free_ab_and_return;
+               }
                if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
                        die("unable to read files to diff");
                /* Quite common confusing case */
index 00d2f33df0d9ff6110a649d06c954bde6aaf83ed..05a1e1d270d2f6254658607541f1b114299533e5 100755 (executable)
@@ -116,6 +116,16 @@ test_expect_success 'diff --stat' '
        git diff --stat HEAD^ HEAD
 '
 
+test_expect_success 'diff' '
+       git diff HEAD^ HEAD >actual &&
+       grep "Binary files.*differ" actual
+'
+
+test_expect_success 'diff --cached' '
+       git diff --cached HEAD^ >actual &&
+       grep "Binary files.*differ" actual
+'
+
 test_expect_success 'hash-object' '
        git hash-object large1
 '