Re: [PATCH 5/7] line-log: support diff stat formats with -L
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jun 18, 2026, 22:00 UTC
- Message-ID
- <xmqq8q8bpl03.fsf@gitster.g>
- In-Reply-To
- <a70d861d27a13459bab34f6681b3ccfe2f20d0d8.1781806593.git.gitgitgadget@gmail.com>
"Michael Montalbo via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 17 quoted lines
> diff --git a/Documentation/line-range-options.adoc b/Documentation/line-range-options.adoc > index 72f639b5e7..1a25f55bb1 100644 > --- a/Documentation/line-range-options.adoc > +++ b/Documentation/line-range-options.adoc > @@ -9,10 +9,14 @@ > _<start>_ and _<end>_ (or _<funcname>_) must exist in the starting revision. > You can specify this option more than once. Implies `--patch`. > Patch output can be suppressed using `--no-patch`. > - Non-patch diff formats `--raw`, `--name-only`, `--name-status`, > - and `--summary` are supported. Diff stat formats > - (`--stat`, `--numstat`, `--shortstat`, `--dirstat`) are not > - currently implemented. > + The following non-patch diff formats are supported: `--raw`, > + `--name-only`, `--name-status`, `--summary`, > + `--stat`, `--numstat`, and `--shortstat`. > + The stat formats show range-scoped counts: only lines within > + the tracked range are counted. `--dirstat` is not supported
If "range-scoped" is a widely known term (as opposed to a new word invented only during the introduction of this topic), the above reads well with a nice rhythm, but otherwise it may be easier to read, i.e., something like
The stat formats counts only lines within the tracked range.
without having readers learn yet another new term that is only used here.
Show 23 quoted lines
> diff --git a/diff.c b/diff.c
> index 6233a96bf0..026fafeb90 100644
> --- a/diff.c
> +++ b/diff.c
> @@ -4289,7 +4289,18 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
> xecfg.ctxlen = o->context;
> xecfg.interhunkctxlen = o->interhunkcontext;
> xecfg.flags = XDL_EMIT_NO_HUNK_HDR;
> - if (xdi_diff_outf(&mf1, &mf2, NULL,
> +
> + if (p->line_ranges) {
> + struct line_range_filter lr_filter;
> +
> + line_range_filter_init(&lr_filter, p->line_ranges,
> + diffstat_consume, diffstat);
> +
> + if (line_range_filter_diff(&lr_filter, &mf1, &mf2,
> + &xpp, &xecfg))
> + die("unable to generate diffstat for %s",
> + one->path);
> + } else if (xdi_diff_outf(&mf1, &mf2, NULL,
> diffstat_consume, diffstat, &xpp, &xecfg))
> die("unable to generate diffstat for %s", one->path);It is pleasing to see that this can be done with such a surprisingly small change.