Re: [PATCH v3 1/1] check-non-portable-shell.pl: Quoted `wc -l` is not portable
From: Junio C Hamano <hidden>
Date: 2017-12-22 21:08:08
tboegi@web.de writes:
Reviewed-by: Johannes Schindelin <redacted> Signed-off-by: Torsten Bögershausen <redacted>
I'll flip these and add a helped-by to credit Eric.
check-non-portable-shell.pl: `wc -l` may have leading WS
Test scripts count number of lines in an output and check it againt
its expectation. fb3340a6 ("test-lib: introduce test_line_count to
measure files", 2010-10-31) introduced a helper to show a failure in
such a test in a more readable way than comparing `wc -l` output with
a number.
Besides, on some platforms, "$(wc -l <file)" is padded with leading
whitespace on the left, so
test "$(wc -l <file)" = 4
would not work (most notably on macosX); the users of test_line_count
helper would not suffer from such a portability glitch.
Add a check in check-non-portable-shell.pl to find '"' between
`wc -l` and '=' and hint the user about test_line_count().
Signed-off-by: Torsten Bögershausen [off-list ref]
Reviewed-by: Johannes Schindelin [off-list ref]
Helped-by: Eric Sunshine [off-list ref]
Signed-off-by: Junio C Hamano [off-list ref]
quoted hunk
--- t/check-non-portable-shell.pl | 1 + 1 file changed, 1 insertion(+)diff --git a/t/check-non-portable-shell.pl b/t/check-non-portable-shell.pl index 03dc9d285..e07f02843 100755Use () around the hint. Thanks to Eric for the sharp eyes.--- a/t/check-non-portable-shell.pl +++ b/t/check-non-portable-shell.pl
Don't try to apply this patch to your tree yourself ;-)
quoted hunk
@@ -21,6 +21,7 @@ while (<>) { /^\s*declare\s+/ and err 'arrays/declare not portable'; /^\s*[^#]\s*which\s/ and err 'which is not portable (please use type)'; /\btest\s+[^=]*==/ and err '"test a == b" is not portable (please use =)'; + /\bwc -l.*"\s*=/ and err '`"$(wc -l)"` is not portable (please use test_line_count)'; /\bexport\s+[A-Za-z0-9_]*=/ and err '"export FOO=bar" is not portable (please use FOO=bar && export FOO)'; # this resets our $. for each file close ARGV if eof;
Thanks. The dq before \s*= is rather cute ;-)