chainlint.sed: don't mistake << word
in string as here-doc operator
Tighten here-doc recognition to prevent it from being fooled by text which looks like a here-doc operator but happens merely to be the content of a string, such as this real-world case from t7201: echo "<<<<<<< ours" && echo ourside && echo "=======" && echo theirside && echo ">>>>>>> theirs" This problem went unnoticed because chainlint.sed is not a real parser, but rather applies heuristics to pretend to understand shell code. In this case, it saw what it thought was a here-doc operator (`<< ours`), and fell off the end of the test looking for the closing tag "ours" which it never found, thus swallowed the remainder of the test without checking it for &&-chain breakage. Signed-off-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
2d53614210
commit
22597af97d
@ -89,6 +89,7 @@
|
||||
# here-doc -- swallow it to avoid false hits within its body (but keep the
|
||||
# command to which it was attached)
|
||||
/<<-*[ ]*[\\'"]*[A-Za-z0-9_]/ {
|
||||
/"[^"]*<<[^"]*"/bnotdoc
|
||||
s/^\(.*\)<<-*[ ]*[\\'"]*\([A-Za-z0-9_][A-Za-z0-9_]*\)['"]*/<\2>\1<</
|
||||
s/[ ]*<<//
|
||||
:hered
|
||||
@ -100,6 +101,7 @@
|
||||
s/^<[^>]*>//
|
||||
s/\n.*$//
|
||||
}
|
||||
:notdoc
|
||||
|
||||
# one-liner "(...) &&"
|
||||
/^[ ]*!*[ ]*(..*)[ ]*&&[ ]*$/boneline
|
||||
@ -151,8 +153,10 @@ s/.*\n//
|
||||
/"[^'"]*'[^'"]*"/!bsqstr
|
||||
}
|
||||
:folded
|
||||
# here-doc -- swallow it
|
||||
/<<-*[ ]*[\\'"]*[A-Za-z0-9_]/bheredoc
|
||||
# here-doc -- swallow it (but not "<<" in a string)
|
||||
/<<-*[ ]*[\\'"]*[A-Za-z0-9_]/{
|
||||
/"[^"]*<<[^"]*"/!bheredoc
|
||||
}
|
||||
# comment or empty line -- discard since final non-comment, non-empty line
|
||||
# before closing ")", "done", "elsif", "else", or "fi" will need to be
|
||||
# re-visited to drop "suspect" marking since final line of those constructs
|
||||
|
14
t/chainlint/not-heredoc.expect
Normal file
14
t/chainlint/not-heredoc.expect
Normal file
@ -0,0 +1,14 @@
|
||||
echo "<<<<<<< ours" &&
|
||||
echo ourside &&
|
||||
echo "=======" &&
|
||||
echo theirside &&
|
||||
echo ">>>>>>> theirs" &&
|
||||
|
||||
(
|
||||
echo "<<<<<<< ours" &&
|
||||
echo ourside &&
|
||||
echo "=======" &&
|
||||
echo theirside &&
|
||||
echo ">>>>>>> theirs" ?!AMP?!
|
||||
poodle
|
||||
) >merged
|
16
t/chainlint/not-heredoc.test
Normal file
16
t/chainlint/not-heredoc.test
Normal file
@ -0,0 +1,16 @@
|
||||
# LINT: "<< ours" inside string is not here-doc
|
||||
echo "<<<<<<< ours" &&
|
||||
echo ourside &&
|
||||
echo "=======" &&
|
||||
echo theirside &&
|
||||
echo ">>>>>>> theirs" &&
|
||||
|
||||
(
|
||||
# LINT: "<< ours" inside string is not here-doc
|
||||
echo "<<<<<<< ours" &&
|
||||
echo ourside &&
|
||||
echo "=======" &&
|
||||
echo theirside &&
|
||||
echo ">>>>>>> theirs"
|
||||
poodle
|
||||
) >merged
|
Loading…
Reference in New Issue
Block a user