On Tue, Mar 28, 2023 at 10:37:02PM -0400, Jeff King wrote: > I just think chainlint.pl is doing a good enough job of catching it that > we can rely on it. I'll be curious if Eric has input there on whether it > can do even better, which would remove all of the caveats from the > commit message. So I _think_ it's something like this: diff --git a/t/chainlint.pl b/t/chainlint.pl index e966412999a..6b8c1de5208 100755 --- a/t/chainlint.pl +++ b/t/chainlint.pl @@ -171,6 +171,9 @@ sub swallow_heredocs { my $start = pos($$b); my $indent = $tag =~ s/^\t// ? '\\s*' : ''; $$b =~ /(?:\G|\n)$indent\Q$tag\E(?:\n|\z)/gc; + if (pos($$b) == $start) { + die "oops, we did not find the end of the heredoc"; + } my $body = substr($$b, $start, pos($$b) - $start); $self->{lineno} += () = $body =~ /\n/sg; } But I wasn't sure how to surface a clean error from here, since we're in the Lexer. Maybe we just accumulate a "problems" array here, and then roll those up via the TestParser? I'm not very familiar with the arrangement of that part of the script. And I say "think" because the thing I was worried about is that we'd do this lexing at too high a level, and accidentally walk past the end of the test. Which would mean getting fooled by; test_expect_success 'this one is broken' ' cat >foo <<\EOF oops, we are missing our here-doc end ' test_expect_success 'this one is ok' ' cat >foo <<\EOF this one is OK, but we would not want to confuse its closing tag for the missing one EOF ' But it looks like Lexer::swallow_heredocs gets to see the individual test snippets. -Peff