Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: heredocs in lines with escaped newlines #87

Merged

Conversation

m-ildefons
Copy link
Contributor

Fix parsing error with heredocs within command chains with escaped newlines.

When chaining commands in a RUN instructions, it is possible that one of the middle commands takes a heredoc. It is often convenient to also break up the resulting long line with escapes, e.g.:

RUN foo \
 && bar <<EOF >> bar.txt \
 && baz
inside heredoc
content
EOF

The heredoc parser should not fail on escaped newlines in this command chain.
This requires two modifications:

  • Parsing the rest of the command chain, after a heredoc should not end on the literal '\n' character, but should be done with the untilEol parser, which respects the escaped newlins
  • Parsing the command chain before the heredoc requires casting escaped newlines to spaces as to not fail the parser on a '\n' character

This approach works with the caveat that the command chain after the heredoc is ignored and will not end up in the parsed text.

fixes: hadolint/hadolint#923
Signed-off-by: Moritz Röhrich moritz@ildefons.de

Fix parsing error with heredocs within command chains with escaped
newlines.

When chaining commands in a `RUN` instructions, it is possible that one
of the middle commands takes a heredoc. It is often convenient to also
break up the resulting long line with escapes, e.g.:

```Dockerfile
RUN foo \
 && bar <<EOF >> bar.txt \
 && baz
inside heredoc
content
EOF
```

The heredoc parser should not fail on escaped newlines in this command
chain.
This requires two modifications:

  - Parsing the rest of the command chain, after a heredoc should not
    end on the literal '\n' character, but should be done with the
    `untilEol` parser, which respects the escaped newlins
  - Parsing the command chain before the heredoc requires casting
    escaped newlines to spaces as to not fail the parser on a '\n'
    character

This approach works with the caveat that the command chain after the
heredoc is ignored and will not end up in the parsed text.

fixes: hadolint/hadolint#923
Signed-off-by: Moritz Röhrich <moritz@ildefons.de>
@lorenzo
Copy link
Member

lorenzo commented Jan 30, 2023

great job!

@lorenzo lorenzo merged commit 34e9ddf into hadolint:master Jan 30, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

heredoc unexpected is not a supported rule
2 participants