Message ID | pull.1799.git.1726837642511.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | 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 > ... > - if (run_command(&cpr)) > + res = run_command(&cpr); > + if (res == SIGPIPE + 128) > + raise(SIGPIPE); OK, that is straight-forward. This makes sure that we do the same thing we would do if we, not our child, got a 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)" I am not a huge fun of assuming SIGPIPE is 13 everywhere, but at least we can tweak test_match_signal when we find oddball systems, so ... OK. In practice, we only use 13 and 15 with test_match_signal, so we could have a new "test-tool signal-name" that maps textual signal names to the number the platform gives to them for the platform on which the tests are running, if it ever turns out to be a problem. Looking good. Will queue. Thanks.
"Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com> writes: > 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> Do we really need this? As with any other Git built-in that relies on git-compat-util.h to handle such system-dependencies, direct inclusion of system headers like this is highly questionable.
Hi Junio On 20/09/2024 21:06, Junio C Hamano wrote: > "Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com> writes: > >> 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> > > Do we really need this? > > As with any other Git built-in that relies on git-compat-util.h to > handle such system-dependencies, direct inclusion of system headers > like this is highly questionable. Good point - I really need to figure out how to stop emacs' lsp mode automatically adding includes. I removed its "helpful" addition of <csignal> but forgot to remove <signal.h> as well. Thanks Phillip
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