Skip to content

Commit

Permalink
submodule status: propagate SIGPIPE
Browse files Browse the repository at this point in the history
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 in killed by
SIGPIPE as grep 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 <[email protected]>
Signed-off-by: Phillip Wood <[email protected]>
  • Loading branch information
phillipwood committed Sep 20, 2024
1 parent ed15518 commit c5dbfd4
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
7 changes: 6 additions & 1 deletion builtin/submodule--helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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);
}

Expand Down
7 changes: 7 additions & 0 deletions t/t7422-submodule-output.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit c5dbfd4

Please sign in to comment.