git@vger.kernel.org list mirror (unofficial, one of many)
 help / color / mirror / code / Atom feed
From: Matt Rogers <mattr94@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Matthew Rogers via GitGitGadget <gitgitgadget@gmail.com>,
	Git Mailing List <git@vger.kernel.org>, Jeff King <peff@peff.net>
Subject: Re: [PATCH v2] diff: teach --stat to ignore uninteresting modifications
Date: Mon, 17 Aug 2020 18:37:02 -0400	[thread overview]
Message-ID: <CAOjrSZt7BZy=wnKhFfj+07-2GT+hOf+70HEJL6Hr04NaabK=eg@mail.gmail.com> (raw)
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:
>
> "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

>
> 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

  reply	other threads:[~2020-08-17 22:37 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-01 23:33 [PATCH] " Matthew Rogers via GitGitGadget
2020-08-02  0:31 ` Junio C Hamano
2020-08-02  1:51   ` Matt Rogers
2020-08-14 22:45 ` [PATCH v2] " Matthew Rogers via GitGitGadget
2020-08-17 21:39   ` Junio C Hamano
2020-08-17 22:37     ` Matt Rogers [this message]
2020-08-17 22:37       ` Matt Rogers
2020-08-20  0:41   ` [PATCH v3] " Matthew Rogers via GitGitGadget
2020-08-20  0:56     ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAOjrSZt7BZy=wnKhFfj+07-2GT+hOf+70HEJL6Hr04NaabK=eg@mail.gmail.com' \
    --to=mattr94@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=gitster@pobox.com \
    --cc=peff@peff.net \
    --subject='Re: [PATCH v2] diff: teach --stat to ignore uninteresting modifications' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Code repositories for project(s) associated with this inbox:

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).