@@ -9,9 +9,9 @@
# Input arguments are pathnames of shell scripts containing test definitions,
# or globs referencing a collection of scripts. For each problem discovered,
# the pathname of the script containing the test is printed along with the test
-# name and the test body with a `?!ERR?!` annotation at the location of each
-# detected problem, where "FOO" is a tag such as "AMP" which indicates a broken
-# &&-chain. Returns zero if no problems are discovered, otherwise non-zero.
+# name and the test body with a `?!LINT: ...?!` annotation at the location of
+# each detected problem, where "..." is an explanation of the problem. Returns
+# zero if no problems are discovered, otherwise non-zero.
use warnings;
use strict;
@@ -657,16 +657,17 @@ sub check_test {
for (sort {$a->[1]->[2] <=> $b->[1]->[2]} @$problems) {
my ($label, $token) = @$_;
my $pos = $token->[2];
- my $err = format_problem($label, $token);
- $checked .= substr($body, $start, $pos - $start) . " ?!ERR $err?! ";
+ my $err = format_problem($label);
+ $checked .= substr($body, $start, $pos - $start);
+ $checked .= ' ' unless $checked =~ /\s$/;
+ $checked .= "${erropen}LINT: $err$errclose";
+ $checked .= ' ' unless $pos >= length($body) ||
+ substr($body, $pos, 1) =~ /^\s/;
$start = $pos;
}
$checked .= substr($body, $start);
$checked =~ s/^/$lineno++ . ' '/mge;
$checked =~ s/^\d+ \n//;
- $checked =~ s/(\s) \?!/$1?!/mg;
- $checked =~ s/\?! (\s)/?!$1/mg;
- $checked =~ s/\?!([^?]+)\?!/$erropen$1$errclose/mg;
$checked =~ s/^\d+/$c->{dim}$&$c->{reset}/mg;
$checked .= "\n" unless $checked =~ /\n$/;
push(@{$self->{output}}, "$c->{blue}# chainlint: $title$c->{reset}\n$checked");
@@ -4,6 +4,6 @@
5 baz
6 ) &&
7 (
-8 bar=$((42 + 1)) ?!ERR missing '&&'?!
+8 bar=$((42 + 1)) ?!LINT: missing '&&'?!
9 baz
10 )
@@ -1,20 +1,20 @@
2 (
3 foo &&
4 {
-5 echo a ?!ERR missing '&&'?!
+5 echo a ?!LINT: missing '&&'?!
6 echo b
7 } &&
8 bar &&
9 {
10 echo c
-11 } ?!ERR missing '&&'?!
+11 } ?!LINT: missing '&&'?!
12 baz
13 ) &&
14
15 {
-16 echo a; ?!ERR missing '&&'?! echo b
+16 echo a; ?!LINT: missing '&&'?! echo b
17 } &&
-18 { echo a; ?!ERR missing '&&'?! echo b; } &&
+18 { echo a; ?!LINT: missing '&&'?! echo b; } &&
19
20 {
21 echo "${var}9" &&
@@ -1,6 +1,6 @@
2 (
3 foo &&
-4 bar ?!ERR missing '&&'?!
+4 bar ?!LINT: missing '&&'?!
5 baz &&
6 wop
7 )
@@ -9,11 +9,11 @@
10 case "$x" in
11 x) foo ;;
12 *) bar ;;
-13 esac ?!ERR missing '&&'?!
+13 esac ?!LINT: missing '&&'?!
14 foobar
15 ) &&
16 (
17 case "$x" in 1) true;; esac &&
-18 case "$y" in 2) false;; esac ?!ERR missing '&&'?!
+18 case "$y" in 2) false;; esac ?!LINT: missing '&&'?!
19 foobar
20 )
@@ -4,6 +4,6 @@
5 echo failed!
6 false
7 else
-8 echo it went okay ?!ERR missing '&&'?!
+8 echo it went okay ?!LINT: missing '&&'?!
9 congratulate user
10 fi
@@ -1,5 +1,5 @@
2 echo nobody home && {
-3 test the doohicky ?!ERR missing '&&'?!
+3 test the doohicky ?!LINT: missing '&&'?!
4 right now
5 } &&
6
@@ -1,10 +1,10 @@
2 mkdir sub && (
3 cd sub &&
-4 foo the bar ?!ERR missing '&&'?!
+4 foo the bar ?!LINT: missing '&&'?!
5 nuff said
6 ) &&
7
8 cut "-d " -f actual | (read s1 s2 s3 &&
-9 test -f $s1 ?!ERR missing '&&'?!
+9 test -f $s1 ?!LINT: missing '&&'?!
10 test $(cat $s2) = tree2path1 &&
11 test $(cat $s3) = tree3path1)
@@ -4,6 +4,6 @@
5 baz
6 ) &&
7 (
-8 bar=$(gobble blocks) ?!ERR missing '&&'?!
+8 bar=$(gobble blocks) ?!LINT: missing '&&'?!
9 baz
10 )
@@ -4,6 +4,6 @@
5 :
6 else
7 echo >file
-8 fi ?!ERR missing '|| exit 1'?!
+8 fi ?!LINT: missing '|| exit 1'?!
9 done) &&
10 test ! -f file
@@ -2,7 +2,7 @@
3 bar
4 ) &&
5
-6 (cd foo ?!ERR missing '&&'?!
+6 (cd foo ?!LINT: missing '&&'?!
7 bar
8 ) &&
9
@@ -13,5 +13,5 @@
14 (cd foo &&
15 bar) &&
16
-17 (cd foo ?!ERR missing '&&'?!
+17 (cd foo ?!LINT: missing '&&'?!
18 bar)
@@ -1,14 +1,14 @@
2 (
3 for i in a b c
4 do
-5 echo $i ?!ERR missing '&&'?!
-6 cat <<-\EOF ?!ERR missing '|| exit 1'?!
+5 echo $i ?!LINT: missing '&&'?!
+6 cat <<-\EOF ?!LINT: missing '|| exit 1'?!
7 bar
8 EOF
-9 done ?!ERR missing '&&'?!
+9 done ?!LINT: missing '&&'?!
10
11 for i in a b c; do
12 echo $i &&
-13 cat $i ?!ERR missing '|| exit 1'?!
+13 cat $i ?!LINT: missing '|| exit 1'?!
14 done
15 )
@@ -4,8 +4,8 @@
5
6 remove_object() {
7 file=$(sha1_file "$*") &&
-8 test -e "$file" ?!ERR missing '&&'?!
+8 test -e "$file" ?!LINT: missing '&&'?!
9 rm -f "$file"
-10 } ?!ERR missing '&&'?!
+10 } ?!LINT: missing '&&'?!
11
12 sha1_file arg && remove_object arg
@@ -1,2 +1,2 @@
-2 echo "we should find this" ?!ERR missing '&&'?!
+2 echo "we should find this" ?!LINT: missing '&&'?!
3 echo "even though our heredoc has its indent stripped"
@@ -1,7 +1,7 @@
-2 echo "outer here-doc does not allow indented end-tag" ?!ERR missing '&&'?!
+2 echo "outer here-doc does not allow indented end-tag" ?!LINT: missing '&&'?!
3 cat >file <<-\EOF &&
4 but this inner here-doc
5 does allow indented EOF
6 EOF
-7 echo "missing chain after" ?!ERR missing '&&'?!
+7 echo "missing chain after" ?!LINT: missing '&&'?!
8 echo "but this line is OK because it's the end"
@@ -1,7 +1,7 @@
-2 echo "missing chain before" ?!ERR missing '&&'?!
+2 echo "missing chain before" ?!LINT: missing '&&'?!
3 cat >file <<-\EOF &&
4 inside inner here-doc
5 these are not shell commands
6 EOF
-7 echo "missing chain after" ?!ERR missing '&&'?!
+7 echo "missing chain after" ?!LINT: missing '&&'?!
8 echo "but this line is OK because it's the end"
@@ -1,2 +1,2 @@
-8 echo "actual test commands" ?!ERR missing '&&'?!
+8 echo "actual test commands" ?!LINT: missing '&&'?!
9 echo "that should be checked"
@@ -4,7 +4,7 @@
5 chunks: oid_fanout oid_lookup commit_metadata generation_data bloom_indexes bloom_data
6 EOF
7
-8 cat >expect << -EOF ?!ERR missing '&&'?!
+8 cat >expect << -EOF ?!LINT: missing '&&'?!
9 this is not indented
10 -EOF
11
@@ -3,6 +3,6 @@
4 fossil
5 vegetable
6 END
-7 wiffle) ?!ERR missing '&&'?!
+7 wiffle) ?!LINT: missing '&&'?!
8 echo $x
9 )
@@ -1,6 +1,6 @@
2 (
3 cat <<-\TXT && echo "multi-line
-4 string" ?!ERR missing '&&'?!
+4 string" ?!LINT: missing '&&'?!
5 fizzle
6 TXT
7 bap
@@ -2,6 +2,6 @@
3 marcia ||
4 kevin
5 then
-6 echo "nomads" ?!ERR missing '&&'?!
+6 echo "nomads" ?!LINT: missing '&&'?!
7 echo "for sure"
8 fi
@@ -5,8 +5,8 @@
6 then
7 echo "err"
8 exit 1
-9 fi ?!ERR missing '&&'?!
+9 fi ?!LINT: missing '&&'?!
10 foo
-11 done ?!ERR missing '&&'?!
+11 done ?!LINT: missing '&&'?!
12 bar
13 )
@@ -1,7 +1,7 @@
2 (
3 if test -n ""
4 then
-5 echo very ?!ERR missing '&&'?!
+5 echo very ?!LINT: missing '&&'?!
6 echo empty
7 elif test -z ""
8 then
@@ -11,7 +11,7 @@
12 cat <<-\EOF
13 bar
14 EOF
-15 fi ?!ERR missing '&&'?!
+15 fi ?!LINT: missing '&&'?!
16 echo poodle
17 ) &&
18 (
@@ -1,6 +1,6 @@
2 (
3 foobar && # comment 1
-4 barfoo ?!ERR missing '&&'?! # wrong position for &&
+4 barfoo ?!LINT: missing '&&'?! # wrong position for &&
5 flibble "not a # comment"
6 ) &&
7
@@ -11,5 +11,5 @@
12 do
13 printf "%"$n"s" X > r2/large.$n &&
14 git -C r2 add large.$n &&
-15 git -C r2 commit -m "$n" ?!ERR missing '|| return 1'?!
+15 git -C r2 commit -m "$n" ?!LINT: missing '|| return 1'?!
16 done
@@ -3,10 +3,10 @@
4 then
5 while true
6 do
-7 echo "pop" ?!ERR missing '&&'?!
-8 echo "glup" ?!ERR missing '|| exit 1'?!
-9 done ?!ERR missing '&&'?!
+7 echo "pop" ?!LINT: missing '&&'?!
+8 echo "glup" ?!LINT: missing '|| exit 1'?!
+9 done ?!LINT: missing '&&'?!
10 foo
-11 fi ?!ERR missing '&&'?!
+11 fi ?!LINT: missing '&&'?!
12 bar
13 )
@@ -3,7 +3,7 @@
4 line 2
5 line 3" &&
6 y="line 1
-7 line2" ?!ERR missing '&&'?!
+7 line2" ?!LINT: missing '&&'?!
8 foobar
9 ) &&
10 (
@@ -1,5 +1,5 @@
2 ! (foo && bar) &&
3 ! (foo && bar) >baz &&
4
-5 ! (foo; ?!ERR missing '&&'?! bar) &&
-6 ! (foo; ?!ERR missing '&&'?! bar) >baz
+5 ! (foo; ?!LINT: missing '&&'?! bar) &&
+6 ! (foo; ?!LINT: missing '&&'?! bar) >baz
@@ -5,7 +5,7 @@
6
7 (cd foo &&
8 bar
-9 ) ?!ERR missing '&&'?!
+9 ) ?!LINT: missing '&&'?!
10
11 (
12 cd foo &&
@@ -13,13 +13,13 @@
14
15 (
16 cd foo &&
-17 bar) ?!ERR missing '&&'?!
+17 bar) ?!LINT: missing '&&'?!
18
19 (cd foo &&
20 bar) &&
21
22 (cd foo &&
-23 bar) ?!ERR missing '&&'?!
+23 bar) ?!LINT: missing '&&'?!
24
25 foobar
26 )
@@ -18,7 +18,7 @@
19 toink
20 INPUT_END
21
-22 cat <<-\EOT ?!ERR missing '&&'?!
+22 cat <<-\EOT ?!LINT: missing '&&'?!
23 text goes here
24 data <<EOF
25 data goes here
@@ -2,8 +2,8 @@
3 do
4 for j in 0 1 2 3 4 5 6 7 8 9;
5 do
-6 echo "$i$j" >"path$i$j" ?!ERR missing '|| return 1'?!
-7 done ?!ERR missing '|| return 1'?!
+6 echo "$i$j" >"path$i$j" ?!LINT: missing '|| return 1'?!
+7 done ?!LINT: missing '|| return 1'?!
8 done &&
9
10 for i in 0 1 2 3 4 5 6 7 8 9;
@@ -18,7 +18,7 @@
19 do
20 for j in 0 1 2 3 4 5 6 7 8 9;
21 do
-22 echo "$i$j" >"path$i$j" ?!ERR missing '|| return 1'?!
+22 echo "$i$j" >"path$i$j" ?!LINT: missing '|| return 1'?!
23 done || return 1
24 done &&
25
@@ -6,6 +6,6 @@
7 # minor numbers of cows (or do they?)
8 baz &&
9 snaff
-10 ) ?!ERR missing '&&'?!
+10 ) ?!LINT: missing '&&'?!
11 fuzzy
12 )
@@ -7,7 +7,7 @@
8
9 cd foo &&
10 (
-11 echo a ?!ERR missing '&&'?!
+11 echo a ?!LINT: missing '&&'?!
12 echo b
13 ) >file
14 )
@@ -9,6 +9,6 @@
10 echo ourside &&
11 echo "=======" &&
12 echo theirside &&
-13 echo ">>>>>>> theirs" ?!ERR missing '&&'?!
+13 echo ">>>>>>> theirs" ?!LINT: missing '&&'?!
14 poodle
15 ) >merged
@@ -3,7 +3,7 @@
4 cd dir-rename-and-content &&
5 test_write_lines 1 2 3 4 5 >foo &&
6 mkdir olddir &&
-7 for i in a b c; do echo $i >olddir/$i; ?!ERR missing '|| exit 1'?! done ?!ERR missing '&&'?!
+7 for i in a b c; do echo $i >olddir/$i; ?!LINT: missing '|| exit 1'?! done ?!LINT: missing '&&'?!
8 git add foo olddir &&
9 git commit -m "original" &&
10 )
@@ -2,8 +2,8 @@
3 (foo && bar) |
4 (foo && bar) >baz &&
5
-6 (foo; ?!ERR missing '&&'?! bar) &&
-7 (foo; ?!ERR missing '&&'?! bar) |
-8 (foo; ?!ERR missing '&&'?! bar) >baz &&
+6 (foo; ?!LINT: missing '&&'?! bar) &&
+7 (foo; ?!LINT: missing '&&'?! bar) |
+8 (foo; ?!LINT: missing '&&'?! bar) >baz &&
9
10 (foo "bar; baz")
@@ -4,7 +4,7 @@
5 baz &&
6
7 fish |
-8 cow ?!ERR missing '&&'?!
+8 cow ?!LINT: missing '&&'?!
9
10 sunder
11 )
@@ -1,19 +1,19 @@
2 (
-3 cat foo ; ?!ERR missing '&&'?! echo bar ?!ERR missing '&&'?!
-4 cat foo ; ?!ERR missing '&&'?! echo bar
+3 cat foo ; ?!LINT: missing '&&'?! echo bar ?!LINT: missing '&&'?!
+4 cat foo ; ?!LINT: missing '&&'?! echo bar
5 ) &&
6 (
-7 cat foo ; ?!ERR missing '&&'?! echo bar &&
-8 cat foo ; ?!ERR missing '&&'?! echo bar
+7 cat foo ; ?!LINT: missing '&&'?! echo bar &&
+8 cat foo ; ?!LINT: missing '&&'?! echo bar
9 ) &&
10 (
11 echo "foo; bar" &&
-12 cat foo; ?!ERR missing '&&'?! echo bar
+12 cat foo; ?!LINT: missing '&&'?! echo bar
13 ) &&
14 (
15 foo;
16 ) &&
17 (cd foo &&
18 for i in a b c; do
-19 echo; ?!ERR missing '|| exit 1'?!
+19 echo; ?!LINT: missing '|| exit 1'?!
20 done)
@@ -6,7 +6,7 @@
7 nevermore...
8 EOF
9
-10 cat <<EOF >bip ?!ERR missing '&&'?!
+10 cat <<EOF >bip ?!LINT: missing '&&'?!
11 fish fly high
12 EOF
13
@@ -3,17 +3,17 @@
4 (foo && bar) |
5 (foo && bar) >baz &&
6
-7 (foo; ?!ERR missing '&&'?! bar) &&
-8 (foo; ?!ERR missing '&&'?! bar) |
-9 (foo; ?!ERR missing '&&'?! bar) >baz &&
+7 (foo; ?!LINT: missing '&&'?! bar) &&
+8 (foo; ?!LINT: missing '&&'?! bar) |
+9 (foo; ?!LINT: missing '&&'?! bar) >baz &&
10
11 (foo || exit 1) &&
12 (foo || exit 1) |
13 (foo || exit 1) >baz &&
14
-15 (foo && bar) ?!ERR missing '&&'?!
+15 (foo && bar) ?!LINT: missing '&&'?!
16
-17 (foo && bar; ?!ERR missing '&&'?! baz) ?!ERR missing '&&'?!
+17 (foo && bar; ?!LINT: missing '&&'?! baz) ?!LINT: missing '&&'?!
18
19 foobar
20 )
@@ -2,13 +2,13 @@
3 git config filter.rot13.clean ./rot13.sh &&
4
5 {
-6 echo "*.t filter=rot13" ?!ERR missing '&&'?!
+6 echo "*.t filter=rot13" ?!LINT: missing '&&'?!
7 echo "*.i ident"
8 } >.gitattributes &&
9
10 {
-11 echo a b c d e f g h i j k l m ?!ERR missing '&&'?!
-12 echo n o p q r s t u v w x y z ?!ERR missing '&&'?!
+11 echo a b c d e f g h i j k l m ?!LINT: missing '&&'?!
+12 echo n o p q r s t u v w x y z ?!LINT: missing '&&'?!
13 echo '$Id$'
14 } >test &&
15 cat test >test.t &&
@@ -19,7 +19,7 @@
20 git checkout -- test test.t test.i &&
21
22 echo "content-test2" >test2.o &&
-23 echo "content-test3 - filename with special characters" >"test3 'sq',$x=.o" ?!ERR missing '&&'?!
+23 echo "content-test3 - filename with special characters" >"test3 'sq',$x=.o" ?!LINT: missing '&&'?!
24
25 downstream_url_for_sed=$(
26 printf "%sn" "$downstream_url" |
@@ -1,4 +1,4 @@
2 command_which_is_run &&
-3 cat >expect <<-\EOF ?!ERR unclosed heredoc?! &&
+3 cat >expect <<-\EOF ?!LINT: unclosed heredoc?! &&
4 we forget to end the here-doc
5 command_which_is_gobbled
@@ -1,5 +1,5 @@
2 command_which_is_run &&
-3 cat >expect <<\EOF ?!ERR unclosed heredoc?! &&
+3 cat >expect <<\EOF ?!LINT: unclosed heredoc?! &&
4 we try to end the here-doc below,
5 but the indentation throws us off
6 since the operator is not "<<-".
@@ -1,14 +1,14 @@
2 (
3 while true
4 do
-5 echo foo ?!ERR missing '&&'?!
-6 cat <<-\EOF ?!ERR missing '|| exit 1'?!
+5 echo foo ?!LINT: missing '&&'?!
+6 cat <<-\EOF ?!LINT: missing '|| exit 1'?!
7 bar
8 EOF
-9 done ?!ERR missing '&&'?!
+9 done ?!LINT: missing '&&'?!
10
11 while true; do
12 echo foo &&
-13 cat bar ?!ERR missing '|| exit 1'?!
+13 cat bar ?!LINT: missing '|| exit 1'?!
14 done
15 )
@@ -1606,7 +1606,7 @@ if test "${GIT_TEST_CHAIN_LINT:-1}" != 0 &&
test "${GIT_TEST_EXT_CHAIN_LINT:-1}" != 0
then
"$PERL_PATH" "$TEST_DIRECTORY/chainlint.pl" "$0" ||
- BUG "lint error (see 'ERR' annotations above)"
+ BUG "lint error (see 'LINT' annotations above)"
fi
# Last-minute variable setup