'test-lib.sh' looks for the presence of certain options like '--tee'
and '--verbose-log', so it can execute the test script again to save
its standard output and error.  This happens way before the actual
option parsing loop, and the condition looking for these options looks
a bit odd, too.  This patch series will add two more options to look
out for, and, in addition, will have to extract these options' stuck
arguments (i.e. '--opt=arg') as well.

Add a proper option parsing loop to check these select options early
in 'test-lib.sh', making this early option checking more readable and
keeping those later changes in this series simpler.  Use a 'for opt in
"$@"' loop to iterate over the options to preserve "$@" intact, so
options like '--verbose-log' can execute the test script again with
all the original options.

As an alternative, we could parse all options early, but there are
options that do require an _unstuck_ argument, which is tricky to
handle properly in such a for loop, and the resulting complexity is,
in my opinion, worse than having this extra, partial option parsing
loop.

Signed-off-by: SZEDER Gábor <szeder....@gmail.com>
---
 t/test-lib.sh | 53 +++++++++++++++++++++++++++++++--------------------
 1 file changed, 32 insertions(+), 21 deletions(-)

diff --git a/t/test-lib.sh b/t/test-lib.sh
index 9a3f7930a3..5577d9dc5a 100644
--- a/t/test-lib.sh
+++ b/t/test-lib.sh
@@ -71,13 +71,33 @@ then
        exit 1
 fi
 
+# Parse some options early, taking care to leave $@ intact.
+for opt
+do
+       case "$opt" in
+       --tee)
+               tee=t ;;
+       -V|--verbose-log)
+               verbose_log=t ;;
+       --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
+               valgrind=memcheck ;;
+       --valgrind=*)
+               valgrind=${opt#--*=} ;;
+       --valgrind-only=*)
+               valgrind_only=${opt#--*=} ;;
+       *)
+               # Other options will be handled later.
+       esac
+done
+
 # 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 '*|*' --va'*|*' -V '*|*' --verbose-log '*)
+if test "$GIT_TEST_TEE_STARTED" = "done"
+then
+       : # do not redirect again
+elif test -n "$tee" || test -n "$verbose_log" ||
+     test -n "$valgrind" || test -n "$valgrind_only"
+then
        mkdir -p "$TEST_OUTPUT_DIRECTORY/test-results"
        BASE="$TEST_OUTPUT_DIRECTORY/test-results/$(basename "$0" .sh)"
 
@@ -94,8 +114,7 @@ done,*)
         echo $? >"$BASE.exit") | tee -a "$GIT_TEST_TEE_OUTPUT_FILE"
        test "$(cat "$BASE.exit")" = 0
        exit
-       ;;
-esac
+fi
 
 # For repeatability, reset the environment to known value.
 # TERM is sanitized below, after saving color control sequences.
@@ -296,17 +315,6 @@ do
                with_dashes=t; shift ;;
        --no-color)
                color=; shift ;;
-       --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind)
-               valgrind=memcheck
-               shift ;;
-       --valgrind=*)
-               valgrind=${1#--*=}
-               shift ;;
-       --valgrind-only=*)
-               valgrind_only=${1#--*=}
-               shift ;;
-       --tee)
-               shift ;; # was handled already
        --root=*)
                root=${1#--*=}
                shift ;;
@@ -336,9 +344,12 @@ do
                        echo >&2 "warning: ignoring -x; '$0' is untraceable 
without BASH_XTRACEFD"
                fi
                shift ;;
-       -V|--verbose-log)
-               verbose_log=t
-               shift ;;
+       --tee|\
+       -V|--verbose-log|\
+       --va|--val|--valg|--valgr|--valgri|--valgrin|--valgrind|\
+       --valgrind=*|\
+       --valgrind-only=*)
+               shift ;; # These options were handled already.
        *)
                echo "error: unknown test option '$1'" >&2; exit 1 ;;
        esac
-- 
2.20.0.rc2.156.g5a9fd2ce9c

Reply via email to