Re: [PATCH v2] diff: teach --stat to ignore uninteresting modifications
- From
Matt Rogers <mattr94@gmail.com>
- Date
- Aug 17, 2020, 22:37 UTC
- Message-ID
- <CAOjrSZt7BZy=wnKhFfj+07-2GT+hOf+70HEJL6Hr04NaabK=eg@mail.gmail.com>
- In-Reply-To
- <xmqqpn7pymsb.fsf@gitster.c.googlers.com>
On Mon, Aug 17, 2020 at 5:39 PM Junio C Hamano <gitster@pobox.com> wrote:
Show 34 quoted lines
> > "Matthew Rogers via GitGitGadget" <gitgitgadget@gmail.com> writes: > > > From: Matthew Rogers <mattr94@gmail.com> > > > > Sometimes when diffing, files may show as being momdified even when > > momdified? mummified? ah, modified. > > > there are no interesting diffs to show. This happens naturally when > > using options such as --ignore-space-change. > > Read the next paragraph and notice that it explains the cases where > the patch does not want not to show, and then read the above again > to realize that the above does not say anything about what it wants > to do to cases the next paragraph does not cover. It only says such > a case often happens when --ignore-space-change is used. > > When options like --ignore-space-change is in use, files > with modification can have no interesting textual changes > worth showing. In such cases, "git diff --stat" shows 0 > lines of additions and deletions. Teach "git diff --stat" > not to show such a path in its output, which would be more > natural. > > perhaps? > > > We don't want to prevent > > the display of all files that have 0 effective diffs since they could > > be the result of a rename, permission change, or other similar operation > > that may still be of interest so we special case additions and deletions > > as they are always interesting. > > Yup. That makes sense.
I'll send a reroll with the message improved as you suggested, as well as updating
Show 128 quoted lines
>
> It would be nice if this does not have to be implemented as a list
> of exceptions, though. Rather, a more targetted "omit output only
> in this narrow case" would be nicer, but the check with the mode
> bits should do at lesat for now.
>
> > diff --git a/diff.c b/diff.c
> > index f9709de7b4..131903fa3a 100644
> > --- a/diff.c
> > +++ b/diff.c
> > @@ -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,26 @@ 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 and deletions,
>
> * renames and mode changes without any content 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);
> > diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh
> > index 88d3026894..8bdaa0a693 100755
> > --- a/t/t4015-diff-whitespace.sh
> > +++ b/t/t4015-diff-whitespace.sh
> > @@ -789,7 +789,7 @@ test_expect_success 'checkdiff allows new blank lines' '
> > git diff --check
> > '
> >
> > -test_expect_success 'whitespace-only changes not reported' '
> > +test_expect_success 'whitespace-only changes not reported (diff)' '
> > git reset --hard &&
> > echo >x "hello world" &&
> > git add x &&
> > @@ -799,10 +799,44 @@ test_expect_success 'whitespace-only changes not reported' '
> > test_must_be_empty actual
> > '
> >
> > -test_expect_success 'whitespace-only changes reported across renames' '
> > +test_expect_success 'whitespace-only changes not reported (diffstat)' '
> > + # reuse state from previous test
> > + git diff --stat -b >actual &&
> > + test_must_be_empty actual
> > +'
> > +
> > +test_expect_success 'whitespace changes with modification reported (diffstat)' '
> > + git reset --hard &&
> > + echo >x "hello world" &&
> > + git update-index --chmod=+x x &&
> > + git diff --stat --cached -b >actual &&
> > + cat <<-EOF >expect &&
> > + x | 0
> > + 1 file changed, 0 insertions(+), 0 deletions(-)
> > + EOF
> > + test_cmp expect actual
> > +'
> > +
> > +test_expect_success 'whitespace-only changes reported across renames (diffstat)' '
> > git reset --hard &&
> > for i in 1 2 3 4 5 6 7 8 9; do echo "$i$i$i$i$i$i"; done >x &&
> > git add x &&
> > + git commit -m "base" &&
> > + sed -e "5s/^/ /" x >z &&
> > + git rm x &&
> > + git add z &&
> > + git diff -w -M --cached --stat >actual &&
> > + cat <<-EOF >expect &&
> > + x => z | 0
> > + 1 file changed, 0 insertions(+), 0 deletions(-)
> > + EOF
> > + test_cmp expect actual
> > +'
> > +
> > +test_expect_success 'whitespace-only changes reported across renames' '
> > + git reset --hard HEAD~1 &&
> > + for i in 1 2 3 4 5 6 7 8 9; do echo "$i$i$i$i$i$i"; done >x &&
> > + git add x &&
> > hash_x=$(git hash-object x) &&
> > before=$(git rev-parse --short "$hash_x") &&
> > git commit -m "base" &&
> >
> > base-commit: 878e727637ec5815ccb3301eb994a54df95b21b8-- Matthew Rogers