diff --stat: report mode-only changes for binary files like text files

Mode-only changes to binary files without content change were reported as
if they were rewritten, but text files in the same situation were reported
as "unchanged". Let's treat binary files like text files here, and simply
say that they are unchanged.

Output of --shortstat is modified in the same way.

Reported-by: Martin Mareš <mj@ucw.cz>
Signed-off-by: Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2012-05-01 19:10:14 +02:00 committed by Junio C Hamano
parent 4434e6ba6c
commit e18872b2f0
2 changed files with 24 additions and 22 deletions

38
diff.c
View File

@ -1583,8 +1583,12 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
if (data->files[i]->is_binary) { if (data->files[i]->is_binary) {
fprintf(options->file, "%s", line_prefix); fprintf(options->file, "%s", line_prefix);
show_name(options->file, prefix, name, len); show_name(options->file, prefix, name, len);
fprintf(options->file, " Bin "); fprintf(options->file, " Bin");
fprintf(options->file, "%s%"PRIuMAX"%s", if (!added && !deleted) {
putc('\n', options->file);
continue;
}
fprintf(options->file, " %s%"PRIuMAX"%s",
del_c, deleted, reset); del_c, deleted, reset);
fprintf(options->file, " -> "); fprintf(options->file, " -> ");
fprintf(options->file, "%s%"PRIuMAX"%s", fprintf(options->file, "%s%"PRIuMAX"%s",
@ -1657,17 +1661,16 @@ static void show_shortstats(struct diffstat_t *data, struct diff_options *option
return; return;
for (i = 0; i < data->nr; i++) { for (i = 0; i < data->nr; i++) {
if (!data->files[i]->is_binary && int added = data->files[i]->added;
!data->files[i]->is_unmerged) { int deleted= data->files[i]->deleted;
int added = data->files[i]->added;
int deleted= data->files[i]->deleted; if (data->files[i]->is_unmerged)
if (!data->files[i]->is_renamed && continue;
(added + deleted == 0)) { if (!data->files[i]->is_renamed && (added + deleted == 0)) {
total_files--; total_files--;
} else { } else {
adds += added; adds += added;
dels += deleted; dels += deleted;
}
} }
} }
if (options->output_prefix) { if (options->output_prefix) {
@ -2377,8 +2380,13 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
if (diff_filespec_is_binary(one) || diff_filespec_is_binary(two)) { if (diff_filespec_is_binary(one) || diff_filespec_is_binary(two)) {
data->is_binary = 1; data->is_binary = 1;
data->added = diff_filespec_size(two); if (!hashcmp(one->sha1, two->sha1)) {
data->deleted = diff_filespec_size(one); data->added = 0;
data->deleted = 0;
} else {
data->added = diff_filespec_size(two);
data->deleted = diff_filespec_size(one);
}
} }
else if (complete_rewrite) { else if (complete_rewrite) {

View File

@ -46,18 +46,12 @@ test_expect_success '--shortstat output after text chmod' '
test_expect_success '--stat output after binary chmod' ' test_expect_success '--stat output after binary chmod' '
test_chmod +x binbin && test_chmod +x binbin &&
cat >expect <<-EOF && echo " 0 files changed" >expect &&
binbin | Bin 1024 -> 1024 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
EOF
git diff HEAD --stat >actual && git diff HEAD --stat >actual &&
test_cmp expect actual test_cmp expect actual
' '
test_expect_success '--shortstat output after binary chmod' ' test_expect_success '--shortstat output after binary chmod' '
cat >expect <<-EOF &&
1 file changed, 0 insertions(+), 0 deletions(-)
EOF
git diff HEAD --shortstat >actual && git diff HEAD --shortstat >actual &&
test_cmp expect actual test_cmp expect actual
' '