Re: [PATCH v3 6/6] diff: shortcut for diff'ing two binary SHA-1 objects

2014-08-15 Thread Duy Nguyen
On Fri, Aug 15, 2014 at 12:00 AM, Junio C Hamano  wrote:
> Nguyễn Thái Ngọc Duy   writes:
>
>> diff --git a/t/t1050-large.sh b/t/t1050-large.sh
>> index 711f22c..b294963 100755
>> --- a/t/t1050-large.sh
>> +++ b/t/t1050-large.sh
>> @@ -116,6 +116,14 @@ test_expect_success 'diff --stat' '
>>   git diff --stat HEAD^ HEAD
>>  '
>>
>> +test_expect_success 'diff' '
>> + git diff HEAD^ HEAD
>> +'
>> +
>> +test_expect_success 'diff --cached' '
>> + git diff --cached HEAD^
>> +'
>
> What are these checking?  No check for their outcome?

The first test in this file set $GIT_ALLOC_LIMIT and these commands
would not succeed without the patch. But yes I can check the "binary
files differ" too.
-- 
Duy
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 6/6] diff: shortcut for diff'ing two binary SHA-1 objects

2014-08-14 Thread Junio C Hamano
Nguyễn Thái Ngọc Duy   writes:

> 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 
> ---
>  diff.c   | 13 +
>  t/t1050-large.sh |  8 
>  2 files changed, 21 insertions(+)
>
> diff --git a/diff.c b/diff.c
> index d381a6f..b85bcfb 100644
> --- 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;
> + }

A tangent.

I think one and two can point at the same object only when this
filepair is involved in rename/copy.  In other words, one and two
with the same  would not be given to this code.  And
must-show-header would be set to true long before we get here in
fill-metainfo in such a case.

I think this new code and the original below which you copied this
one from can probably be simplified.  It already felt wrong to see
two copies of "fprintf(o->file "%s", header.buf)" and now we have
four of them.  Because this is a copy-and-paste of the identical
logic from below, I do not want you to attempt fixing this tangent
in this patch, though.

Thanks.

>   if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
>   die("unable to read files to diff");
>   /* Quite common confusing case */
> diff --git a/t/t1050-large.sh b/t/t1050-large.sh
> index 711f22c..b294963 100755
> --- a/t/t1050-large.sh
> +++ b/t/t1050-large.sh
> @@ -116,6 +116,14 @@ test_expect_success 'diff --stat' '
>   git diff --stat HEAD^ HEAD
>  '
>  
> +test_expect_success 'diff' '
> + git diff HEAD^ HEAD
> +'
> +
> +test_expect_success 'diff --cached' '
> + git diff --cached HEAD^
> +'
> +
>  test_expect_success 'hash-object' '
>   git hash-object large1
>  '
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 6/6] diff: shortcut for diff'ing two binary SHA-1 objects

2014-08-14 Thread Junio C Hamano
Nguyễn Thái Ngọc Duy   writes:

> diff --git a/t/t1050-large.sh b/t/t1050-large.sh
> index 711f22c..b294963 100755
> --- a/t/t1050-large.sh
> +++ b/t/t1050-large.sh
> @@ -116,6 +116,14 @@ test_expect_success 'diff --stat' '
>   git diff --stat HEAD^ HEAD
>  '
>  
> +test_expect_success 'diff' '
> + git diff HEAD^ HEAD
> +'
> +
> +test_expect_success 'diff --cached' '
> + git diff --cached HEAD^
> +'

What are these checking?  No check for their outcome?

>  test_expect_success 'hash-object' '
>   git hash-object large1
>  '
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 6/6] diff: shortcut for diff'ing two binary SHA-1 objects

2014-08-13 Thread Nguyễn Thái Ngọc Duy
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 
---
 diff.c   | 13 +
 t/t1050-large.sh |  8 
 2 files changed, 21 insertions(+)

diff --git a/diff.c b/diff.c
index d381a6f..b85bcfb 100644
--- 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 */
diff --git a/t/t1050-large.sh b/t/t1050-large.sh
index 711f22c..b294963 100755
--- a/t/t1050-large.sh
+++ b/t/t1050-large.sh
@@ -116,6 +116,14 @@ test_expect_success 'diff --stat' '
git diff --stat HEAD^ HEAD
 '
 
+test_expect_success 'diff' '
+   git diff HEAD^ HEAD
+'
+
+test_expect_success 'diff --cached' '
+   git diff --cached HEAD^
+'
+
 test_expect_success 'hash-object' '
git hash-object large1
 '
-- 
2.1.0.rc0.78.gc0d8480

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html