diff options
author | Junio C Hamano <gitster@pobox.com> | 2020-09-03 12:37:05 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-09-03 12:37:05 -0700 |
commit | b58e47a929ec3d3d5fe63f18ae9539ffe9051c51 (patch) | |
tree | 65efc709d1267029d65ac5744028d61f6e50e965 /diff.c | |
parent | b4100f366c1e5adf3a254cdc6f832aa1a4461053 (diff) | |
parent | 1cf3d5db9bd11514465d3692216211315f0dc82c (diff) | |
download | git-b58e47a929ec3d3d5fe63f18ae9539ffe9051c51.tar.gz |
Merge branch 'mr/diff-hide-stat-wo-textual-change'
"git diff --stat -w" showed 0-line changes for paths whose changes
were only whitespaces, which was not intuitive. We now omit such
paths from the stat output.
* mr/diff-hide-stat-wo-textual-change:
diff: teach --stat to ignore uninteresting modifications
Diffstat (limited to 'diff.c')
-rw-r--r-- | diff.c | 38 |
1 files changed, 31 insertions, 7 deletions
@@ -3153,16 +3153,19 @@ static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *o gather_dirstat(options, &dir, changed, "", 0); } +static void free_diffstat_file(struct diffstat_file *f) +{ + free(f->print_name); + free(f->name); + free(f->from_name); + free(f); +} + void free_diffstat_info(struct diffstat_t *diffstat) { int i; - for (i = 0; i < diffstat->nr; i++) { - struct diffstat_file *f = diffstat->files[i]; - free(f->print_name); - free(f->name); - free(f->from_name); - free(f); - } + for (i = 0; i < diffstat->nr; i++) + free_diffstat_file(diffstat->files[i]); free(diffstat->files); } @@ -3718,6 +3721,27 @@ static void builtin_diffstat(const char *name_a, const char *name_b, if (xdi_diff_outf(&mf1, &mf2, discard_hunk_line, diffstat_consume, diffstat, &xpp, &xecfg)) die("unable to generate diffstat for %s", one->path); + + if (DIFF_FILE_VALID(one) && DIFF_FILE_VALID(two)) { + struct diffstat_file *file = + diffstat->files[diffstat->nr - 1]; + /* + * Omit diffstats of modified files where nothing changed. + * Even if !same_contents, this might be the case due to + * ignoring whitespace changes, etc. + * + * But note that we special-case additions, deletions, + * renames, and mode changes as adding an empty file, + * for example is still of interest. + */ + if ((p->status == DIFF_STATUS_MODIFIED) + && !file->added + && !file->deleted + && one->mode == two->mode) { + free_diffstat_file(file); + diffstat->nr--; + } + } } diff_free_filespec_data(one); |