Message ID | 20181122211248.24546-3-avarab@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | format-patch: pre-2.20 range-diff regression fix | expand |
Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes: > if (rev->rdiff1) { > + struct diff_options opts; > + memcpy(&opts, &rev->diffopt, sizeof(opts)); > + opts.output_format &= ~(DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_SUMMARY); > + > fprintf_ln(rev->diffopt.file, "%s", rev->rdiff_title); > show_range_diff(rev->rdiff1, rev->rdiff2, > - rev->creation_factor, 1, &rev->diffopt); > + rev->creation_factor, 1, &opts); I am not quite convinced if this shallow copy is a safe thing to do. Quite honestly at this late in the release cycle, as a band-aid, I'd rather see a simpler revert than a change like this that we have to worry about what happens if/when show_range_diff() _thinks_ it is done with the opts and ends up discarding resources (e.g. "FILE *") that are shared with rev->diffopt that would still have to be used later.
Junio C Hamano <gitster@pobox.com> writes: > Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes: > >> if (rev->rdiff1) { >> + struct diff_options opts; >> + memcpy(&opts, &rev->diffopt, sizeof(opts)); >> + opts.output_format &= ~(DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_SUMMARY); >> + >> fprintf_ln(rev->diffopt.file, "%s", rev->rdiff_title); >> show_range_diff(rev->rdiff1, rev->rdiff2, >> - rev->creation_factor, 1, &rev->diffopt); >> + rev->creation_factor, 1, &opts); > > I am not quite convinced if this shallow copy is a safe thing to do. > Quite honestly at this late in the release cycle, as a band-aid, I'd > rather see a simpler revert than a change like this that we have to > worry about what happens if/when show_range_diff() _thinks_ it is > done with the opts and ends up discarding resources (e.g. "FILE *") > that are shared with rev->diffopt that would still have to be used > later. Well, let's take it anyway as-is, at least for today, as I notice show_range_diff() itself does another shallow copy, so we are not making anything dramatically worse. Thanks.
diff --git a/builtin/log.c b/builtin/log.c index 0fe6f9ba1e..7cd2db0be9 100644 --- a/builtin/log.c +++ b/builtin/log.c @@ -1094,9 +1094,13 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout, } if (rev->rdiff1) { + struct diff_options opts; + memcpy(&opts, &rev->diffopt, sizeof(opts)); + opts.output_format &= ~(DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_SUMMARY); + fprintf_ln(rev->diffopt.file, "%s", rev->rdiff_title); show_range_diff(rev->rdiff1, rev->rdiff2, - rev->creation_factor, 1, &rev->diffopt); + rev->creation_factor, 1, &opts); } } @@ -1697,6 +1701,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) if (!use_patch_format && (!rev.diffopt.output_format || rev.diffopt.output_format == DIFF_FORMAT_PATCH)) + /* Needs to be mirrored in show_range_diff() invocation */ rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_SUMMARY; if (!rev.diffopt.stat_width) rev.diffopt.stat_width = MAIL_DEFAULT_WRAP; diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh index 0235c038be..90def330bd 100755 --- a/t/t3206-range-diff.sh +++ b/t/t3206-range-diff.sh @@ -252,21 +252,9 @@ do master..unmodified >actual.raw && sed -e "s|^:||" -e "s|:$||" >expect <<-\EOF && :1: 4de457d = 1: 35b9b25 s/5/A/ - : a => b | 0 - : 1 file changed, 0 insertions(+), 0 deletions(-) - : : :2: fccce22 = 2: de345ab s/4/A/ - : a => b | 0 - : 1 file changed, 0 insertions(+), 0 deletions(-) - : : :3: 147e64e = 3: 9af6654 s/11/B/ - : a => b | 0 - : 1 file changed, 0 insertions(+), 0 deletions(-) - : : :4: a63e992 = 4: 2901f77 s/12/B/ - : a => b | 0 - : 1 file changed, 0 insertions(+), 0 deletions(-) - : : :-- : EOF sed -ne "/^1:/,/^--/p" <actual.raw >actual &&
Fix a regression introduced in my a48e12ef7a ("range-diff: make diff option behavior (e.g. --stat) consistent", 2018-11-13). Since the format-patch setup code implicitly sets --stat --summary by default, we started emitting the --stat output in the cover letter's range-diff. As noted in df569c3f31 ("range-diff doc: add a section about output stability", 2018-11-09) the --stat output is currently rather useless, and just adds noise. Perhaps we should detect if --stat or --summary were implicitly passed to format-patch, and then pass them along, but I think fixing it this way is fine. If our --stat output ever becomes useful in range-diff we can revisit this. There's still cases like e.g. --numstat triggering rather useless range-diff output, but I think it's OK to just handle the default case. Users are unlikely to produce a formatted patch with the likes of --numstat, or indeed any other custom diff option except -U<n> or maybe -W. If they need weirder combinations of options they can always manually produce the range-diff. This whole situation comes about because we're assuming that when the user passes along e.g. -U10 that they want that some 10-line context for the range-diff as for the patches themselves. As noted in [1] I think it's worth re-visiting this and making -U10 just apply to the patches, and e.g. --range-diff-U10 to the range-diff. But that's left as a topic for another series less close to a rc2. 1. https://public-inbox.org/git/87d0ri7gbs.fsf@evledraar.gmail.com/ Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> --- builtin/log.c | 7 ++++++- t/t3206-range-diff.sh | 12 ------------ 2 files changed, 6 insertions(+), 13 deletions(-)