From: Phillip Wood Date: Thu, 01 Sep 2022 16:03:23 GMT Subject: Re: [PATCH v5 2/3] add -p: gracefully handle unparseable hunk headers in colored diffs Message-ID: In-Reply-To: <93d0e3b4d2a3dec5588c6e41d69313385356aa8f.1662046939.git.gitgitgadget@gmail.com> Hi Dscho On 01/09/2022 16:42, Johannes Schindelin via GitGitGadget wrote: > From: Johannes Schindelin > > 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 > Helped-by: Phillip Wood > Signed-off-by: Johannes Schindelin > --- > @@ -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. > 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 + 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