chainlint: let here-doc and multi-line string commence on same line
After swallowing a here-doc, chainlint.sed assumes that no other processing needs to be done on the line aside from checking for &&-chain breakage; likewise, after folding a multi-line quoted string. However, it's conceivable (even if unlikely in practice) that both a here-doc and a multi-line quoted string might commence on the same line: cat <<\EOF && echo "foo bar" data EOF Support this case by sending the line (after swallowing and folding) through the normal processing sequence rather than jumping directly to the check for broken &&-chain. This change also allows other somewhat pathological cases to be handled, such as closing a subshell on the same line starting a here-doc: ( cat <<-\INPUT) data INPUT or, for instance, opening a multi-line $(...) expression on the same line starting a here-doc: x=$(cat <<-\END && data END echo "x") among others. Signed-off-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
06fc5c9f90
commit
d93871143f
@ -157,6 +157,7 @@ s/.*\n//
|
|||||||
/^[^']*'[^']*$/{
|
/^[^']*'[^']*$/{
|
||||||
/"[^'"]*'[^'"]*"/!bsqstring
|
/"[^'"]*'[^'"]*"/!bsqstring
|
||||||
}
|
}
|
||||||
|
:folded
|
||||||
# here-doc -- swallow it
|
# here-doc -- swallow it
|
||||||
/<<[ ]*[-\\']*[A-Za-z0-9_]/bheredoc
|
/<<[ ]*[-\\']*[A-Za-z0-9_]/bheredoc
|
||||||
# comment or empty line -- discard since final non-comment, non-empty line
|
# comment or empty line -- discard since final non-comment, non-empty line
|
||||||
@ -255,7 +256,7 @@ s/"//g
|
|||||||
N
|
N
|
||||||
s/\n//
|
s/\n//
|
||||||
/"/!bdqstring
|
/"/!bdqstring
|
||||||
bcheckchain
|
bfolded
|
||||||
|
|
||||||
# found multi-line single-quoted string '...\n...' -- slurp until end of string
|
# found multi-line single-quoted string '...\n...' -- slurp until end of string
|
||||||
:sqstring
|
:sqstring
|
||||||
@ -263,7 +264,7 @@ s/'//g
|
|||||||
N
|
N
|
||||||
s/\n//
|
s/\n//
|
||||||
/'/!bsqstring
|
/'/!bsqstring
|
||||||
bcheckchain
|
bfolded
|
||||||
|
|
||||||
# found here-doc -- swallow it to avoid false hits within its body (but keep
|
# found here-doc -- swallow it to avoid false hits within its body (but keep
|
||||||
# the command to which it was attached)
|
# the command to which it was attached)
|
||||||
@ -278,7 +279,7 @@ N
|
|||||||
}
|
}
|
||||||
s/^<[^>]*>//
|
s/^<[^>]*>//
|
||||||
s/\n.*$//
|
s/\n.*$//
|
||||||
bcheckchain
|
bfolded
|
||||||
|
|
||||||
# found "case ... in" -- pass through untouched
|
# found "case ... in" -- pass through untouched
|
||||||
:case
|
:case
|
||||||
|
2
t/chainlint/here-doc-close-subshell.expect
Normal file
2
t/chainlint/here-doc-close-subshell.expect
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
(
|
||||||
|
> cat)
|
5
t/chainlint/here-doc-close-subshell.test
Normal file
5
t/chainlint/here-doc-close-subshell.test
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
(
|
||||||
|
# LINT: line contains here-doc and closes nested subshell
|
||||||
|
cat <<-\INPUT)
|
||||||
|
fizz
|
||||||
|
INPUT
|
5
t/chainlint/here-doc-multi-line-command-subst.expect
Normal file
5
t/chainlint/here-doc-multi-line-command-subst.expect
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
(
|
||||||
|
x=$(bobble &&
|
||||||
|
?!AMP?!>> wiffle)
|
||||||
|
echo $x
|
||||||
|
>)
|
9
t/chainlint/here-doc-multi-line-command-subst.test
Normal file
9
t/chainlint/here-doc-multi-line-command-subst.test
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
(
|
||||||
|
# LINT: line contains here-doc and opens multi-line $(...)
|
||||||
|
x=$(bobble <<-\END &&
|
||||||
|
fossil
|
||||||
|
vegetable
|
||||||
|
END
|
||||||
|
wiffle)
|
||||||
|
echo $x
|
||||||
|
)
|
4
t/chainlint/here-doc-multi-line-string.expect
Normal file
4
t/chainlint/here-doc-multi-line-string.expect
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
(
|
||||||
|
?!AMP?! cat && echo multi-line string"
|
||||||
|
bap
|
||||||
|
>)
|
8
t/chainlint/here-doc-multi-line-string.test
Normal file
8
t/chainlint/here-doc-multi-line-string.test
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
(
|
||||||
|
# LINT: line contains here-doc and opens multi-line string
|
||||||
|
cat <<-\TXT && echo "multi-line
|
||||||
|
string"
|
||||||
|
fizzle
|
||||||
|
TXT
|
||||||
|
bap
|
||||||
|
)
|
Reference in New Issue
Block a user