test-lib.sh: optionally output to test-results/$TEST.out, too
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Tue, 3 Feb 2009 23:26:12 +0000 (00:26 +0100)
committerJunio C Hamano <gitster@pobox.com>
Wed, 4 Feb 2009 06:01:09 +0000 (22:01 -0800)
When tests are run in parallel and a few tests fail, it does not help
that the output of the terminal is totally confusing, as you rarely know
which test which line came from.

So introduce the option '--tee' which triggers that the output of the
tests will be written to t/test-results/$TEST.out in addition to the
terminal, where $TEST is the basename of the script.

Unfortunately, there seems to be no way to redirect a given file
descriptor to a specified subprocess in POSIX shell, only redirection
to a file is supported via 'exec > $FILE'.

At least with bash, one might think that 'exec >($COMMAND)' would work
as intended, but it does not.

The common way to work around the lack of proper tools support is to
work with named pipes, alas, one of our most beloved platforms does not
really support named pipes.  Besides, we would need a pipe for every
script, as the whole point of this patch is to allow parallel execution.

Therefore, we handle the redirection in the following way: when '--tee'
was passed to the test script, the variable GIT_TEST_TEE_STARTED is set
(to avoid triggering that code path again) and the script is started
_again_, in a subshell, redirected to the command "tee".

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/README
t/test-lib.sh

index 7560db5c0205c57490ebf26e8f9bb918e7b3af64..ed1ebb6a5c058ee46c3f898ef0b1ba28d69df6f3 100644 (file)
--- a/t/README
+++ b/t/README
@@ -65,6 +65,12 @@ appropriately before running "make".
        the test script when running under -i).  Valgrind errors
        go to stderr, so you might want to pass the -v option, too.
 
+--tee::
+       In addition to printing the test output to the terminal,
+       write it to files named 't/test-results/$TEST_NAME.out'.
+       As the names depend on the tests' file names, it is safe to
+       run the tests with this option in parallel.
+
 Skipping Tests
 --------------
 
index 5a58356c72e98d49c0b6c85a2dd220f58933915c..34f372c92ffa659c4cc2f155bd40dd2ebd7be6af 100644 (file)
@@ -3,6 +3,22 @@
 # Copyright (c) 2005 Junio C Hamano
 #
 
+# if --tee was passed, write the output not only to the terminal, but
+# additionally to the file test-results/$BASENAME.out, too.
+case "$GIT_TEST_TEE_STARTED, $* " in
+done,*)
+       # do not redirect again
+       ;;
+*' --tee '*)
+       mkdir -p test-results
+       BASE=test-results/$(basename "$0" .sh)
+       (GIT_TEST_TEE_STARTED=done ${SHELL-sh} "$0" "$@" 2>&1;
+        echo $? > $BASE.exit) | tee $BASE.out
+       test "$(cat $BASE.exit)" = 0
+       exit
+       ;;
+esac
+
 # Keep the original TERM for say_color
 ORIGINAL_TERM=$TERM
 
@@ -96,6 +112,8 @@ do
                shift ;;
        --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
                valgrind=t; shift ;;
+       --tee)
+               shift ;; # was handled already
        *)
                break ;;
        esac