git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 6/7] git add -p: use non-zero exit code when the diff generation failed

From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
Date
Dec 6, 2019, 13:08 UTC
Message-ID
<27c8ceeb1150dafeaf5b83831487f6bd66c04839.1575637705.git.gitgitgadget@gmail.com>
In-Reply-To
<pull.172.git.1575637705.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>

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>
---
 git-add--interactive.perl  | 8 +++++---
 t/t3701-add-interactive.sh | 2 +-
 2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index 52659bb74c..10fd30ae16 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -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 @@ sub list_untracked {
 	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 @@ sub edit_hunk_manually {
 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) {
diff --git a/t/t3701-add-interactive.sh b/t/t3701-add-interactive.sh
index f43634102e..5db6432e33 100755
--- a/t/t3701-add-interactive.sh
+++ b/t/t3701-add-interactive.sh
@@ -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
 '
 
-- 
gitgitgadget
Previous: Johannes SchindelinNext: Junio C Hamano
Message 14 of 15 in “add -i: close some regression test gaps”
  1. 0/7 add -i: close some regression test gapsJohannes Schindelin via GitGitGadget, Dec 6, 2019
  2. 1/7 t3701: add a test for advanced split-hunk editingJohannes Schindelin via GitGitGadget, Dec 6, 2019
  3. 2/7 t3701: avoid depending on the TTY prerequisiteJohannes Schindelin via GitGitGadget, Dec 6, 2019
  4. SZEDER GáborDec 16, 2019
  5. Jeff KingDec 17, 2019
  6. 3/7 t3701: add a test for the different `add -p` promptsJohannes Schindelin via GitGitGadget, Dec 6, 2019
  7. 5/7 t3701: verify that the diff.algorithm config setting is handledJohannes Schindelin via GitGitGadget, Dec 6, 2019
  8. 4/7 t3701: verify the shown messages when nothing can be addedJohannes Schindelin via GitGitGadget, Dec 6, 2019
  9. 7/7 apply --allow-overlap: fix a corner caseJohannes Schindelin via GitGitGadget, Dec 6, 2019
  10. Junio C HamanoDec 6, 2019
  11. Johannes SchindelinDec 6, 2019
  12. Junio C HamanoDec 6, 2019
  13. Johannes SchindelinDec 6, 2019
  14. 6/7 git add -p: use non-zero exit code when the diff generation failedJohannes Schindelin via GitGitGadget, Dec 6, 2019
  15. Junio C HamanoDec 6, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.