Re: [PATCH v5 2/3] add -p: gracefully handle unparseable hunk headers in colored diffs
- From
- Phillip Wood <phillip.wood123@gmail.com>
- Date
- Sep 1, 2022, 16:03 UTC
- Message-ID
- <a560ecb1-2049-7844-758f-4bd44b61eea7@gmail.com>
- In-Reply-To
- <93d0e3b4d2a3dec5588c6e41d69313385356aa8f.1662046939.git.gitgitgadget@gmail.com>
Hi Dscho
On 01/09/2022 16:42, Johannes Schindelin via GitGitGadget wrote:
Show 22 quoted lines
> From: Johannes Schindelin <johannes.schindelin@gmx.de> > > In > https://lore.kernel.org/git/ecf6f5be-22ca-299f-a8f1-bda38e5ca246@gmail.com, > Phillipe Blain reported that the built-in `git add -p` command fails > when asked to use [`diff-so-fancy`][diff-so-fancy] to colorize the diff. > > The reason is that this tool produces colored diffs with a hunk header > that does not contain any parseable `@@ ... @@` line range information, > and therefore we cannot detect any part in that header that comes after > the line range. > > As proposed by Phillip Wood, let's take that for a clear indicator that > we should show the hunk headers verbatim. This is what the Perl version > of the interactive `add` command did, too. > > [diff-so-fancy]: https://github.com/so-fancy/diff-so-fancy > > Reported-by: Philippe Blain <levraiphilippeblain@gmail.com> > Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk> > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> > ---
Show 13 quoted lines
> @@ -659,6 +659,15 @@ static void render_hunk(struct add_p_state *s, struct hunk *hunk,
> if (!colored) {
> p = s->plain.buf + header->extra_start;
> len = header->extra_end - header->extra_start;
> + } else if (header->suppress_colored_line_range) {
> + strbuf_add(out,
> + s->colored.buf + header->colored_extra_start,
> + header->colored_extra_end -
> + header->colored_extra_start);
> +
> + strbuf_add(out, s->colored.buf + hunk->colored_start,
> + hunk->colored_end - hunk->colored_start);
> + return;Having an extra branch for this that returns early makes it easy to see what is being printed when we cannot parse the hunk header.
Show 16 quoted lines
> diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh > index 8a594700f7b..a94e7c53c8a 100755 > --- a/t/t3701-add-interactive.sh > +++ b/t/t3701-add-interactive.sh > @@ -767,6 +767,16 @@ test_expect_success 'detect bogus diffFilter output' ' > grep "mismatched output" output > ' > > +test_expect_success 'handle iffy colored hunk headers' ' > + git reset --hard && > + > + echo content >test && > + printf n >n && > + force_color git -c interactive.diffFilter="sed s/.*@@.*/XX/" \ > + add -p >output 2>&1 <n && > + grep "^XX$" output
We check that the hunk header line from filtered diff was reproduced verbatim
This all looks good to me
Best Wishes
Phillip