From: Junio C Hamano Date: Tue, 4 Sep 2018 21:31:40 +0000 (-0700) Subject: Merge branch 'es/chain-lint-more' X-Git-Tag: v2.19.0-rc2~1 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/e9983f8965c0875cc6727e9644c84ff1dfc99372?ds=inline;hp=-c Merge branch 'es/chain-lint-more' The test linter code has learned that the end of here-doc mark "EOF" can be quoted in a double-quote pair, not just in a single-quote pair. * es/chain-lint-more: chainlint: match "quoted" here-doc tags --- e9983f8965c0875cc6727e9644c84ff1dfc99372 diff --combined t/chainlint.sed index c80d2fad7a,1da58b554b..70df40e34b --- a/t/chainlint.sed +++ b/t/chainlint.sed @@@ -94,14 -94,14 +94,14 @@@ # here-doc -- swallow it to avoid false hits within its body (but keep the # command to which it was attached) - /<<[ ]*[-\\']*[A-Za-z0-9_]/ { - s/^\(.*\)<<[ ]*[-\\']*\([A-Za-z0-9_][A-Za-z0-9_]*\)'*/<\2>\1<\1<]*\)>.*\n[ ]*\1[ ]*$/!{ s/\n.*$// - bhereslurp + bhered } s/^<[^>]*>// s/\n.*$// @@@ -131,8 -131,9 +131,8 @@@ b :subshell -# bare "(" line? +# bare "(" line? -- stash for later printing /^[ ]*([ ]*$/ { - # stash for later printing h bnextline } @@@ -149,7 -150,7 +149,7 @@@ s/.*\n/ :slurp # incomplete line "...\" -/\\$/bincomplete +/\\$/bicmplte # multi-line quoted string "...\n..."? /"/bdqstring # multi-line quoted string '...\n...'? (but not contraction in string "it's") @@@ -158,7 -159,7 +158,7 @@@ } :folded # 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 # before closing ")", "done", "elsif", "else", or "fi" will need to be # re-visited to drop "suspect" marking since final line of those constructs @@@ -171,7 -172,7 +171,7 @@@ /"[^"]*#[^"]*"/!s/[ ]#.*$// } # one-liner "case ... esac" -/^[ ]*case[ ]*..*esac/bcheckchain +/^[ ]*case[ ]*..*esac/bchkchn # multi-line "case ... esac" /^[ ]*case[ ]..*[ ]in/bcase # multi-line "for ... done" or "while ... done" @@@ -200,32 -201,32 +200,32 @@@ /^[ ]*fi[ ]*[<>|]/bdone /^[ ]*fi[ ]*)/bdone # nested one-liner "(...) &&" -/^[ ]*(.*)[ ]*&&[ ]*$/bcheckchain +/^[ ]*(.*)[ ]*&&[ ]*$/bchkchn # nested one-liner "(...)" -/^[ ]*(.*)[ ]*$/bcheckchain +/^[ ]*(.*)[ ]*$/bchkchn # nested one-liner "(...) >x" (or "2>x" or "|]/bcheckchain +/^[ ]*(.*)[ ]*[0-9]*[<>|]/bchkchn # nested multi-line "(...\n...)" /^[ ]*(/bnest # multi-line "{...\n...}" /^[ ]*{/bblock # closing ")" on own line -- exit subshell -/^[ ]*)/bclosesolo +/^[ ]*)/bclssolo # "$((...))" -- arithmetic expansion; not closing ")" -/\$(([^)][^)]*))[^)]*$/bcheckchain +/\$(([^)][^)]*))[^)]*$/bchkchn # "$(...)" -- command substitution; not closing ")" -/\$([^)][^)]*)[^)]*$/bcheckchain +/\$([^)][^)]*)[^)]*$/bchkchn # multi-line "$(...\n...)" -- command substitution; treat as nested subshell /\$([^)]*$/bnest # "=(...)" -- Bash array assignment; not closing ")" -/=(/bcheckchain +/=(/bchkchn # closing "...) &&" /)[ ]*&&[ ]*$/bclose # closing "...)" /)[ ]*$/bclose # closing "...) >x" (or "2>x" or "|]/bclose -:checkchain +:chkchn # mark suspect if line uses ";" internally rather than "&&" (but not ";" in a # string and not ";;" in one-liner "case...esac") /;/{ @@@ -244,7 -245,7 +244,7 @@@ bslurp # found incomplete line "...\" -- slurp up next line -:incomplete +:icmplte N s/\\\n// bslurp @@@ -280,13 -281,13 +280,13 @@@ bfolde # found here-doc -- swallow it to avoid false hits within its body (but keep # the command to which it was attached) :heredoc - s/^\(.*\)<<[ ]*[-\\']*\([A-Za-z0-9_][A-Za-z0-9_]*\)'*/<\2>\1<\1<]*\)>.*\n[ ]*\1[ ]*$/!{ s/\n.*$// - bhereslurpsub + bheredsub } s/^<[^>]*>// s/\n.*$// @@@ -316,43 -317,43 +316,43 @@@ # is 'done' or 'fi' cuddled with ")" to close subshell? /done.*)/bclose /fi.*)/bclose -bcheckchain +bchkchn # found nested multi-line "(...\n...)" -- pass through untouched :nest x -:nestslurp +:nstslurp n # closing ")" on own line -- stop nested slurp -/^[ ]*)/bnestclose +/^[ ]*)/bnstclose # comment -- not closing ")" if in comment -/^[ ]*#/bnestcontinue +/^[ ]*#/bnstcnt # "$((...))" -- arithmetic expansion; not closing ")" -/\$(([^)][^)]*))[^)]*$/bnestcontinue +/\$(([^)][^)]*))[^)]*$/bnstcnt # "$(...)" -- command substitution; not closing ")" -/\$([^)][^)]*)[^)]*$/bnestcontinue +/\$([^)][^)]*)[^)]*$/bnstcnt # closing "...)" -- stop nested slurp -/)/bnestclose -:nestcontinue +/)/bnstclose +:nstcnt x -bnestslurp -:nestclose +bnstslurp +:nstclose s/^/>>/ # is it "))" which closes nested and parent subshells? /)[ ]*)/bslurp -bcheckchain +bchkchn # found multi-line "{...\n...}" block -- pass through untouched :block x n # closing "}" -- stop block slurp -/}/bcheckchain +/}/bchkchn bblock # found closing ")" on own line -- drop "suspect" from final line of subshell # since that line legitimately lacks "&&" and exit subshell loop -:closesolo +:clssolo x s/?!AMP?!// p