Merge branch 'zj/diff-empty-chmod'

"git diff --stat" used to fully count a binary file with modified
execution bits whose contents is unmodified, which was not right.

By Zbigniew Jędrzejewski-Szmek (4) and Johannes Sixt (1)
* zj/diff-empty-chmod:
  t4006: Windows do not have /dev/zero
  diff --stat: do not run diff on indentical files
  diff --stat: report mode-only changes for binary files like text files
  tests: check --[short]stat output after chmod
  test: modernize style of t4006

Conflicts:
	diff.c
This commit is contained in:
Junio C Hamano 2012-05-07 13:29:08 -07:00
commit fc1320bfe2
2 changed files with 71 additions and 31 deletions

43
diff.c
View file

@ -1614,8 +1614,12 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
if (data->files[i]->is_binary) {
fprintf(options->file, "%s", line_prefix);
show_name(options->file, prefix, name, len);
fprintf(options->file, " %*s ", number_width, "Bin");
fprintf(options->file, "%s%"PRIuMAX"%s",
fprintf(options->file, " %*s", number_width, "Bin");
if (!added && !deleted) {
putc('\n', options->file);
continue;
}
fprintf(options->file, " %s%"PRIuMAX"%s",
del_c, deleted, reset);
fprintf(options->file, " -> ");
fprintf(options->file, "%s%"PRIuMAX"%s",
@ -1689,17 +1693,16 @@ static void show_shortstats(struct diffstat_t *data, struct diff_options *option
return;
for (i = 0; i < data->nr; i++) {
if (!data->files[i]->is_binary &&
!data->files[i]->is_unmerged) {
int added = data->files[i]->added;
int deleted= data->files[i]->deleted;
if (!data->files[i]->is_renamed &&
(added + deleted == 0)) {
total_files--;
} else {
adds += added;
dels += deleted;
}
int added = data->files[i]->added;
int deleted= data->files[i]->deleted;
if (data->files[i]->is_unmerged)
continue;
if (!data->files[i]->is_renamed && (added + deleted == 0)) {
total_files--;
} else {
adds += added;
dels += deleted;
}
}
if (options->output_prefix) {
@ -2399,6 +2402,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);
@ -2407,10 +2411,17 @@ 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;
data->added = diff_filespec_size(two);
data->deleted = diff_filespec_size(one);
if (same_contents) {
data->added = 0;
data->deleted = 0;
} else {
data->added = diff_filespec_size(two);
data->deleted = diff_filespec_size(one);
}
}
else if (complete_rewrite) {
@ -2420,7 +2431,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;

View file

@ -8,23 +8,52 @@ test_description='Test mode change diffs.
'
. ./test-lib.sh
test_expect_success \
'setup' \
'echo frotz >rezrov &&
git update-index --add rezrov &&
tree=`git write-tree` &&
echo $tree'
sed_script='s/\(:100644 100755\) \('"$_x40"'\) \2 /\1 X X /'
test_expect_success \
'chmod' \
'test_chmod +x rezrov &&
git diff-index $tree >current'
test_expect_success 'setup' '
echo frotz >rezrov &&
git update-index --add rezrov &&
tree=`git write-tree` &&
echo $tree
'
sed -e 's/\(:100644 100755\) \('"$_x40"'\) \2 /\1 X X /' <current >check
echo ":100644 100755 X X M rezrov" >expected
test_expect_success 'chmod' '
test_chmod +x rezrov &&
git diff-index $tree >current &&
sed -e "$sed_script" <current >check &&
echo ":100644 100755 X X M rezrov" >expected &&
test_cmp expected check
'
test_expect_success \
'verify' \
'test_cmp expected check'
test_expect_success 'prepare binary file' '
git commit -m rezrov &&
printf "\00\01\02\03\04\05\06" >binbin &&
git add binbin &&
git commit -m binbin
'
test_expect_success '--stat output after text chmod' '
test_chmod -x rezrov &&
echo " 0 files changed" >expect &&
git diff HEAD --stat >actual &&
test_cmp expect actual
'
test_expect_success '--shortstat output after text chmod' '
git diff HEAD --shortstat >actual &&
test_cmp expect actual
'
test_expect_success '--stat output after binary chmod' '
test_chmod +x binbin &&
echo " 0 files changed" >expect &&
git diff HEAD --stat >actual &&
test_cmp expect actual
'
test_expect_success '--shortstat output after binary chmod' '
git diff HEAD --shortstat >actual &&
test_cmp expect actual
'
test_done