Merge branch 'tb/test-shell-lint'
authorJunio C Hamano <gitster@pobox.com>
Thu, 10 Jan 2013 21:47:04 +0000 (13:47 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 10 Jan 2013 21:47:04 +0000 (13:47 -0800)
Check for common mistakes in the test scripts, based on simple
pattern-matching.

* tb/test-shell-lint:
test: Add check-non-portable-shell.pl

t/Makefile
t/check-non-portable-shell.pl [new file with mode: 0755]
index 5c6de8169bfc02fc280d2dcb8cf34a912f0b0f6a..1923cc104bc71e5a696676232d6f42b47a19de25 100644 (file)
@@ -17,6 +17,7 @@ TEST_LINT ?= test-lint-duplicates test-lint-executable
 
 # Shell quote;
 SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))
+PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH))
 
 T = $(sort $(wildcard t[0-9][0-9][0-9][0-9]-*.sh))
 TSVN = $(sort $(wildcard t91[0-9][0-9]-*.sh))
@@ -44,7 +45,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` && \
@@ -56,6 +57,9 @@ test-lint-executable:
                test -z "$$bad" || { \
                echo >&2 "non-executable tests:" $$bad; exit 1; }
 
+test-lint-shell-syntax:
+       @'$(PERL_PATH_SQ)' check-non-portable-shell.pl $(T)
+
 aggregate-results-and-cleanup: $(T)
        $(MAKE) aggregate-results
        $(MAKE) clean
@@ -88,7 +92,7 @@ test-results:
        mkdir -p test-results
 
 test-results/git-smoke.tar.gz: test-results
-       $(PERL_PATH) ./harness \
+       '$(PERL_PATH_SQ)' ./harness \
                --archive="test-results/git-smoke.tar.gz" \
                $(T)
 
diff --git a/t/check-non-portable-shell.pl b/t/check-non-portable-shell.pl
new file mode 100755 (executable)
index 0000000..8b5a71d
--- /dev/null
@@ -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 '"test a == b" is not portable (please use =)';
+       # this resets our $. for each file
+       close ARGV if eof;
+}
+exit $exit_code;