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

[PATCH] submodule status: propagate SIGPIPE

From
PGPhillip Wood via GitGitGadget <gitgitgadget@gmail.com>
Date
Sep 20, 2024, 13:07 UTC
Message-ID
<pull.1799.git.1726837642511.gitgitgadget@gmail.com>
From: Phillip Wood <phillip.wood@dunelm.org.uk>
It has been reported than running
     git submodule status --recurse | grep -q ^+
results in an unexpected error message
    fatal: failed to recurse into submodule $submodule

When "git submodule--helper" recurses into a submodule it creates a child process. If that process fails then the error message above is displayed by the parent. In the case above the child is killed by SIGPIPE as "grep -q" exits as soon as it sees the first match. Fix this by propagating SIGPIPE so that it is visible to the process running git. We could propagate other signals but I'm not sure there is much value in doing that. In the common case of the user pressing Ctrl-C or Ctrl-\ then SIGINT or SIGQUIT will be sent to the foreground process group and so the parent process will receive the same signal as the child.

Reported-by: Matt Liberty <mliberty@precisioninno.com>
Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
---
    submodule status: propagate SIGPIPE
    
    Note that I haven't checked if any other submodule subcommands are
    affected by this - I'll leave that to someone more familiar with the
    code.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1799%2Fphillipwood%2Fsubmodule-status-sigpipe-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1799/phillipwood/submodule-status-sigpipe-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1799
 builtin/submodule--helper.c | 7 ++++++-
 t/t7422-submodule-output.sh | 7 +++++++
 2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index a46ffd49b34..a8e497ef3c6 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -30,6 +30,7 @@
 #include "advice.h"
 #include "branch.h"
 #include "list-objects-filter-options.h"
+#include <signal.h>
 
 #define OPT_QUIET (1 << 0)
 #define OPT_CACHED (1 << 1)
@@ -695,6 +696,7 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
 
 	if (flags & OPT_RECURSIVE) {
 		struct child_process cpr = CHILD_PROCESS_INIT;
+		int res;
 
 		cpr.git_cmd = 1;
 		cpr.dir = path;
@@ -710,7 +712,10 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
 		if (flags & OPT_QUIET)
 			strvec_push(&cpr.args, "--quiet");
 
-		if (run_command(&cpr))
+		res = run_command(&cpr);
+		if (res == SIGPIPE + 128)
+			raise(SIGPIPE);
+		else if (res)
 			die(_("failed to recurse into submodule '%s'"), path);
 	}
 
diff --git a/t/t7422-submodule-output.sh b/t/t7422-submodule-output.sh
index ab946ec9405..c1686d6bb5f 100755
--- a/t/t7422-submodule-output.sh
+++ b/t/t7422-submodule-output.sh
@@ -167,4 +167,11 @@ do
 	'
 done
 
+test_expect_success !MINGW 'git submodule status --recursive propagates SIGPIPE' '
+	{ git submodule status --recursive 2>err; echo $?>status; } |
+		grep -q X/S &&
+	test_must_be_empty err &&
+	test_match_signal 13 "$(cat status)"
+'
+
 test_done

base-commit: ed155187b429a2a6b6475efe1767053df37ccfe1
-- 
gitgitgadget
Next: Junio C Hamano
Message 1 of 6 in “submodule status: propagate SIGPIPE”
  1. submodule status: propagate SIGPIPEPhillip Wood via GitGitGadget, Sep 20, 2024
  2. Junio C HamanoSep 20, 2024
  3. Junio C HamanoSep 20, 2024
  4. phillip.wood123@gmail.comSep 21, 2024
  5. submodule status: propagate SIGPIPEPhillip Wood via GitGitGadget, Sep 21, 2024
  6. Junio C HamanoSep 23, 2024

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.