Maintainer-check: warn against zsh xtrace bug. Extended target maintainer-check, to warn against idioms and constructs in test scripts which might trigger the Zsh xtrace bug.
* Makefile.am (sc_tests_stderr_redirection): New check. (sc_tests_stderr_redirection__perl_code): New internal macro. (sc_tests_stderr_redirection__whitelist): Likewise. (syntax_check_rules): Added `sc_tests_stderr_redirection'.
From ec8b0ea72f2423d648e366d76ac192c7307e1411 Mon Sep 17 00:00:00 2001 From: Stefano Lattarini <[email protected]> Date: Tue, 8 Dec 2009 18:09:14 +0100 Subject: [PATCH 2/8] Maintainer-check: warn against zsh xtrace bug Extended target maintainer-check, to warn against idioms and constructs in test scripts which might trigger the Zsh xtrace bug. * Makefile.am (sc_tests_stderr_redirection): New check. (sc_tests_stderr_redirection__perl_code): New internal macro. (sc_tests_stderr_redirection__whitelist): Likewise. (syntax_check_rules): Added `sc_tests_stderr_redirection'. --- ChangeLog | 10 +++++++++ Makefile.am | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile.in | 44 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 0 deletions(-) diff --git a/ChangeLog b/ChangeLog index 825e919..0b81e60 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2009-01-31 Stefano Lattarini <[email protected]> + + Extended target maintainer-check, to warn against idioms and + constructs in test scripts which might trigger the Zsh xtrace + bug. + * Makefile.am (sc_tests_stderr_redirection): New check. + (sc_tests_stderr_redirection__perl_code): New internal macro. + (sc_tests_stderr_redirection__whitelist): Likewise. + (syntax_check_rules): Added `sc_tests_stderr_redirection'. + 2010-01-31 Stefano Lattarini <[email protected]> Testsuite: avoid Zsh-related problem with `set -x'. diff --git a/Makefile.am b/Makefile.am index 08047d2..fc8207a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -190,6 +190,7 @@ sc_tests_required_after_defs \ sc_tests_overriding_macros_on_cmdline \ sc_tests_plain_sleep \ sc_tests_plain_egrep_fgrep \ +sc_tests_stderr_redirection \ sc_mkdir_p \ sc_perl_at_substs \ sc_unquoted_DESTDIR \ @@ -496,6 +497,71 @@ sc_at_in_texi: exit 1; \ fi +## Helper internal macro, holding a list of `file-name:line-number' +## couples which are exempted from the checks done by target +## `sc_tests_stderr_redirection' below. +sc_tests_stderr_redirection__whitelist = \ + ccnoco.test:37 \ + depcomp5.test:24 + +## Helper internal macro, used in the target `sc_tests_stderr_redirection' +## below. Do NOT use single quotes in the definition of this macro (using +## them in `##' comments is ok, though, as they get stripped by automake). +sc_tests_stderr_redirection__perl_code = \ + use strict; \ + use warnings FATAL => "all"; \ + $$^W = 1; \ + my $$e = 0; \ + ## List of whitelisted `file-name:line-number' couples, for which + ## our checks are to be skipped. + my @whitelist = qw!$(sc_tests_stderr_redirection__whitelist)!; \ + my %whitelist = map { $$_ => 1 } @whitelist; \ + foreach my $$file (@ARGV) { \ + open(FILE, "<$$file") or die "$$file: cannot open: $$!\n"; \ + while (<FILE>) { \ + ## Remove traling newline from current input line. + chomp; \ + if (exists $$whitelist{"$$file:$$."}) { \ + ## Current line is whitelisted, checks must be skipped + print "$@: INFO: skipping whitelisted line $$file:$$.\n"; \ + next; \ + }; \ + ## Save original input line. + my $$s = $$_; \ + ## Normalize format of redirections. + s|(>+)\s*|$$1|g; \ + ## For our purposes, there is no distinction between overriding + ## (`> out') and appending (`>> out') redirections. + s|>>|>|g; \ + ## The construct `>/dev/null 2>&1' still redirects stderr to + ## /dev/null, so we can safely ignore it. + s|>/dev/null\s+2>&1\b||g; \ + ## Look for bad stderr redirections, and if any is found, + ## display the guilty line (with file name and line number), + ## and properly update the exit status. + if (m|\b2>(?!/dev/null\b)|) { \ + print "$$file:$$.: $$s\n"; \ + $$e = 1; \ + }; \ + }; \ + close(FILE) or die "$$file: cannot close: $$!\n"; \ + }; \ + exit $$e; + +## Redirecting standard error to something != /dev/null might be +## inappropriate when shell traces are on, due to a bug in Zsh hadling +## of the xtrace flag. +sc_tests_stderr_redirection: + @cd $(srcdir)/tests || exit 1; \ + $(PERL) -e '$(sc_tests_stderr_redirection__perl_code)' *.test; \ + case $$? in \ + 0) exit 0;; \ + 1) echo $@: The previous lines might trigger a Zsh xtrace bug.; \ + echo $@: Consider using the run_command shell function.;; \ + *) echo $@: INTERNAL ERROR in auxiliary perl script.;; \ + esac 1>&2; \ + exit 1; + git-dist: maintainer-check ## Make sure the NEWS file is up-to-date. diff --git a/Makefile.in b/Makefile.in index e8fb282..0082bde 100644 --- a/Makefile.in +++ b/Makefile.in @@ -312,12 +312,45 @@ sc_tests_required_after_defs \ sc_tests_overriding_macros_on_cmdline \ sc_tests_plain_sleep \ sc_tests_plain_egrep_fgrep \ +sc_tests_stderr_redirection \ sc_mkdir_p \ sc_perl_at_substs \ sc_unquoted_DESTDIR \ sc_tabs_in_texi \ sc_at_in_texi +sc_tests_stderr_redirection__whitelist = \ + ccnoco.test:37 \ + depcomp5.test:24 + +sc_tests_stderr_redirection__perl_code = \ + use strict; \ + use warnings FATAL => "all"; \ + $$^W = 1; \ + my $$e = 0; \ + my @whitelist = qw!$(sc_tests_stderr_redirection__whitelist)!; \ + my %whitelist = map { $$_ => 1 } @whitelist; \ + foreach my $$file (@ARGV) { \ + open(FILE, "<$$file") or die "$$file: cannot open: $$!\n"; \ + while (<FILE>) { \ + chomp; \ + if (exists $$whitelist{"$$file:$$."}) { \ + print "$@: INFO: skipping whitelisted line $$file:$$.\n"; \ + next; \ + }; \ + my $$s = $$_; \ + s|(>+)\s*|$$1|g; \ + s|>>|>|g; \ + s|>/dev/null\s+2>&1\b||g; \ + if (m|\b2>(?!/dev/null\b)|) { \ + print "$$file:$$.: $$s\n"; \ + $$e = 1; \ + }; \ + }; \ + close(FILE) or die "$$file: cannot close: $$!\n"; \ + }; \ + exit $$e; + WGET = wget WGET_SV_CVS = $(WGET) http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/ WGET_SV_GIT_CF = $(WGET) 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;hb=HEAD;f=' @@ -1210,6 +1243,17 @@ sc_at_in_texi: exit 1; \ fi +sc_tests_stderr_redirection: + @cd $(srcdir)/tests || exit 1; \ + $(PERL) -e '$(sc_tests_stderr_redirection__perl_code)' *.test; \ + case $$? in \ + 0) exit 0;; \ + 1) echo $@: The previous lines might trigger a Zsh xtrace bug.; \ + echo $@: Consider using the run_command shell function.;; \ + *) echo $@: INTERNAL ERROR in auxiliary perl script.;; \ + esac 1>&2; \ + exit 1; + git-dist: maintainer-check @if sed 1q $(srcdir)/NEWS | grep -e "$(VERSION)" > /dev/null; then :; else \ echo "NEWS not updated; not releasing" 1>&2; \ -- 1.6.5
