t/Makefile: add machinery to check correctness of chainlint.sed

The --chain-lint option uses heuristics and knowledge of shell syntax to
detect broken &&-chains in subshells by pure textual inspection.
Although the heuristics work well, they are still best-guesses and
future changes could accidentally break assumptions upon which they are
based. To protect against this possibility, tests checking correctness
of the linter itself will be added. As preparation, add a new makefile
"check-chainlint" target and associated machinery.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Eric Sunshine 2018-07-11 02:46:34 -04:00 committed by Junio C Hamano
parent 878f988350
commit 803394459d
2 changed files with 22 additions and 4 deletions

1
t/.gitignore vendored
View File

@ -1,3 +1,4 @@
/trash directory* /trash directory*
/test-results /test-results
/.prove /.prove
/chainlinttmp

View File

@ -18,8 +18,10 @@ TEST_LINT ?= test-lint
ifdef TEST_OUTPUT_DIRECTORY ifdef TEST_OUTPUT_DIRECTORY
TEST_RESULTS_DIRECTORY = $(TEST_OUTPUT_DIRECTORY)/test-results TEST_RESULTS_DIRECTORY = $(TEST_OUTPUT_DIRECTORY)/test-results
CHAINLINTTMP = $(TEST_OUTPUT_DIRECTORY)/chainlinttmp
else else
TEST_RESULTS_DIRECTORY = test-results TEST_RESULTS_DIRECTORY = test-results
CHAINLINTTMP = chainlinttmp
endif endif
# Shell quote; # Shell quote;
@ -27,14 +29,17 @@ SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
TEST_SHELL_PATH_SQ = $(subst ','\'',$(TEST_SHELL_PATH)) TEST_SHELL_PATH_SQ = $(subst ','\'',$(TEST_SHELL_PATH))
PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH)) PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
TEST_RESULTS_DIRECTORY_SQ = $(subst ','\'',$(TEST_RESULTS_DIRECTORY)) TEST_RESULTS_DIRECTORY_SQ = $(subst ','\'',$(TEST_RESULTS_DIRECTORY))
CHAINLINTTMP_SQ = $(subst ','\'',$(CHAINLINTTMP))
T = $(sort $(wildcard t[0-9][0-9][0-9][0-9]-*.sh)) T = $(sort $(wildcard t[0-9][0-9][0-9][0-9]-*.sh))
TGITWEB = $(sort $(wildcard t95[0-9][0-9]-*.sh)) TGITWEB = $(sort $(wildcard t95[0-9][0-9]-*.sh))
THELPERS = $(sort $(filter-out $(T),$(wildcard *.sh))) THELPERS = $(sort $(filter-out $(T),$(wildcard *.sh)))
CHAINLINTTESTS = $(sort $(patsubst chainlint/%.test,%,$(wildcard chainlint/*.test)))
CHAINLINT = sed -f chainlint.sed
all: $(DEFAULT_TEST_TARGET) all: $(DEFAULT_TEST_TARGET)
test: pre-clean $(TEST_LINT) test: pre-clean check-chainlint $(TEST_LINT)
$(MAKE) aggregate-results-and-cleanup $(MAKE) aggregate-results-and-cleanup
failed: failed:
@ -43,7 +48,7 @@ failed:
sed -n 's/\.counts$$/.sh/p') && \ sed -n 's/\.counts$$/.sh/p') && \
test -z "$$failed" || $(MAKE) $$failed test -z "$$failed" || $(MAKE) $$failed
prove: pre-clean $(TEST_LINT) prove: pre-clean check-chainlint $(TEST_LINT)
@echo "*** prove ***"; $(PROVE) --exec '$(TEST_SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS) @echo "*** prove ***"; $(PROVE) --exec '$(TEST_SHELL_PATH_SQ)' $(GIT_PROVE_OPTS) $(T) :: $(GIT_TEST_OPTS)
$(MAKE) clean-except-prove-cache $(MAKE) clean-except-prove-cache
@ -53,13 +58,25 @@ $(T):
pre-clean: pre-clean:
$(RM) -r '$(TEST_RESULTS_DIRECTORY_SQ)' $(RM) -r '$(TEST_RESULTS_DIRECTORY_SQ)'
clean-except-prove-cache: clean-except-prove-cache: clean-chainlint
$(RM) -r 'trash directory'.* '$(TEST_RESULTS_DIRECTORY_SQ)' $(RM) -r 'trash directory'.* '$(TEST_RESULTS_DIRECTORY_SQ)'
$(RM) -r valgrind/bin $(RM) -r valgrind/bin
clean: clean-except-prove-cache clean: clean-except-prove-cache
$(RM) .prove $(RM) .prove
clean-chainlint:
$(RM) -r '$(CHAINLINTTMP_SQ)'
check-chainlint:
@mkdir -p '$(CHAINLINTTMP_SQ)' && \
err=0 && \
for i in $(CHAINLINTTESTS); do \
$(CHAINLINT) <chainlint/$$i.test | \
sed -e '/^# LINT: /d' >'$(CHAINLINTTMP_SQ)'/$$i.actual && \
diff -u chainlint/$$i.expect '$(CHAINLINTTMP_SQ)'/$$i.actual || err=1; \
done && exit $$err
test-lint: test-lint-duplicates test-lint-executable test-lint-shell-syntax \ test-lint: test-lint-duplicates test-lint-executable test-lint-shell-syntax \
test-lint-filenames test-lint-filenames
@ -102,4 +119,4 @@ valgrind:
perf: perf:
$(MAKE) -C perf/ all $(MAKE) -C perf/ all
.PHONY: pre-clean $(T) aggregate-results clean valgrind perf .PHONY: pre-clean $(T) aggregate-results clean valgrind perf check-chainlint clean-chainlint