git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/2] tests: make test_must_fail more verbose

From
Jeff King <peff@peff.net>
Date
Aug 31, 2010, 18:06 UTC
Message-ID
<20100831180618.GB15020@sigill.intra.peff.net>
In-Reply-To
<20100831171055.GO2315@burratino>
On Tue, Aug 31, 2010 at 12:10:55PM -0500, Jonathan Nieder wrote:
> > -	test $? -gt 0 -a $? -le 129 -o $? -gt 192
> [...]
> Can the exit status (e.g. from a shell function) be negative?

I don't believe so. Both bash and dash complain about "return -1" (and POSIX says the number must be "an unsigned decimal integer"). More importantly, though, is how shells interpret an exit status from a command that has high bits set. Both bash and dash truncate it to 8-bits and treat it as unsigned. I would think any reasonable shell would do that (no, I don't have a Solaris 8 box handy to test on. :) ).

> Though your patch does not affect this, a command interrupted by a
> signal will receive exit status > 192 in shells like ksh93.

Yeah, that is from 5a26973 (t/test-lib.sh: exit with small negagive int is ok with test_must_fail, 2008-07-12). I'm not sure I agree with the intent of that commit. We should perhaps just eliminate all the places where we use negative exit codes.

Show 12 quoted lines
> Posix says:
> 	As explained in other sections, certain exit status values
> 	have been reserved for special uses and should be used by
> 	applications only for those purposes:
> 
> 	126
> 		A file to be executed was found, but it was not an
> 		executable utility.
> 	127
> 		A utility to be executed was not found.
> 	>128
> 		A command was interrupted by a signal.
Yup, that's what I have always assumed to be the case.
Show 5 quoted lines
> Unfortunately that does not agree with git usage.
> 
> 	129
> 		Incorrect command-line usage, or help requested
> 		(rather than SIGHUP).
Yeah, we might consider changing that. We indeed confuse it with SIGHUP:
  $ git log -h 2>/dev/null; echo $?
  129
  $ git log -p >/dev/null; echo $? [now killall -HUP git elsewhere]
  129

We also use 128 for our generic die. I don't know if this is ever problematic. It has the high bit set like a signal, but you don't actually check the bits in the shell. And the actual representation at the C level is not the same.

So part of me is in favor of changing these to something more "normal". I am slightly worried, though, about breaking some caller. It is a user-visible interface, though I suspect 99% of callers only ever cared whether it was 0 or not.

> Here's a test_might_fail patch for consistency.
I didn't even know about that one. :)

They should definitely be kept in sync. I wonder if it is worth implemening must_fail in terms of might_fail.

Show 9 quoted lines
>  test_might_fail () {
>  	"$@"
> -	test $? -ge 0 -a $? -le 129 -o $? -gt 192
> +	exit_code=$?
> +	if test $exit_code -gt 129 -a $exit_code -le 192; then
> +		echo >&2 "test_might_fail: died by signal: $*"
> +		return 1
> +	fi
> +	return 0
I wonder if 2/2 would need the "missing command" bit, too. Hrm.
-Peff
Previous: Jonathan NiederNext: Jonathan Nieder
Message 7 of 17 in “fix quotes in maint-reflog-beyond-horizon and detached-stash”
  1. 0/2 fix quotes in maint-reflog-beyond-horizon and detached-stashJon Seymour, Aug 31, 2010
  2. 1/2 maint-reflog-beyond-horizon: fix broken test_must_fail callsJon Seymour, Aug 31, 2010
  3. 2/2 detached-stash: fix broken test_must_fail callsJon Seymour, Aug 31, 2010
  4. Jeff KingAug 31, 2010
  5. 1/2 tests: make test_must_fail more verboseJeff King, Aug 31, 2010
  6. Jonathan NiederAug 31, 2010
  7. Jeff KingAug 31, 2010
  8. Jonathan NiederAug 31, 2010
  9. Jon SeymourSep 1, 2010
  10. Ævar Arnfjörð BjarmasonSep 1, 2010
  11. 2/2 tests: make test_must_fail fail on missing commandsJeff King, Aug 31, 2010
  12. Junio C HamanoAug 31, 2010
  13. Jeff KingAug 31, 2010
  14. Jonathan NiederAug 31, 2010
  15. Jeff KingAug 31, 2010
  16. Ævar Arnfjörð BjarmasonAug 31, 2010
  17. Junio C HamanoAug 31, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.