Show 135 quoted lines
> Changes since v3:
>
> * Instead of deviating from how the Perl version of git add -p did things,
> we now teach the built-in version to display hunk headers verbatim when
> no line range could be parsed out (instead of showing the line range
> anyways). This was a very good idea of Phillip's, dramatically
> simplifying the patch series.
> * Also, this iteration drops the first patch that claims to redefine what
> we consider bogus, but only hides an off-by-one. In its stead, there is
> now a patch that fixes said off-by-one.
>
> Changes since v2:
>
> * Added the appropriate "Reported-by" trailer to the commit message.
> * Split out the logic to insert a space between the colored line range and
> the extra information, if needed.
> * That logic was now corrected to see whether that space is really needed.
> * To verify that the logic does what we need it to do, the added regression
> test now specifically tests for that (single) extra space that we want to
> be inserted.
> * Reworded a stale comment that claimed that we might suppress the entire
> colored hunk header (which we no longer do).
> * Rebased to the current tip of the main branch to avoid a merge conflict
> with 716c1f649e3 (pipe_command(): mark stdin descriptor as non-blocking,
> 2022-08-17).
>
> Changes since v1:
>
> * Added a commit to ignore dirty submodules just like the Perl version
> does.
>
> Johannes Schindelin (3):
> add -p: detect more mismatches between plain vs colored diffs
> add -p: gracefully handle unparseable hunk headers in colored diffs
> add -p: ignore dirty submodules
>
> add-patch.c | 33 +++++++++++++++++++++++----------
> t/t3701-add-interactive.sh | 27 +++++++++++++++++++++++++--
> 2 files changed, 48 insertions(+), 12 deletions(-)
>
>
> base-commit: 07ee72db0e97b5c233f8ada0abb412248c2f1c6f
> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1336%2Fdscho%2Fdiff-so-fancy-v5
> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1336/dscho/diff-so-fancy-v5
> Pull-Request: https://github.com/gitgitgadget/git/pull/1336
>
> Range-diff vs v4:
>
> 1: 25187c3a3c2 = 1: 25187c3a3c2 add -p: detect more mismatches between plain vs colored diffs
> 2: cd1c5100506 ! 2: 93d0e3b4d2a add -p: gracefully handle unparseable hunk headers in colored diffs
> @@ Commit message
> we should show the hunk headers verbatim. This is what the Perl version
> of the interactive `add` command did, too.
>
> - This commit is best viewed with `--color-moved --ignore-space-change`.
> -
> [diff-so-fancy]: https://github.com/so-fancy/diff-so-fancy
>
> Reported-by: Philippe Blain <levraiphilippeblain@gmail.com>
> @@ add-patch.c: static int parse_hunk_header(struct add_p_state *s, struct hunk *hu
> - if (!p)
> - return error(_("could not parse colored hunk header '%.*s'"),
> - (int)(eol - line), line);
> -+ if (p && (p = memmem(p + 4, eol - p - 4, " @@", 3)))
> ++ if (p && (p = memmem(p + 4, eol - p - 4, " @@", 3))) {
> + header->colored_extra_start = p + 3 - s->colored.buf;
> -+ else {
> ++ } else {
> + /* could not parse colored hunk header, leave as-is */
> + header->colored_extra_start = hunk->colored_start;
> + header->suppress_colored_line_range = 1;
> @@ add-patch.c: static int parse_hunk_header(struct add_p_state *s, struct hunk *hu
>
> return 0;
> @@ add-patch.c: static void render_hunk(struct add_p_state *s, struct hunk *hunk,
> - - header->colored_extra_start;
> - }
> -
> -- if (s->mode->is_reverse)
> -- old_offset -= delta;
> -- else
> -- new_offset += delta;
> --
> -- strbuf_addf(out, "@@ -%lu", old_offset);
> -- if (header->old_count != 1)
> -- strbuf_addf(out, ",%lu", header->old_count);
> -- strbuf_addf(out, " +%lu", new_offset);
> -- if (header->new_count != 1)
> -- strbuf_addf(out, ",%lu", header->new_count);
> -- strbuf_addstr(out, " @@");
> -+ if (!colored || !header->suppress_colored_line_range) {
> -+ if (s->mode->is_reverse)
> -+ old_offset -= delta;
> -+ else
> -+ new_offset += delta;
> + 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_addf(out, "@@ -%lu", old_offset);
> -+ if (header->old_count != 1)
> -+ strbuf_addf(out, ",%lu", header->old_count);
> -+ strbuf_addf(out, " +%lu", new_offset);
> -+ if (header->new_count != 1)
> -+ strbuf_addf(out, ",%lu", header->new_count);
> -+ strbuf_addstr(out, " @@");
> -+ }
> -
> - if (len)
> - strbuf_add(out, p, len);
> ++ strbuf_add(out, s->colored.buf + hunk->colored_start,
> ++ hunk->colored_end - hunk->colored_start);
> ++ return;
> + } else {
> + strbuf_addstr(out, s->s.fraginfo_color);
> + p = s->colored.buf + header->colored_extra_start;
>
> ## t/t3701-add-interactive.sh ##
> @@ t/t3701-add-interactive.sh: test_expect_success 'detect bogus diffFilter output' '
> @@ t/t3701-add-interactive.sh: test_expect_success 'detect bogus diffFilter output'
> + printf n >n &&
> + force_color git -c interactive.diffFilter="sed s/.*@@.*/XX/" \
> + add -p >output 2>&1 <n &&
> -+ grep "^[^@]*XX[^@]*$" output
> ++ grep "^XX$" output
> +'
> +
> test_expect_success 'handle very large filtered diff' '
> 3: 116f0cf5cab = 3: 47943b603b1 add -p: ignore dirty submodules
>