marick/lein-midje

src/leiningen/midje.clj: make-load-facts-form might use error code >125

Opened this issue · 3 comments

In src/leiningen/midje.clj, make-load-facts-form limits the error code to 255, which is unsafe as it might clash with error codes reserved by the shell - see e.g. man 1 bash:

EXIT STATUS
       The  exit  status  of  an  executed  command is the value returned by the
       waitpid system call or equivalent function.  Exit statuses fall between 0
       and 255, though, as explained below, the shell may use values above 125
       specially.  Exit statuses from shell builtins and compound commands are
       also limited to this range. Under certain circumstances, the shell will use
       special values to indicate specific failure modes.

       For the shell's purposes, a command which exits with a zero exit status
       has succeeded.  An exit status of zero indicates success.  A non-zero exit
       status indicates failure.  When a command terminates on a fatal signal N,
       bash uses the value of 128+N as the exit status.

       If a command is not found, the child process created to execute it returns
       a status of 127.  If a command is found but is not executable, the return
       status is 126.

       If a command fails because of an error during expansion or redirection, the
       exit status is greater than zero.

       Shell builtin commands return a status of 0 (true) if successful, and
       non-zero (false) if an error occurs while they execute.  All builtins return
       an exit status of 2 to indicate incorrect usage.

       Bash itself returns the exit status of the last command executed, unless a
       syntax error occurs, in which case it exits with a non-zero value.  See also
       the exit builtin command below.

Generally it seems advisable to leave some error codes for errors signaled by lein-midje itself, like invalid command line flags, missing config files, or compilation errors.

Are you suggesting that (~exit-fn (min 255 failures#))))) should use 124 instead?

Yes, at least. But I think it would be even better if 1 would mean "test failed" and 2,3,4,... would mean "compilation error", "missing config file", "invalid command line flag" and so on. This would allow CI scripts to distinguish a completely broken test / program invocation from a failed test.