Message ID | pull.1799.v2.git.1726925150113.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 082caf527ea769635e8c46d0cc181c844c50defd |
Headers | show |
Series | [v2] submodule status: propagate SIGPIPE | expand |
"Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com> writes: > 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. Thanks. Queued.
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index a46ffd49b34..4daca494b80 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -695,6 +695,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 +711,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