mirror of
https://github.com/git/git.git
synced 2024-12-13 03:44:17 +08:00
3f824e91c8
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>
106 lines
2.8 KiB
Makefile
106 lines
2.8 KiB
Makefile
# Run tests
|
|
#
|
|
# Copyright (c) 2005 Junio C Hamano
|
|
#
|
|
|
|
-include ../config.mak.autogen
|
|
-include ../config.mak
|
|
|
|
#GIT_TEST_OPTS = --verbose --debug
|
|
SHELL_PATH ?= $(SHELL)
|
|
TEST_SHELL_PATH ?= $(SHELL_PATH)
|
|
PERL_PATH ?= /usr/bin/perl
|
|
TAR ?= $(TAR)
|
|
RM ?= rm -f
|
|
PROVE ?= prove
|
|
DEFAULT_TEST_TARGET ?= test
|
|
TEST_LINT ?= test-lint
|
|
|
|
ifdef TEST_OUTPUT_DIRECTORY
|
|
TEST_RESULTS_DIRECTORY = $(TEST_OUTPUT_DIRECTORY)/test-results
|
|
else
|
|
TEST_RESULTS_DIRECTORY = test-results
|
|
endif
|
|
|
|
# Shell quote;
|
|
SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
|
|
TEST_SHELL_PATH_SQ = $(subst ','\'',$(TEST_SHELL_PATH))
|
|
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
|
|
TEST_RESULTS_DIRECTORY_SQ = $(subst ','\'',$(TEST_RESULTS_DIRECTORY))
|
|
|
|
T = $(sort $(wildcard t[0-9][0-9][0-9][0-9]-*.sh))
|
|
TGITWEB = $(sort $(wildcard t95[0-9][0-9]-*.sh))
|
|
THELPERS = $(sort $(filter-out $(T),$(wildcard *.sh)))
|
|
|
|
all: $(DEFAULT_TEST_TARGET)
|
|
|
|
test: pre-clean $(TEST_LINT)
|
|
$(MAKE) aggregate-results-and-cleanup
|
|
|
|
failed:
|
|
@failed=$$(cd '$(TEST_RESULTS_DIRECTORY_SQ)' && \
|
|
grep -l '^failed [1-9]' *.counts | \
|
|
sed -n 's/\.counts$$/.sh/p') && \
|
|
test -z "$$failed" || $(MAKE) $$failed
|
|
|
|
prove: pre-clean $(TEST_LINT)
|
|
@echo "*** prove ***"; $(PROVE) --exec '$(TEST_SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
|
|
$(MAKE) clean-except-prove-cache
|
|
|
|
$(T):
|
|
@echo "*** $@ ***"; '$(TEST_SHELL_PATH_SQ)' $@ $(GIT_TEST_OPTS)
|
|
|
|
pre-clean:
|
|
$(RM) -r '$(TEST_RESULTS_DIRECTORY_SQ)'
|
|
|
|
clean-except-prove-cache:
|
|
$(RM) -r 'trash directory'.* '$(TEST_RESULTS_DIRECTORY_SQ)'
|
|
$(RM) -r valgrind/bin
|
|
|
|
clean: clean-except-prove-cache
|
|
$(RM) .prove
|
|
|
|
test-lint: test-lint-duplicates test-lint-executable test-lint-shell-syntax \
|
|
test-lint-filenames
|
|
|
|
test-lint-duplicates:
|
|
@dups=`echo $(T) | tr ' ' '\n' | sed 's/-.*//' | sort | uniq -d` && \
|
|
test -z "$$dups" || { \
|
|
echo >&2 "duplicate test numbers:" $$dups; exit 1; }
|
|
|
|
test-lint-executable:
|
|
@bad=`for i in $(T); do test -x "$$i" || echo $$i; done` && \
|
|
test -z "$$bad" || { \
|
|
echo >&2 "non-executable tests:" $$bad; exit 1; }
|
|
|
|
test-lint-shell-syntax:
|
|
@'$(PERL_PATH_SQ)' check-non-portable-shell.pl $(T) $(THELPERS)
|
|
|
|
test-lint-filenames:
|
|
@# We do *not* pass a glob to ls-files but use grep instead, to catch
|
|
@# non-ASCII characters (which are quoted within double-quotes)
|
|
@bad="$$(git -c core.quotepath=true ls-files 2>/dev/null | \
|
|
grep '["*:<>?\\|]')"; \
|
|
test -z "$$bad" || { \
|
|
echo >&2 "non-portable file name(s): $$bad"; exit 1; }
|
|
|
|
aggregate-results-and-cleanup: $(T)
|
|
$(MAKE) aggregate-results
|
|
$(MAKE) clean
|
|
|
|
aggregate-results:
|
|
for f in '$(TEST_RESULTS_DIRECTORY_SQ)'/t*-*.counts; do \
|
|
echo "$$f"; \
|
|
done | '$(SHELL_PATH_SQ)' ./aggregate-results.sh
|
|
|
|
gitweb-test:
|
|
$(MAKE) $(TGITWEB)
|
|
|
|
valgrind:
|
|
$(MAKE) GIT_TEST_OPTS="$(GIT_TEST_OPTS) --valgrind"
|
|
|
|
perf:
|
|
$(MAKE) -C perf/ all
|
|
|
|
.PHONY: pre-clean $(T) aggregate-results clean valgrind perf
|