Merge branch 'jk/tap-verbose-fix' into maint

The Travis CI configuration we ship ran the tests with --verbose
option but this risks non-TAP output that happens to be "ok" to be
misinterpreted as TAP signalling a test that passed.  This resulted
in unnecessary failure.  This has been corrected by introducing a
new mode to run our tests in the test harness to send the verbose
output separately to the log file.

* jk/tap-verbose-fix:
  test-lib: bail out when "-v" used under "prove"
  travis: use --verbose-log test option
  test-lib: add --verbose-log option
  test-lib: handle TEST_OUTPUT_DIRECTORY with spaces
This commit is contained in:
Junio C Hamano 2016-10-28 09:01:20 -07:00
commit b943a213fe
3 changed files with 37 additions and 5 deletions

View File

@ -31,7 +31,7 @@ env:
- LINUX_GIT_LFS_VERSION="1.2.0" - LINUX_GIT_LFS_VERSION="1.2.0"
- DEFAULT_TEST_TARGET=prove - DEFAULT_TEST_TARGET=prove
- GIT_PROVE_OPTS="--timer --jobs 3 --state=failed,slow,save" - GIT_PROVE_OPTS="--timer --jobs 3 --state=failed,slow,save"
- GIT_TEST_OPTS="--verbose --tee" - GIT_TEST_OPTS="--verbose-log"
- GIT_TEST_HTTPD=true - GIT_TEST_HTTPD=true
- GIT_TEST_CLONE_2GB=YesPlease - GIT_TEST_CLONE_2GB=YesPlease
# t9810 occasionally fails on Travis CI OS X # t9810 occasionally fails on Travis CI OS X

View File

@ -153,6 +153,12 @@ appropriately before running "make".
As the names depend on the tests' file names, it is safe to As the names depend on the tests' file names, it is safe to
run the tests with this option in parallel. run the tests with this option in parallel.
--verbose-log::
Write verbose output to the same logfile as `--tee`, but do
_not_ write it to stdout. Unlike `--tee --verbose`, this option
is safe to use when stdout is being consumed by a TAP parser
like `prove`. Implies `--tee` and `--verbose`.
--with-dashes:: --with-dashes::
By default tests are run without dashed forms of By default tests are run without dashed forms of
commands (like git-commit) in the PATH (it only uses commands (like git-commit) in the PATH (it only uses

View File

@ -54,12 +54,22 @@ case "$GIT_TEST_TEE_STARTED, $* " in
done,*) done,*)
# do not redirect again # do not redirect again
;; ;;
*' --tee '*|*' --va'*) *' --tee '*|*' --va'*|*' --verbose-log '*)
mkdir -p "$TEST_OUTPUT_DIRECTORY/test-results" mkdir -p "$TEST_OUTPUT_DIRECTORY/test-results"
BASE="$TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" .sh)" BASE="$TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" .sh)"
# Make this filename available to the sub-process in case it is using
# --verbose-log.
GIT_TEST_TEE_OUTPUT_FILE=$BASE.out
export GIT_TEST_TEE_OUTPUT_FILE
# Truncate before calling "tee -a" to get rid of the results
# from any previous runs.
>"$GIT_TEST_TEE_OUTPUT_FILE"
(GIT_TEST_TEE_STARTED=done ${SHELL_PATH} "$0" "$@" 2>&1; (GIT_TEST_TEE_STARTED=done ${SHELL_PATH} "$0" "$@" 2>&1;
echo $? > $BASE.exit) | tee $BASE.out echo $? >"$BASE.exit") | tee -a "$GIT_TEST_TEE_OUTPUT_FILE"
test "$(cat $BASE.exit)" = 0 test "$(cat "$BASE.exit")" = 0
exit exit
;; ;;
esac esac
@ -246,6 +256,9 @@ do
trace=t trace=t
verbose=t verbose=t
shift ;; shift ;;
--verbose-log)
verbose_log=t
shift ;;
*) *)
echo "error: unknown test option '$1'" >&2; exit 1 ;; echo "error: unknown test option '$1'" >&2; exit 1 ;;
esac esac
@ -308,6 +321,16 @@ say () {
say_color info "$*" say_color info "$*"
} }
if test -n "$HARNESS_ACTIVE"
then
if test "$verbose" = t || test -n "$verbose_only"
then
printf 'Bail out! %s\n' \
'verbose mode forbidden under TAP harness; try --verbose-log'
exit 1
fi
fi
test "${test_description}" != "" || test "${test_description}" != "" ||
error "Test script did not set test_description." error "Test script did not set test_description."
@ -319,7 +342,10 @@ fi
exec 5>&1 exec 5>&1
exec 6<&0 exec 6<&0
if test "$verbose" = "t" if test "$verbose_log" = "t"
then
exec 3>>"$GIT_TEST_TEE_OUTPUT_FILE" 4>&3
elif test "$verbose" = "t"
then then
exec 4>&2 3>&1 exec 4>&2 3>&1
else else