* [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 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: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: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: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 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
* 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
* [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] 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
* 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
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).