Add the perl script "check-non-portable-shell.pl" to detect non-portable shell syntax "echo -n" is an example of a shell command working on Linux, but not on Mac OS X. These shell commands are checked and reported as error: - "echo -n" (printf should be used) - "sed -i" (Use a temp file) - arrays in shell scripts (declare statement) - "which" (type should be used) - "==" (bash style for =) "make test-lint-shell-syntax" can be used to run only the check. "make" will run check-non-portable-shell.pl followed by t0000.sh -- t9999.sh "TEST_LINT= make" will only run t0000.sh -- t9999.sh Helped-By: Jeff King <peff@xxxxxxxx> Signed-off-by: Torsten Bögershausen <tboegi@xxxxxx> --- Thanks for reviewing & suggestions Changes since v1: Makefile: - "$TEST_LINT= make" will disable the check check-non-portable-shell.pl: - Much more perl style (instead of C-Code in perl language) Hopefuly better commit message t/Makefile | 6 +++++- t/check-non-portable-shell.pl | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100755 t/check-non-portable-shell.pl diff --git a/t/Makefile b/t/Makefile index 88e289f..fd239cb 100644 --- a/t/Makefile +++ b/t/Makefile @@ -13,6 +13,7 @@ TAR ?= $(TAR) RM ?= rm -f PROVE ?= prove DEFAULT_TEST_TARGET ?= test +TEST_LINT ?= test-lint-shell-syntax # Shell quote; SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) @@ -43,7 +44,7 @@ clean-except-prove-cache: clean: clean-except-prove-cache $(RM) .prove -test-lint: test-lint-duplicates test-lint-executable +test-lint: test-lint-duplicates test-lint-executable test-lint-shell-syntax test-lint-duplicates: @dups=`echo $(T) | tr ' ' '\n' | sed 's/-.*//' | sort | uniq -d` && \ @@ -55,6 +56,9 @@ test-lint-executable: test -z "$$bad" || { \ echo >&2 "non-executable tests:" $$bad; exit 1; } +test-lint-shell-syntax: + $(PERL_PATH) check-non-portable-shell.pl $(T) + aggregate-results-and-cleanup: $(T) $(MAKE) aggregate-results $(MAKE) clean diff --git a/t/check-non-portable-shell.pl b/t/check-non-portable-shell.pl new file mode 100755 index 0000000..49d7291 --- /dev/null +++ b/t/check-non-portable-shell.pl @@ -0,0 +1,27 @@ +#!/usr/bin/perl + +# Test t0000..t9999.sh for non portable shell scripts +# This script can be called with one or more filenames as parameters + +use strict; +use warnings; + +my $exit_code=0; + +sub err { + my $msg = shift; + print "$ARGV:$.: error: $msg: $_\n"; + $exit_code = 1; +} + +while (<>) { + chomp; + /^\s*sed\s+-i/ and err 'sed -i is not portable'; + /^\s*echo\s+-n/ and err 'echo -n is not portable (please use printf)'; + /^\s*declare\s+/ and err 'arrays/declare not portable'; + /^\s*[^#]\s*which\s/ and err 'which is not portable (please use type)'; + /test\s+[^=]*==/ and err '== is not portable (please use =)'; + # this resets our $. for each file + close ARGV if eof; +} +exit $exit_code; -- 1.8.0.197.g5a90748 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html