git-commit-vandalism/t/chainlint
Eric Sunshine d73f5cfa89 chainlint.sed: stop splitting "(..." into separate lines "(" and "..."
Because `sed` is line-oriented, for ease of implementation, when
chainlint.sed encounters an opening subshell in which the first command
is cuddled with the "(", it splits the line into two lines: one
containing only "(", and the other containing whatever follows "(".
This allows chainlint.sed to get by with a single set of regular
expressions for matching shell statements rather than having to
duplicate each expression (one set for matching non-cuddled statements,
and one set for matching cuddled statements).

However, although syntactically and semantically immaterial, this
transformation has no value to test authors and might even confuse them
into thinking that the linter is misbehaving by inserting (whitespace)
line-noise into the shell code it is validating. Moreover, it also
allows an implementation detail of chainlint.sed to seep into the
chainlint self-test "expect" files, which potentially makes it difficult
to reuse the self-tests should a more capable chainlint ever be
developed.

To address these concerns, stop splitting cuddled "(..." into two lines.

Note that, as an implementation artifact, due to sed's line-oriented
nature, this change inserts a blank line at output time just before the
"(..." line is emitted. It would be possible to suppress this blank line
but doing so would add a fair bit of complexity to chainlint.sed.
Therefore, rather than suppressing the extra blank line, the Makefile's
`check-chainlint` target which runs the chainlint self-tests is instead
modified to ignore blank lines when comparing chainlint output against
the self-test "expect" output. This is a reasonable compromise for two
reasons. First, the purpose of the chainlint self-tests is to verify
that the ?!AMP?! annotations are being correctly added; precise
whitespace is immaterial. Second, by necessity, chainlint.sed itself
already throws away all blank lines within subshells since, when
checking for a broken &&-chain, it needs to check the final _statement_
in a subshell, not the final _line_ (which might be blank), thus it has
never made any attempt to precisely reproduce blank lines in its output.

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-12-13 14:15:29 -08:00
..
arithmetic-expansion.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
arithmetic-expansion.test
bash-array.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
bash-array.test
blank-line.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
blank-line.test t/chainlint/*.test: generalize self-test commentary 2021-12-13 14:15:28 -08:00
block-comment.expect chainlint.sed: swallow comments consistently 2021-12-13 14:15:29 -08:00
block-comment.test chainlint.sed: swallow comments consistently 2021-12-13 14:15:29 -08:00
block.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
block.test t/chainlint/*.test: generalize self-test commentary 2021-12-13 14:15:28 -08:00
broken-chain.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
broken-chain.test
case-comment.expect chainlint.sed: swallow comments consistently 2021-12-13 14:15:29 -08:00
case-comment.test chainlint.sed: swallow comments consistently 2021-12-13 14:15:29 -08:00
case.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
case.test
close-nested-and-parent-together.expect chainlint.sed: stop splitting "(..." into separate lines "(" and "..." 2021-12-13 14:15:29 -08:00
close-nested-and-parent-together.test
close-subshell.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
close-subshell.test
command-substitution.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
command-substitution.test
comment.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
comment.test t/chainlint: add chainlint "whitespace" test cases 2018-07-17 09:15:14 -07:00
complex-if-in-cuddled-loop.expect chainlint.sed: stop splitting "(..." into separate lines "(" and "..." 2021-12-13 14:15:29 -08:00
complex-if-in-cuddled-loop.test
cuddled-if-then-else.expect chainlint.sed: stop splitting "(..." into separate lines "(" and "..." 2021-12-13 14:15:29 -08:00
cuddled-if-then-else.test
cuddled-loop.expect chainlint.sed: stop splitting "(..." into separate lines "(" and "..." 2021-12-13 14:15:29 -08:00
cuddled-loop.test
cuddled.expect chainlint.sed: stop splitting "(..." into separate lines "(" and "..." 2021-12-13 14:15:29 -08:00
cuddled.test t/chainlint/*.test: generalize self-test commentary 2021-12-13 14:15:28 -08:00
exit-loop.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
exit-loop.test
exit-subshell.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
exit-subshell.test t/chainlint: add chainlint "basic" test cases 2018-07-17 09:15:14 -07:00
for-loop.expect chainlint.sed: stop throwing away here-doc tags 2021-12-13 14:15:29 -08:00
for-loop.test t/chainlint/*.test: fix invalid test cases due to mixing quote types 2021-12-13 14:15:28 -08:00
here-doc-close-subshell.expect chainlint.sed: stop throwing away here-doc tags 2021-12-13 14:15:29 -08:00
here-doc-close-subshell.test
here-doc-multi-line-command-subst.expect chainlint.sed: stop throwing away here-doc tags 2021-12-13 14:15:29 -08:00
here-doc-multi-line-command-subst.test
here-doc-multi-line-string.expect chainlint.sed: stop throwing away here-doc tags 2021-12-13 14:15:29 -08:00
here-doc-multi-line-string.test
here-doc.expect chainlint.sed: stop throwing away here-doc tags 2021-12-13 14:15:29 -08:00
here-doc.test
if-in-loop.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
if-in-loop.test
if-then-else.expect chainlint.sed: stop throwing away here-doc tags 2021-12-13 14:15:29 -08:00
if-then-else.test
incomplete-line.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
incomplete-line.test
inline-comment.expect chainlint.sed: stop splitting "(..." into separate lines "(" and "..." 2021-12-13 14:15:29 -08:00
inline-comment.test
loop-in-if.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
loop-in-if.test
multi-line-nested-command-substitution.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
multi-line-nested-command-substitution.test
multi-line-string.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
multi-line-string.test
negated-one-liner.expect chainlint.sed: drop unnecessary distinction between ?!AMP?! and ?!SEMI?! 2021-12-13 14:15:29 -08:00
negated-one-liner.test
nested-cuddled-subshell.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
nested-cuddled-subshell.test
nested-here-doc.expect chainlint.sed: stop throwing away here-doc tags 2021-12-13 14:15:29 -08:00
nested-here-doc.test
nested-subshell-comment.expect chainlint.sed: swallow comments consistently 2021-12-13 14:15:29 -08:00
nested-subshell-comment.test
nested-subshell.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
nested-subshell.test t/chainlint/*.test: generalize self-test commentary 2021-12-13 14:15:28 -08:00
not-heredoc.expect chainlint.sed: don't mistake << word in string as here-doc operator 2021-12-13 14:15:29 -08:00
not-heredoc.test chainlint.sed: don't mistake << word in string as here-doc operator 2021-12-13 14:15:29 -08:00
one-liner.expect chainlint.sed: drop unnecessary distinction between ?!AMP?! and ?!SEMI?! 2021-12-13 14:15:29 -08:00
one-liner.test t/chainlint/one-liner: avoid overly intimate chainlint.sed knowledge 2021-12-13 14:15:28 -08:00
p4-filespec.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
p4-filespec.test
pipe.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
pipe.test
semicolon.expect chainlint.sed: stop splitting "(..." into separate lines "(" and "..." 2021-12-13 14:15:29 -08:00
semicolon.test t/chainlint/*.test: generalize self-test commentary 2021-12-13 14:15:28 -08:00
subshell-here-doc.expect chainlint.sed: stop throwing away here-doc tags 2021-12-13 14:15:29 -08:00
subshell-here-doc.test
subshell-one-liner.expect chainlint.sed: drop subshell-closing ">" annotation 2021-12-13 14:15:29 -08:00
subshell-one-liner.test
t7900-subtree.expect chainlint.sed: stop throwing away here-doc tags 2021-12-13 14:15:29 -08:00
t7900-subtree.test
while-loop.expect chainlint.sed: stop throwing away here-doc tags 2021-12-13 14:15:29 -08:00
while-loop.test