This is an alternative to jk/add-patch-with-suppress-blank-empty which was recently discarded from next. I hope that normalizing the context marker will simplify any future changes to the code. Changes since V1 * Updated merge_hunks() to use normalize_marker() as spotted by Junio * Updated the test so it checks merge_hunks() as well. Phillip Wood (2): add-patch: handle splitting hunks with diff.suppressBlankEmpty add-patch: use normalize_marker() when recounting edited hunk add-patch.c | 23 +++++++++++++++-------- t/t3701-add-interactive.sh | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) base-commit: 790a17fb19d6eadd16c52e5d284a5c6921744766 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1763%2Fphillipwood%2Fadd-p-suppress-blank-empty-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1763/phillipwood/add-p-suppress-blank-empty-v2 Pull-Request: https://github.com/gitgitgadget/git/pull/1763 Range-diff vs v1: 1: fd09e66727a ! 1: 34d8fd44a97 add-patch: handle splitting hunks with diff.suppressBlankEmpty @@ add-patch.c: static void complete_file(char marker, struct hunk *hunk) } +/* Empty context lines may omit the leading ' ' */ -+static int normalize_marker(char *p) ++static int normalize_marker(const char *p) +{ + return p[0] == '\n' || (p[0] == '\r' && p[1] == '\n') ? ' ' : p[0]; +} @@ add-patch.c: static int parse_diff(struct add_p_state *s, const struct pathspec p = eol == pend ? pend : eol + 1; hunk->end = p - plain->buf; +@@ add-patch.c: static int merge_hunks(struct add_p_state *s, struct file_diff *file_diff, + (int)(hunk->end - hunk->start), + plain + hunk->start); + +- if (plain[overlap_end] != ' ') ++ if (normalize_marker(&plain[overlap_end]) != ' ') + return error(_("expected context line " + "#%d in\n%.*s"), + (int)(j + 1), @@ add-patch.c: static int split_hunk(struct add_p_state *s, struct file_diff *file_diff, context_line_count = 0; while (splittable_into > 1) { - ch = s->plain.buf[current]; -+ ch = normalize_marker(s->plain.buf + current); ++ ch = normalize_marker(&s->plain.buf[current]); if (!ch) BUG("buffer overrun while splitting hunks"); @@ t/t3701-add-interactive.sh: test_expect_success 'reset -p with unmerged files' ' +test_expect_success 'hunk splitting works with diff.suppressBlankEmpty' ' + test_config diff.suppressBlankEmpty true && -+ test_write_lines a b c "" d e f >file && ++ write_script fake-editor.sh <<-\EOF && ++ tr F G <"$1" >"$1.tmp" && ++ mv "$1.tmp" "$1" ++ EOF ++ ++ test_write_lines a b "" c d "" e f "" >file && + git add file && -+ test_write_lines p q r "" s t u >file && -+ test_write_lines s n y q | git add -p && ++ test_write_lines A b "" c D "" e F "" >file && ++ ( ++ test_set_editor "$(pwd)/fake-editor.sh" && ++ test_write_lines s n y e q | git add -p file ++ ) && + git cat-file blob :file >actual && -+ test_write_lines a b c "" s t u >expect && ++ test_write_lines a b "" c D "" e G "" >expect && + test_cmp expect actual +' + -: ----------- > 2: 7bdcd2df012 add-patch: use normalize_marker() when recounting edited hunk -- gitgitgadget