t/Makefile: introduce TEST_SHELL_PATH

You may want to run the test suite with a different shell than you use to build Git. For instance, you may build with SHELL_PATH=/bin/sh (because it's faster, or it's what you expect to exist on systems where the build will be used) but want to run the test suite with bash (e.g., since that allows using "-x" reliably across the whole test suite). There's currently no good way to do this. You might think that doing two separate make invocations, like: make && make -C t SHELL_PATH=/bin/bash would work. And it _almost_ does. The second make will see our bash SHELL_PATH, and we'll use that to run the individual test scripts (or tell prove to use it to do so). So far so good. But this breaks down when "--tee" or "--verbose-log" is used. Those options cause the test script to actually re-exec itself using $SHELL_PATH. But wait, wouldn't our second make invocation have set SHELL_PATH correctly in the environment? Yes, but test-lib.sh sources GIT-BUILD-OPTIONS, which we built during the first "make". And that overrides the environment, giving us the original SHELL_PATH again. Let's introduce a new variable that lets you specify a specific shell to be run for the test scripts. Note that we have to touch both the main and t/ Makefiles, since we have to record it in GIT-BUILD-OPTIONS in one, and use it in the latter. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Dec 8, 2017 at 05:47 UTC 3f824e91c8480f7a236331096d2c4d969f013a83
3 files changed +13 -3
Makefile
+8
@@ -425,6 +425,10 @@ all::
425 #
426 # to say "export LESS=FRX (and LV=-c) if the environment variable
427 # LESS (and LV) is not set, respectively".
428 +#
429 +# Define TEST_SHELL_PATH if you want to use a shell besides SHELL_PATH for
430 +# running the test scripts (e.g., bash has better support for "set -x"
431 +# tracing).
432
433 GIT-VERSION-FILE: FORCE
434 @$(SHELL_PATH) ./GIT-VERSION-GEN
@@ -727,6 +731,8 @@ endif
731 export PERL_PATH
732 export PYTHON_PATH
733
734 +TEST_SHELL_PATH = $(SHELL_PATH)
735 +
736 LIB_FILE = libgit.a
737 XDIFF_LIB = xdiff/lib.a
738 VCSSVN_LIB = vcs-svn/lib.a
@@ -1721,6 +1727,7 @@ prefix_SQ = $(subst ','\'',$(prefix))
1727 gitwebdir_SQ = $(subst ','\'',$(gitwebdir))
1728
1729 SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
1730 +TEST_SHELL_PATH_SQ = $(subst ','\'',$(TEST_SHELL_PATH))
1731 PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
1732 PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH))
1733 TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH))
@@ -2351,6 +2358,7 @@ GIT-LDFLAGS: FORCE
2358 # and the first level quoting from the shell that runs "echo".
2359 GIT-BUILD-OPTIONS: FORCE
2360 @echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@+
2361 + @echo TEST_SHELL_PATH=\''$(subst ','\'',$(TEST_SHELL_PATH_SQ))'\' >>$@+
2362 @echo PERL_PATH=\''$(subst ','\'',$(PERL_PATH_SQ))'\' >>$@+
2363 @echo DIFF=\''$(subst ','\'',$(subst ','\'',$(DIFF)))'\' >>$@+
2364 @echo PYTHON_PATH=\''$(subst ','\'',$(PYTHON_PATH_SQ))'\' >>$@+
t/Makefile
+4 -2
@@ -8,6 +8,7 @@
8
9 #GIT_TEST_OPTS = --verbose --debug
10 SHELL_PATH ?= $(SHELL)
11 +TEST_SHELL_PATH ?= $(SHELL_PATH)
12 PERL_PATH ?= /usr/bin/perl
13 TAR ?= $(TAR)
14 RM ?= rm -f
@@ -23,6 +24,7 @@ endif
24
25 # Shell quote;
26 SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
27 +TEST_SHELL_PATH_SQ = $(subst ','\'',$(TEST_SHELL_PATH))
28 PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
29 TEST_RESULTS_DIRECTORY_SQ = $(subst ','\'',$(TEST_RESULTS_DIRECTORY))
30
@@ -42,11 +44,11 @@ failed:
44 test -z "$$failed" || $(MAKE) $$failed
45
46 prove: pre-clean $(TEST_LINT)
45 - @echo "*** prove ***"; $(PROVE) --exec '$(SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
47 + @echo "*** prove ***"; $(PROVE) --exec '$(TEST_SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
48 $(MAKE) clean-except-prove-cache
49
50 $(T):
49 - @echo "*** $@ ***"; '$(SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
51 + @echo "*** $@ ***"; '$(TEST_SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
52
53 pre-clean:
54 $(RM) -r '$(TEST_RESULTS_DIRECTORY_SQ)'
t/test-lib.sh
+1 -1
@@ -80,7 +80,7 @@ done,*)
80 # from any previous runs.
81 >"$GIT_TEST_TEE_OUTPUT_FILE"
82
83 - (GIT_TEST_TEE_STARTED=done ${SHELL_PATH} "$0" "$@" 2>&1;
83 + (GIT_TEST_TEE_STARTED=done ${TEST_SHELL_PATH} "$0" "$@" 2>&1;
84 echo $? >"$BASE.exit") | tee -a "$GIT_TEST_TEE_OUTPUT_FILE"
85 test "$(cat "$BASE.exit")" = 0
86 exit