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 <p...@peff.net>
Signed-off-by: Torsten Bögershausen <tbo...@web.de>
---

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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to