* [PATCH] run-command: simplify wait_or_whine @ 2013-06-01 13:51 Felipe Contreras 2013-06-01 14:03 ` Duy Nguyen ` (2 more replies) 0 siblings, 3 replies; 15+ messages in thread From: Felipe Contreras @ 2013-06-01 13:51 UTC (permalink / raw) To: git Cc: Junio C Hamano, Jeff King, Johannes Sixt, Jonathan Nieder, John J. Franey, Felipe Contreras Nobody is checking for specific error codes; it's the errno that's important. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> --- run-command.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/run-command.c b/run-command.c index 1b32a12..e54e943 100644 --- a/run-command.c +++ b/run-command.c @@ -244,21 +244,11 @@ static int wait_or_whine(pid_t pid, const char *argv0) code = WTERMSIG(status); if (code != SIGINT && code != SIGQUIT) error("%s died of signal %d", argv0, code); - /* - * This return value is chosen so that code & 0xff - * mimics the exit code that a POSIX shell would report for - * a program that died from this signal. - */ - code += 128; } else if (WIFEXITED(status)) { code = WEXITSTATUS(status); - /* - * Convert special exit code when execvp failed. - */ - if (code == 127) { - code = -1; + /* convert special exit code when execvp failed. */ + if (code == 127) failed_errno = ENOENT; - } } else { error("waitpid is confused (%s)", argv0); } -- 1.8.3.358.g5a91d05 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 13:51 [PATCH] run-command: simplify wait_or_whine Felipe Contreras @ 2013-06-01 14:03 ` Duy Nguyen 2013-06-01 14:06 ` Felipe Contreras 2013-06-01 14:19 ` Thomas Rast 2013-06-01 14:21 ` Duy Nguyen 2 siblings, 1 reply; 15+ messages in thread From: Duy Nguyen @ 2013-06-01 14:03 UTC (permalink / raw) To: Felipe Contreras Cc: Git Mailing List, Junio C Hamano, Jeff King, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 1, 2013 at 8:51 PM, Felipe Contreras <felipe.contreras@gmail.com> wrote: > Nobody is checking for specific error codes; it's the errno that's > important. Have you just disregarded the in-code comment you just removed with one statement? Did you check all its callers? > > Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> > --- > run-command.c | 14 ++------------ > 1 file changed, 2 insertions(+), 12 deletions(-) > > diff --git a/run-command.c b/run-command.c > index 1b32a12..e54e943 100644 > --- a/run-command.c > +++ b/run-command.c > @@ -244,21 +244,11 @@ static int wait_or_whine(pid_t pid, const char *argv0) > code = WTERMSIG(status); > if (code != SIGINT && code != SIGQUIT) > error("%s died of signal %d", argv0, code); > - /* > - * This return value is chosen so that code & 0xff > - * mimics the exit code that a POSIX shell would report for > - * a program that died from this signal. > - */ > - code += 128; > } else if (WIFEXITED(status)) { > code = WEXITSTATUS(status); > - /* > - * Convert special exit code when execvp failed. > - */ > - if (code == 127) { > - code = -1; > + /* convert special exit code when execvp failed. */ > + if (code == 127) > failed_errno = ENOENT; > - } > } else { > error("waitpid is confused (%s)", argv0); > } > -- > 1.8.3.358.g5a91d05 > > -- > To unsubscribe from this list: send the line "unsubscribe git" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Duy ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 14:03 ` Duy Nguyen @ 2013-06-01 14:06 ` Felipe Contreras 2013-06-01 14:08 ` Duy Nguyen 0 siblings, 1 reply; 15+ messages in thread From: Felipe Contreras @ 2013-06-01 14:06 UTC (permalink / raw) To: Duy Nguyen Cc: Git Mailing List, Junio C Hamano, Jeff King, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 1, 2013 at 9:03 AM, Duy Nguyen <pclouds@gmail.com> wrote: > On Sat, Jun 1, 2013 at 8:51 PM, Felipe Contreras > <felipe.contreras@gmail.com> wrote: >> Nobody is checking for specific error codes; it's the errno that's >> important. > > Have you just disregarded the in-code comment you just removed with > one statement? Who cares about the comment? As I said, nobody is checking for those codes. > Did you check all its callers? Yes, that's why I said nobody is checking for those codes. -- Felipe Contreras ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 14:06 ` Felipe Contreras @ 2013-06-01 14:08 ` Duy Nguyen 2013-06-01 14:20 ` Felipe Contreras 0 siblings, 1 reply; 15+ messages in thread From: Duy Nguyen @ 2013-06-01 14:08 UTC (permalink / raw) To: Felipe Contreras Cc: Git Mailing List, Junio C Hamano, Jeff King, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 1, 2013 at 9:06 PM, Felipe Contreras <felipe.contreras@gmail.com> wrote: > On Sat, Jun 1, 2013 at 9:03 AM, Duy Nguyen <pclouds@gmail.com> wrote: >> On Sat, Jun 1, 2013 at 8:51 PM, Felipe Contreras >> <felipe.contreras@gmail.com> wrote: >>> Nobody is checking for specific error codes; it's the errno that's >>> important. >> >> Have you just disregarded the in-code comment you just removed with >> one statement? > > Who cares about the comment? As I said, nobody is checking for those codes. Apparently I do. >> Did you check all its callers? > > Yes, that's why I said nobody is checking for those codes. Thanks. If would be a few mails less if you stated so in the original message. -- Duy ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 14:08 ` Duy Nguyen @ 2013-06-01 14:20 ` Felipe Contreras 0 siblings, 0 replies; 15+ messages in thread From: Felipe Contreras @ 2013-06-01 14:20 UTC (permalink / raw) To: Duy Nguyen Cc: Git Mailing List, Junio C Hamano, Jeff King, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 1, 2013 at 9:08 AM, Duy Nguyen <pclouds@gmail.com> wrote: > On Sat, Jun 1, 2013 at 9:06 PM, Felipe Contreras > <felipe.contreras@gmail.com> wrote: >> On Sat, Jun 1, 2013 at 9:03 AM, Duy Nguyen <pclouds@gmail.com> wrote: >>> On Sat, Jun 1, 2013 at 8:51 PM, Felipe Contreras >>> <felipe.contreras@gmail.com> wrote: >>>> Nobody is checking for specific error codes; it's the errno that's >>>> important. >>> >>> Have you just disregarded the in-code comment you just removed with >>> one statement? >> >> Who cares about the comment? As I said, nobody is checking for those codes. > > Apparently I do. Why do you care about code comments that have no relation to reality? >>> Did you check all its callers? >> >> Yes, that's why I said nobody is checking for those codes. > > Thanks. If would be a few mails less if you stated so in the original message. So why did you think I said that that nobody is checking for those codes? Anyway, apparently somebody added code that checks for the specific code since I wrote this patch: 1250857 launch_editor: propagate signals from editor to git To my knowledge this is the only place where the specific number us actually checked. -- Felipe Contreras ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 13:51 [PATCH] run-command: simplify wait_or_whine Felipe Contreras 2013-06-01 14:03 ` Duy Nguyen @ 2013-06-01 14:19 ` Thomas Rast 2013-06-01 14:23 ` Felipe Contreras 2013-06-01 14:21 ` Duy Nguyen 2 siblings, 1 reply; 15+ messages in thread From: Thomas Rast @ 2013-06-01 14:19 UTC (permalink / raw) To: Felipe Contreras Cc: git, Junio C Hamano, Jeff King, Johannes Sixt, Jonathan Nieder, John J. Franey Felipe Contreras <felipe.contreras@gmail.com> writes: > Nobody is checking for specific error codes; it's the errno that's > important. [...] > - /* > - * This return value is chosen so that code & 0xff > - * mimics the exit code that a POSIX shell would report for > - * a program that died from this signal. > - */ > - code += 128; Have you checked the callers? There are lots of callers of finish_command(), which returns the value from wait_or_whine() unmodified. -- Thomas Rast trast@{inf,student}.ethz.ch ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 14:19 ` Thomas Rast @ 2013-06-01 14:23 ` Felipe Contreras 0 siblings, 0 replies; 15+ messages in thread From: Felipe Contreras @ 2013-06-01 14:23 UTC (permalink / raw) To: Thomas Rast Cc: git, Junio C Hamano, Jeff King, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 1, 2013 at 9:19 AM, Thomas Rast <trast@inf.ethz.ch> wrote: > Felipe Contreras <felipe.contreras@gmail.com> writes: > >> Nobody is checking for specific error codes; it's the errno that's >> important. > [...] >> - /* >> - * This return value is chosen so that code & 0xff >> - * mimics the exit code that a POSIX shell would report for >> - * a program that died from this signal. >> - */ >> - code += 128; > > Have you checked the callers? There are lots of callers of > finish_command(), which returns the value from wait_or_whine() > unmodified. Yes I did. Most of them simply check that the number is not zero. However, that was at the time I wrote the patch, and it seems there's now one instance where the code is checked. -- Felipe Contreras ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 13:51 [PATCH] run-command: simplify wait_or_whine Felipe Contreras 2013-06-01 14:03 ` Duy Nguyen 2013-06-01 14:19 ` Thomas Rast @ 2013-06-01 14:21 ` Duy Nguyen 2013-06-01 14:30 ` Felipe Contreras 2 siblings, 1 reply; 15+ messages in thread From: Duy Nguyen @ 2013-06-01 14:21 UTC (permalink / raw) To: Felipe Contreras Cc: Git Mailing List, Junio C Hamano, Jeff King, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 1, 2013 at 8:51 PM, Felipe Contreras <felipe.contreras@gmail.com> wrote: > Nobody is checking for specific error codes; it's the errno that's > important. > > Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> > --- > run-command.c | 14 ++------------ > 1 file changed, 2 insertions(+), 12 deletions(-) > > diff --git a/run-command.c b/run-command.c > index 1b32a12..e54e943 100644 > --- a/run-command.c > +++ b/run-command.c > @@ -244,21 +244,11 @@ static int wait_or_whine(pid_t pid, const char *argv0) > code = WTERMSIG(status); > if (code != SIGINT && code != SIGQUIT) > error("%s died of signal %d", argv0, code); > - /* > - * This return value is chosen so that code & 0xff > - * mimics the exit code that a POSIX shell would report for > - * a program that died from this signal. > - */ > - code += 128; > } else if (WIFEXITED(status)) { The original commit that introduces this says run_command: encode deadly signal number in the return value We now write the signal number in the error message if the program terminated by a signal. The negative return value is constructed such that after truncation to 8 bits it looks like a POSIX shell's $?: $ echo 0000 | { git upload-pack .; echo $? >&2; } | : error: git-upload-pack died of signal 13 141 Previously, the exit code was 255 instead of 141. So this is part of the interface to the user. With your changes, the exit code is now different. I tested by force segfaulting upload-pack. $? returned 11. So NAK. -- Duy ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 14:21 ` Duy Nguyen @ 2013-06-01 14:30 ` Felipe Contreras 2013-06-01 14:36 ` Duy Nguyen 2013-06-01 17:01 ` [PATCH] run-command: simplify wait_or_whine Jeff King 0 siblings, 2 replies; 15+ messages in thread From: Felipe Contreras @ 2013-06-01 14:30 UTC (permalink / raw) To: Duy Nguyen Cc: Git Mailing List, Junio C Hamano, Jeff King, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 1, 2013 at 9:21 AM, Duy Nguyen <pclouds@gmail.com> wrote: > On Sat, Jun 1, 2013 at 8:51 PM, Felipe Contreras > <felipe.contreras@gmail.com> wrote: >> Nobody is checking for specific error codes; it's the errno that's >> important. >> >> Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> >> --- >> run-command.c | 14 ++------------ >> 1 file changed, 2 insertions(+), 12 deletions(-) >> >> diff --git a/run-command.c b/run-command.c >> index 1b32a12..e54e943 100644 >> --- a/run-command.c >> +++ b/run-command.c >> @@ -244,21 +244,11 @@ static int wait_or_whine(pid_t pid, const char *argv0) >> code = WTERMSIG(status); >> if (code != SIGINT && code != SIGQUIT) >> error("%s died of signal %d", argv0, code); >> - /* >> - * This return value is chosen so that code & 0xff >> - * mimics the exit code that a POSIX shell would report for >> - * a program that died from this signal. >> - */ >> - code += 128; >> } else if (WIFEXITED(status)) { > > The original commit that introduces this says > > run_command: encode deadly signal number in the return value > > We now write the signal number in the error message if the program > terminated by a signal. The negative return value is constructed such that > after truncation to 8 bits it looks like a POSIX shell's $?: > > $ echo 0000 | { git upload-pack .; echo $? >&2; } | : > error: git-upload-pack died of signal 13 > 141 > > Previously, the exit code was 255 instead of 141. > > So this is part of the interface to the user. With your changes, the > exit code is now different. I tested by force segfaulting upload-pack. > $? returned 11. So NAK. Yeah, and last year we returned a different code. The world didn't end, because nobody is checking for the specific code. But if you want to retain complexity forever, suit yourselves. commit 709ca730f8e093005cc882bfb86c0ca9c83d345b Author: Jeff King <peff@peff.net> Date: Sat Jan 5 09:49:49 2013 -0500 run-command: encode signal death as a positive integer When a sub-command dies due to a signal, we encode the signal number into the numeric exit status as "signal - 128". This is easy to identify (versus a regular positive error code), and when cast to an unsigned integer (e.g., by feeding it to exit), matches what a POSIX shell would return when reporting a signal death in $? or through its own exit code. So we have a negative value inside the code, but once it passes across an exit() barrier, it looks positive (and any code we receive from a sub-shell will have the positive form). E.g., death by SIGPIPE (signal 13) will look like -115 to us in inside git, but will end up as 141 when we call exit() with it. And a program killed by SIGPIPE but run via the shell will come to us with an exit code of 141. Unfortunately, this means that when the "use_shell" option is set, we need to be on the lookout for _both_ forms. We might or might not have actually invoked the shell (because we optimize out some useless shell calls). If we didn't invoke the shell, we will will see the sub-process's signal death directly, and run-command converts it into a negative value. But if we did invoke the shell, we will see the shell's 128+signal exit status. To be thorough, we would need to check both, or cast the value to an unsigned char (after checking that it is not -1, which is a magic error value). Fortunately, most callsites do not care at all whether the exit was from a code or from a signal; they merely check for a non-zero status, and sometimes propagate the error via exit(). But for the callers that do care, we can make life slightly easier by just using the consistent positive form. This actually fixes two minor bugs: 1. In launch_editor, we check whether the editor died from SIGINT or SIGQUIT. But we checked only the negative form, meaning that we would fail to notice a signal death exit code which was propagated through the shell. 2. In handle_alias, we assume that a negative return value from run_command means that errno tells us something interesting (like a fork failure, or ENOENT). Otherwise, we simply propagate the exit code. Negative signal death codes confuse us, and we print a useless "unable to run alias 'foo': Success" message. By encoding signal deaths using the positive form, the existing code just propagates it as it would a normal non-zero exit code. The downside is that callers of run_command can no longer differentiate between a signal received directly by the sub-process, and one propagated. However, no caller currently cares, and since we already optimize out some calls to the shell under the hood, that distinction is not something that should be relied upon by callers. Fix the same logic in t/test-terminal.perl for consistency [jc: raised by Jonathan in the discussion]. Signed-off-by: Jeff King <peff@peff.net> Acked-by: Johannes Sixt <j6t@kdbg.org> Reviewed-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com> -- Felipe Contreras ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 14:30 ` Felipe Contreras @ 2013-06-01 14:36 ` Duy Nguyen 2013-06-01 15:01 ` Felipe Contreras 2013-06-01 17:01 ` [PATCH] run-command: simplify wait_or_whine Jeff King 1 sibling, 1 reply; 15+ messages in thread From: Duy Nguyen @ 2013-06-01 14:36 UTC (permalink / raw) To: Felipe Contreras Cc: Git Mailing List, Junio C Hamano, Jeff King, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 1, 2013 at 9:30 PM, Felipe Contreras <felipe.contreras@gmail.com> wrote: > On Sat, Jun 1, 2013 at 9:21 AM, Duy Nguyen <pclouds@gmail.com> wrote: >> On Sat, Jun 1, 2013 at 8:51 PM, Felipe Contreras >> <felipe.contreras@gmail.com> wrote: > Yeah, and last year we returned a different code. The world didn't > end, because nobody is checking for the specific code. But if you want > to retain complexity forever, suit yourselves. And that was changed for a reason, compared to this change "because I like it". I maintain my NAK (not that it matters) until you justify your change better than "nobody is using it". > commit 709ca730f8e093005cc882bfb86c0ca9c83d345b > Author: Jeff King <peff@peff.net> > Date: Sat Jan 5 09:49:49 2013 -0500 > > run-command: encode signal death as a positive integer -- Duy ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 14:36 ` Duy Nguyen @ 2013-06-01 15:01 ` Felipe Contreras 2013-06-01 17:24 ` [PATCH] t0005: test git exit code from signal death Jeff King 0 siblings, 1 reply; 15+ messages in thread From: Felipe Contreras @ 2013-06-01 15:01 UTC (permalink / raw) To: Duy Nguyen Cc: Git Mailing List, Junio C Hamano, Jeff King, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 1, 2013 at 9:36 AM, Duy Nguyen <pclouds@gmail.com> wrote: > On Sat, Jun 1, 2013 at 9:30 PM, Felipe Contreras > <felipe.contreras@gmail.com> wrote: >> On Sat, Jun 1, 2013 at 9:21 AM, Duy Nguyen <pclouds@gmail.com> wrote: >>> On Sat, Jun 1, 2013 at 8:51 PM, Felipe Contreras >>> <felipe.contreras@gmail.com> wrote: >> Yeah, and last year we returned a different code. The world didn't >> end, because nobody is checking for the specific code. But if you want >> to retain complexity forever, suit yourselves. > > And that was changed for a reason, compared to this change "because I > like it". I maintain my NAK (not that it matters) until you justify > your change better than "nobody is using it". Who said the reason was "because I like it"? You don't agree that making the code simpler and more maintainable is a good reason for any change? Anyway, if you care so much about the current behavior, why isn't there any tests that check for this? My patch passes *all* the tests. -- Felipe Contreras ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH] t0005: test git exit code from signal death 2013-06-01 15:01 ` Felipe Contreras @ 2013-06-01 17:24 ` Jeff King 2013-06-01 21:41 ` Felipe Contreras 0 siblings, 1 reply; 15+ messages in thread From: Jeff King @ 2013-06-01 17:24 UTC (permalink / raw) To: Felipe Contreras Cc: Duy Nguyen, Git Mailing List, Junio C Hamano, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 01, 2013 at 10:01:49AM -0500, Felipe Contreras wrote: > Anyway, if you care so much about the current behavior, why isn't > there any tests that check for this? > > My patch passes *all* the tests. The test suite has never been (and probably never will be) a complete specification of git's behavior. Noticing that a desired behavior is not in the test suite is an opportunity to improve its coverage, not argue that a change which breaks the desired behavior must therefore be acceptable. We could do something like the patch below, with two caveats: 1. The test immediately before it checks for exit codes other than "143" on various platforms. I do not know to what degree we need to deal with that here. Git is doing the interpretation here rather than the shell, so the ksh case should not matter. But I do not know what part of Windows converts the exit code to 3. Do we need to be looking for 3? Or 131 (128+3)? 2. The test detects a total breakage of the exit code, like the one caused by your patch. But I do not know if it would reliably detect us failing to convert the code at all, as the shell running the test harness would presumably convert it to shell-convention itself. Getting around that would require a custom C program checking the status returned by waitpid(). On the other hand, perhaps it is not the conversion we care about; as long as we end up with 143, we are fine. We just want to make sure that signal death is recorded in _one_ of the potential signal formats. So we do not care if git or the shell did the conversion, as long as we end up with 143. The real breakage is exiting with code 15, which is losing information. -- >8 -- Subject: [PATCH] t0005: test git exit code from signal death When a sub-process dies with a signal, we convert the exit code to the shell convention of 128+sig. Callers of git may be relying on this behavior, so let's make sure it does not break. Signed-off-by: Jeff King <peff@peff.net> --- t/t0005-signals.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/t/t0005-signals.sh b/t/t0005-signals.sh index 93e58c0..63f9764 100755 --- a/t/t0005-signals.sh +++ b/t/t0005-signals.sh @@ -20,4 +20,11 @@ test_expect_success 'sigchain works' ' test_cmp expect actual ' +test_expect_success 'signals are propagated using shell convention' ' + # we use exec here to avoid any sub-shell interpretation + # of the exit code + git config alias.sigterm "!exec test-sigchain" && + test_expect_code 143 git sigterm +' + test_done -- 1.8.3.rc1.2.g12db477 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] t0005: test git exit code from signal death 2013-06-01 17:24 ` [PATCH] t0005: test git exit code from signal death Jeff King @ 2013-06-01 21:41 ` Felipe Contreras 0 siblings, 0 replies; 15+ messages in thread From: Felipe Contreras @ 2013-06-01 21:41 UTC (permalink / raw) To: Jeff King Cc: Duy Nguyen, Git Mailing List, Junio C Hamano, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 1, 2013 at 12:24 PM, Jeff King <peff@peff.net> wrote: > On Sat, Jun 01, 2013 at 10:01:49AM -0500, Felipe Contreras wrote: > >> Anyway, if you care so much about the current behavior, why isn't >> there any tests that check for this? >> >> My patch passes *all* the tests. > > The test suite has never been (and probably never will be) a complete > specification of git's behavior. Noticing that a desired behavior is not > in the test suite is an opportunity to improve its coverage, not argue > that a change which breaks the desired behavior must therefore be > acceptable. Nobody did such a thing. I asked a question, and it's good that you are answering by filling the missing test-case. -- Felipe Contreras ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 14:30 ` Felipe Contreras 2013-06-01 14:36 ` Duy Nguyen @ 2013-06-01 17:01 ` Jeff King 2013-06-01 21:35 ` Felipe Contreras 1 sibling, 1 reply; 15+ messages in thread From: Jeff King @ 2013-06-01 17:01 UTC (permalink / raw) To: Felipe Contreras Cc: Duy Nguyen, Git Mailing List, Junio C Hamano, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 01, 2013 at 09:30:50AM -0500, Felipe Contreras wrote: > > The original commit that introduces this says > > > > run_command: encode deadly signal number in the return value > > > > We now write the signal number in the error message if the program > > terminated by a signal. The negative return value is constructed such that > > after truncation to 8 bits it looks like a POSIX shell's $?: > > > > $ echo 0000 | { git upload-pack .; echo $? >&2; } | : > > error: git-upload-pack died of signal 13 > > 141 > > > > Previously, the exit code was 255 instead of 141. > > > > So this is part of the interface to the user. With your changes, the > > exit code is now different. I tested by force segfaulting upload-pack. > > $? returned 11. So NAK. > > Yeah, and last year we returned a different code. The world didn't > end, because nobody is checking for the specific code. But if you want > to retain complexity forever, suit yourselves. Last year we returned a different code from the function that other C code saw. But what got returned via exit() to exterior programs was always 141 in the SIGPIPE case, both before and after my 709ca730. That is explained in the first two paragraphs here: > commit 709ca730f8e093005cc882bfb86c0ca9c83d345b > Author: Jeff King <peff@peff.net> > Date: Sat Jan 5 09:49:49 2013 -0500 > > run-command: encode signal death as a positive integer > > When a sub-command dies due to a signal, we encode the > signal number into the numeric exit status as "signal - > 128". This is easy to identify (versus a regular positive > error code), and when cast to an unsigned integer (e.g., by > feeding it to exit), matches what a POSIX shell would return > when reporting a signal death in $? or through its own exit > code. > > So we have a negative value inside the code, but once it > passes across an exit() barrier, it looks positive (and any > code we receive from a sub-shell will have the positive > form). E.g., death by SIGPIPE (signal 13) will look like > -115 to us in inside git, but will end up as 141 when we > call exit() with it. And a program killed by SIGPIPE but run > via the shell will come to us with an exit code of 141. Your patch changes the error code that is propagated via exit() in this case. We cannot know "nobody is checking for the specific code", because the list of callers is every shell script or program which execs git. Some of them do care about the exit code. I can give an example of a case I have that cares, but I do not think it is even important. The point is that we would be regressing an existing interface, and cannot know who is broken by it. -Peff ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] run-command: simplify wait_or_whine 2013-06-01 17:01 ` [PATCH] run-command: simplify wait_or_whine Jeff King @ 2013-06-01 21:35 ` Felipe Contreras 0 siblings, 0 replies; 15+ messages in thread From: Felipe Contreras @ 2013-06-01 21:35 UTC (permalink / raw) To: Jeff King Cc: Duy Nguyen, Git Mailing List, Junio C Hamano, Johannes Sixt, Jonathan Nieder, John J. Franey On Sat, Jun 1, 2013 at 12:01 PM, Jeff King <peff@peff.net> wrote: > On Sat, Jun 01, 2013 at 09:30:50AM -0500, Felipe Contreras wrote: >> commit 709ca730f8e093005cc882bfb86c0ca9c83d345b >> Author: Jeff King <peff@peff.net> >> Date: Sat Jan 5 09:49:49 2013 -0500 >> >> run-command: encode signal death as a positive integer >> >> When a sub-command dies due to a signal, we encode the >> signal number into the numeric exit status as "signal - >> 128". This is easy to identify (versus a regular positive >> error code), and when cast to an unsigned integer (e.g., by >> feeding it to exit), matches what a POSIX shell would return >> when reporting a signal death in $? or through its own exit >> code. >> >> So we have a negative value inside the code, but once it >> passes across an exit() barrier, it looks positive (and any >> code we receive from a sub-shell will have the positive >> form). E.g., death by SIGPIPE (signal 13) will look like >> -115 to us in inside git, but will end up as 141 when we >> call exit() with it. And a program killed by SIGPIPE but run >> via the shell will come to us with an exit code of 141. > > Your patch changes the error code that is propagated via exit() in this > case. We cannot know "nobody is checking for the specific code", because > the list of callers is every shell script or program which execs git. > Some of them do care about the exit code. I can give an example of a > case I have that cares, but I do not think it is even important. The > point is that we would be regressing an existing interface, and cannot > know who is broken by it. Of course we can know, by going forward with the change, and quite often that's the only way to know for sure. But if it's true what you said that we haven't changed what the process returns, then it doesn't make sense to attempt going forward, because we have no reference point about the likelihood of scripts relying on specific exit codes. -- Felipe Contreras ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2013-06-01 21:41 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-06-01 13:51 [PATCH] run-command: simplify wait_or_whine Felipe Contreras 2013-06-01 14:03 ` Duy Nguyen 2013-06-01 14:06 ` Felipe Contreras 2013-06-01 14:08 ` Duy Nguyen 2013-06-01 14:20 ` Felipe Contreras 2013-06-01 14:19 ` Thomas Rast 2013-06-01 14:23 ` Felipe Contreras 2013-06-01 14:21 ` Duy Nguyen 2013-06-01 14:30 ` Felipe Contreras 2013-06-01 14:36 ` Duy Nguyen 2013-06-01 15:01 ` Felipe Contreras 2013-06-01 17:24 ` [PATCH] t0005: test git exit code from signal death Jeff King 2013-06-01 21:41 ` Felipe Contreras 2013-06-01 17:01 ` [PATCH] run-command: simplify wait_or_whine Jeff King 2013-06-01 21:35 ` Felipe Contreras
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).