diff options
author | Junio C Hamano <gitster@pobox.com> | 2018-03-14 12:01:05 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-03-14 12:01:05 -0700 |
commit | c5e2df04ac9dd731c729c6159d58c2288d794858 (patch) | |
tree | b6db0972487a8a00694e6477deeea245888c6bf7 | |
parent | Merge branch 'nd/worktree-move' (diff) | |
parent | add--interactive: detect bogus diffFilter output (diff) | |
download | tgif-c5e2df04ac9dd731c729c6159d58c2288d794858.tar.xz |
Merge branch 'jk/add-i-diff-filter'
The "interactive.diffFilter" used by "git add -i" must retain
one-to-one correspondence between its input and output, but it was
not enforced and caused end-user confusion. We now at least make
sure the filtered result has the same number of lines as its input
to detect a broken filter.
* jk/add-i-diff-filter:
add--interactive: detect bogus diffFilter output
t3701: add a test for interactive.diffFilter
-rwxr-xr-x | git-add--interactive.perl | 8 | ||||
-rwxr-xr-x | t/t3701-add-interactive.sh | 20 |
2 files changed, 28 insertions, 0 deletions
diff --git a/git-add--interactive.perl b/git-add--interactive.perl index 7a0c95fd0d..d190469cd8 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 a9a9478a29..b170fb02b8 100755 --- a/t/t3701-add-interactive.sh +++ b/t/t3701-add-interactive.sh @@ -397,6 +397,26 @@ test_expect_success TTY 'diffs can be colorized' ' grep "$(printf "\\033")" output ' +test_expect_success TTY 'diffFilter filters diff' ' + git reset --hard && + + echo content >test && + test_config interactive.diffFilter "sed s/^/foo:/" && + printf y | test_terminal git add -p >output 2>&1 && + + # avoid depending on the exact coloring or content of the prompts, + # and just make sure we saw our diff prefixed + 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 && |