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
|
# here-doc -- swallow it to avoid false hits within its body (but keep the
|
||||||
# command to which it was attached)
|
# command to which it was attached)
|
||||||
/<<-*[ ]*[\\'"]*[A-Za-z0-9_]/ {
|
/<<-*[ ]*[\\'"]*[A-Za-z0-9_]/ {
|
||||||
|
/"[^"]*<<[^"]*"/bnotdoc
|
||||||
s/^\(.*\)<<-*[ ]*[\\'"]*\([A-Za-z0-9_][A-Za-z0-9_]*\)['"]*/<\2>\1<</
|
s/^\(.*\)<<-*[ ]*[\\'"]*\([A-Za-z0-9_][A-Za-z0-9_]*\)['"]*/<\2>\1<</
|
||||||
s/[ ]*<<//
|
s/[ ]*<<//
|
||||||
:hered
|
:hered
|
||||||
@ -100,6 +101,7 @@
|
|||||||
s/^<[^>]*>//
|
s/^<[^>]*>//
|
||||||
s/\n.*$//
|
s/\n.*$//
|
||||||
}
|
}
|
||||||
|
:notdoc
|
||||||
|
|
||||||
# one-liner "(...) &&"
|
# one-liner "(...) &&"
|
||||||
/^[ ]*!*[ ]*(..*)[ ]*&&[ ]*$/boneline
|
/^[ ]*!*[ ]*(..*)[ ]*&&[ ]*$/boneline
|
||||||
@ -151,8 +153,10 @@ s/.*\n//
|
|||||||
/"[^'"]*'[^'"]*"/!bsqstr
|
/"[^'"]*'[^'"]*"/!bsqstr
|
||||||
}
|
}
|
||||||
:folded
|
:folded
|
||||||
# here-doc -- swallow it
|
# here-doc -- swallow it (but not "<<" in a string)
|
||||||
/<<-*[ ]*[\\'"]*[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
|
||||||
# before closing ")", "done", "elsif", "else", or "fi" will need to be
|
# before closing ")", "done", "elsif", "else", or "fi" will need to be
|
||||||
# re-visited to drop "suspect" marking since final line of those constructs
|
# 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