diff options
author | Jonathan Nieder <jrnieder@gmail.com> | 2010-05-06 12:41:10 +0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-05-07 00:16:14 +0400 |
commit | b6b0afdc30e066788592ca07c9a6c6936c68cc11 (patch) | |
tree | 63ec8f302400ee8b0cc9c5ffc75ec606f334d1eb /t/test-lib.sh | |
parent | 3bf7886705b4ea7189f046fa5258fdf6edcdbe23 (diff) |
test-lib: some shells do not let $? propagate into an eval
In 3bf7886 (test-lib: Let tests specify commands to be run at end of
test, 2010-05-02), the git test harness learned to run cleanup
commands unconditionally at the end of a test. During each test,
the intended cleanup actions are collected in the test_cleanup variable
and evaluated. That variable looks something like this:
eval_ret=$?; clean_something && (exit "$eval_ret")
eval_ret=$?; clean_something_else && (exit "$eval_ret")
eval_ret=$?; final_cleanup && (exit "$eval_ret")
eval_ret=$?
All cleanup actions are run unconditionally but if one of them fails
it is properly reported through $eval_ret.
On FreeBSD, unfortunately, $? is set at the beginning of an ‘eval’
to 0 instead of the exit status of the previous command. This results
in tests using test_expect_code appearing to fail and all others
appearing to pass, unless their cleanup fails. Avoid the problem by
setting eval_ret before the ‘eval’ begins.
Thanks to Jeff King for the explanation.
Cc: Jeff King <peff@peff.net>
Cc: Johannes Sixt <j6t@kdbg.org>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't/test-lib.sh')
-rw-r--r-- | t/test-lib.sh | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/t/test-lib.sh b/t/test-lib.sh index acce3d06a8..7422bba47e 100644 --- a/t/test-lib.sh +++ b/t/test-lib.sh @@ -366,8 +366,9 @@ test_debug () { } test_run_ () { - test_cleanup='eval_ret=$?' + test_cleanup=: eval >&3 2>&4 "$1" + eval_ret=$? eval >&3 2>&4 "$test_cleanup" return 0 } @@ -567,8 +568,8 @@ test_cmp() { # the test to pass. test_when_finished () { - test_cleanup="eval_ret=\$?; { $* - } && (exit \"\$eval_ret\"); $test_cleanup" + test_cleanup="{ $* + } && (exit \"\$eval_ret\"); eval_ret=\$?; $test_cleanup" } # Most tests can use the created repository, but some may need to create more. |