tests: diagnose unclosed here-doc in chainlint.pl
commit2b61c8dc8843319d09f1485fbcb3b1dc4aecb36d
authorEric Sunshine <sunshine@sunshineco.com>
Thu, 30 Mar 2023 19:30:31 +0000 (30 15:30 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 30 Mar 2023 20:07:29 +0000 (30 13:07 -0700)
tree4d820f6aa8728014591b8c0125f2d2b0c1234730
parent1686de55facd0225739290e6afb51e3600351883
tests: diagnose unclosed here-doc in chainlint.pl

An unclosed here-doc in a test is a problem, because it silently gobbles
up any remaining commands. Since 99a64e4b73c (tests: lint for run-away
here-doc, 2017-03-22) we detect this by piggy-backing on the internal
chainlint checker in test-lib.sh.

However, it would be nice to detect it in chainlint.pl, for a few
reasons:

  - the output from chainlint.pl is much nicer; it can show the exact
    spot of the error, rather than a vague "somewhere in this test you
    broke the &&-chain or had a bad here-doc" message.

  - the implementation in test-lib.sh runs for each test snippet. And
    since it requires a subshell, the extra cost is small but not zero.
    If chainlint.pl can reliably find the problem, we can optimize the
    test-lib.sh code.

The chainlint.pl code never intended to find here-doc problems. But
since it has to parse them anyway (to avoid reporting problems inside
here-docs), most of what we need is already there. We can detect the
problem when we fail to find the missing end-tag in swallow_heredocs().
The extra change in scan_heredoc_tag() stores the location of the start
of the here-doc, which lets us mark it as the source of the error in the
output (see the new tests for examples).

[jk: added commit message and tests]

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/chainlint.pl
t/chainlint/unclosed-here-doc-indent.expect [new file with mode: 0644]
t/chainlint/unclosed-here-doc-indent.test [new file with mode: 0644]
t/chainlint/unclosed-here-doc.expect [new file with mode: 0644]
t/chainlint/unclosed-here-doc.test [new file with mode: 0644]