Jeff King <peff@xxxxxxxx> writes: > It's important that the diff-filter only filter the > individual lines, and that there remain a one-to-one mapping > between the input and output lines. Otherwise, things like > hunk-splitting will behave quite unexpectedly (e.g., you > think you are splitting at one point, but it has a different > effect in the text patch we apply). > > We can't detect all problematic cases, but we can at least > catch the obvious case where we don't even have the correct > number of lines. Will queue. We could probably also make sure that each of the corresponding line pair begins with the same '-/ /+' letter, but we need to draw a line and stop somewhere, and I think the number of lines is probably a good enough place. > > Signed-off-by: Jeff King <peff@xxxxxxxx> > --- > git-add--interactive.perl | 8 ++++++++ > t/t3701-add-interactive.sh | 8 ++++++++ > 2 files changed, 16 insertions(+) > > diff --git a/git-add--interactive.perl b/git-add--interactive.perl > index 964c3a7542..ff02008abe 100755 > --- a/git-add--interactive.perl > +++ b/git-add--interactive.perl > @@ -705,6 +705,14 @@ sub parse_diff { > } > my (@hunk) = { TEXT => [], DISPLAY => [], TYPE => 'header' }; > > + if (@colored && @colored != @diff) { > + print STDERR > + "fatal: mismatched output from interactive.diffFilter\n", > + "hint: Your filter must maintain a one-to-one correspondence\n", > + "hint: between its input and output lines.\n"; > + exit 1; > + } > + > for (my $i = 0; $i < @diff; $i++) { > if ($diff[$i] =~ /^@@ /) { > push @hunk, { TEXT => [], DISPLAY => [], > diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh > index 64fe56c3d5..9bb17f91b2 100755 > --- a/t/t3701-add-interactive.sh > +++ b/t/t3701-add-interactive.sh > @@ -404,6 +404,14 @@ test_expect_success TTY 'diffFilter filters diff' ' > grep foo:.*content output > ' > > +test_expect_success TTY 'detect bogus diffFilter output' ' > + git reset --hard && > + > + echo content >test && > + test_config interactive.diffFilter "echo too-short" && > + printf y | test_must_fail test_terminal git add -p > +' > + > test_expect_success 'patch-mode via -i prompts for files' ' > git reset --hard &&