]> git.ipfire.org Git - thirdparty/git.git/commitdiff
git add -p: use non-zero exit code when the diff generation failed
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Fri, 6 Dec 2019 13:08:24 +0000 (13:08 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 6 Dec 2019 16:57:34 +0000 (08:57 -0800)
The first thing `git add -p` does is to generate a diff. If this diff
cannot be generated, `git add -p` should not continue as if nothing
happened, but instead fail.

What we *actually* do here is much broader: we now verify for *every*
`run_cmd_pipe()` call that the spawned process actually succeeded.

Note that we have to change two callers in this patch, as we need to
store the spawned process' output in a local variable, which means that
the callers can no longer decide whether to interpret the `return <$fh>`
in array or in scalar context.

This bug was noticed while writing a test case for the diff.algorithm
feature, and we let that test case double as a regression test for this
fixed bug, too.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-add--interactive.perl
t/t3701-add-interactive.sh

index 52659bb74c9b8fdd5645403afbe4e715b1e089cb..10fd30ae16a3bdf943732d07bc33c0a723b5e344 100755 (executable)
@@ -177,7 +177,9 @@ sub run_cmd_pipe {
        } else {
                my $fh = undef;
                open($fh, '-|', @_) or die;
-               return <$fh>;
+               my @out = <$fh>;
+               close $fh || die "Cannot close @_ ($!)";
+               return @out;
        }
 }
 
@@ -224,7 +226,7 @@ my $status_head = sprintf($status_fmt, __('staged'), __('unstaged'), __('path'))
        sub get_empty_tree {
                return $empty_tree if defined $empty_tree;
 
-               $empty_tree = run_cmd_pipe(qw(git hash-object -t tree /dev/null));
+               ($empty_tree) = run_cmd_pipe(qw(git hash-object -t tree /dev/null));
                chomp $empty_tree;
                return $empty_tree;
        }
@@ -1127,7 +1129,7 @@ aborted and the hunk is left unchanged.
 EOF2
        close $fh;
 
-       chomp(my $editor = run_cmd_pipe(qw(git var GIT_EDITOR)));
+       chomp(my ($editor) = run_cmd_pipe(qw(git var GIT_EDITOR)));
        system('sh', '-c', $editor.' "$@"', $editor, $hunkfile);
 
        if ($? != 0) {
index f43634102ec59ee3687cd4e009db7941fd78c496..5db6432e3395b09f7a19612ea195da0f9c55e7cc 100755 (executable)
@@ -530,7 +530,7 @@ test_expect_success 'diff.algorithm is passed to `git diff-files`' '
        >file &&
        git add file &&
        echo changed >file &&
-       git -c diff.algorithm=bogus add -p 2>err &&
+       test_must_fail git -c diff.algorithm=bogus add -p 2>err &&
        test_i18ngrep "error: option diff-algorithm accepts " err
 '