summaryrefslogtreecommitdiff
path: root/diff.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2012-11-26 02:44:06 (GMT)
committerJunio C Hamano <gitster@pobox.com>2012-11-26 02:44:06 (GMT)
commit76c39289bac153ddb661062dcc25881c690c20e5 (patch)
tree3dd1ca47df57cbef5c1d7f88109461feb6b3f68c /diff.c
parent09b61b5e8ce9181d0ea499d6e81b038c9c34871c (diff)
parent74faaa16f016af9fc429770ba701f2aa598d9f21 (diff)
downloadgit-76c39289bac153ddb661062dcc25881c690c20e5.zip
git-76c39289bac153ddb661062dcc25881c690c20e5.tar.gz
git-76c39289bac153ddb661062dcc25881c690c20e5.tar.bz2
Merge branch 'lt/diff-stat-show-0-lines'
We failed to mention a file without any content change but whose permission bit was modified, or (worse yet) a new file without any content in the "git diff --stat" output. * lt/diff-stat-show-0-lines: Fix "git diff --stat" for interesting - but empty - file changes
Diffstat (limited to 'diff.c')
-rw-r--r--diff.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/diff.c b/diff.c
index e89a201..71b1387 100644
--- a/diff.c
+++ b/diff.c
@@ -1309,6 +1309,7 @@ struct diffstat_t {
unsigned is_unmerged:1;
unsigned is_binary:1;
unsigned is_renamed:1;
+ unsigned is_interesting:1;
uintmax_t added, deleted;
} **files;
};
@@ -1478,7 +1479,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
for (i = 0; (i < count) && (i < data->nr); i++) {
struct diffstat_file *file = data->files[i];
uintmax_t change = file->added + file->deleted;
- if (!data->files[i]->is_renamed &&
+ if (!data->files[i]->is_interesting &&
(change == 0)) {
count++; /* not shown == room for one more */
continue;
@@ -1599,7 +1600,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
uintmax_t deleted = data->files[i]->deleted;
int name_len;
- if (!data->files[i]->is_renamed &&
+ if (!data->files[i]->is_interesting &&
(added + deleted == 0)) {
total_files--;
continue;
@@ -1678,7 +1679,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
for (i = count; i < data->nr; i++) {
uintmax_t added = data->files[i]->added;
uintmax_t deleted = data->files[i]->deleted;
- if (!data->files[i]->is_renamed &&
+ if (!data->files[i]->is_interesting &&
(added + deleted == 0)) {
total_files--;
continue;
@@ -1706,7 +1707,7 @@ static void show_shortstats(struct diffstat_t *data, struct diff_options *option
if (data->files[i]->is_unmerged)
continue;
- if (!data->files[i]->is_renamed && (added + deleted == 0)) {
+ if (!data->files[i]->is_interesting && (added + deleted == 0)) {
total_files--;
} else if (!data->files[i]->is_binary) { /* don't count bytes */
adds += added;
@@ -2406,13 +2407,20 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
struct diff_filespec *two,
struct diffstat_t *diffstat,
struct diff_options *o,
- int complete_rewrite)
+ struct diff_filepair *p)
{
mmfile_t mf1, mf2;
struct diffstat_file *data;
int same_contents;
+ int complete_rewrite = 0;
+
+ if (!DIFF_PAIR_UNMERGED(p)) {
+ if (p->status == DIFF_STATUS_MODIFIED && p->score)
+ complete_rewrite = 1;
+ }
data = diffstat_add(diffstat, name_a, name_b);
+ data->is_interesting = p->status != 0;
if (!one || !two) {
data->is_unmerged = 1;
@@ -3123,11 +3131,10 @@ static void run_diffstat(struct diff_filepair *p, struct diff_options *o,
{
const char *name;
const char *other;
- int complete_rewrite = 0;
if (DIFF_PAIR_UNMERGED(p)) {
/* unmerged */
- builtin_diffstat(p->one->path, NULL, NULL, NULL, diffstat, o, 0);
+ builtin_diffstat(p->one->path, NULL, NULL, NULL, diffstat, o, p);
return;
}
@@ -3140,9 +3147,7 @@ static void run_diffstat(struct diff_filepair *p, struct diff_options *o,
diff_fill_sha1_info(p->one);
diff_fill_sha1_info(p->two);
- if (p->status == DIFF_STATUS_MODIFIED && p->score)
- complete_rewrite = 1;
- builtin_diffstat(name, other, p->one, p->two, diffstat, o, complete_rewrite);
+ builtin_diffstat(name, other, p->one, p->two, diffstat, o, p);
}
static void run_checkdiff(struct diff_filepair *p, struct diff_options *o)