diff --git a/src/Language/Docker/Parser/Prelude.hs b/src/Language/Docker/Parser/Prelude.hs index 1ca7bf9..3334173 100644 --- a/src/Language/Docker/Parser/Prelude.hs +++ b/src/Language/Docker/Parser/Prelude.hs @@ -202,8 +202,11 @@ heredocContent marker = do termination :: Parser Text termination = try terEOL <|> terEOF + -- The line break that follows the terminating marker is not part of the + -- heredoc: it is the line break that separates this instruction from + -- whatever comes next, so it is left for the caller to consume. terEOL :: Parser Text - terEOL = string $ "\n" <> marker <> "\n" + terEOL = string ("\n" <> marker) <* lookAhead (char '\n') terEOF :: Parser Text terEOF = do @@ -215,7 +218,7 @@ heredocContent marker = do delimiter = try delEOL <|> delEOF delEOL :: Parser Text - delEOL = string $ marker <> "\n" + delEOL = string marker <* lookAhead (char '\n') delEOF :: Parser Text delEOF = do diff --git a/test/Language/Docker/ParseCopySpec.hs b/test/Language/Docker/ParseCopySpec.hs index 25aeb49..dd6c3a1 100644 --- a/test/Language/Docker/ParseCopySpec.hs +++ b/test/Language/Docker/ParseCopySpec.hs @@ -314,3 +314,23 @@ spec = do ( CopyArgs [ SourcePath "FOO" ] ( TargetPath "/target" ) ) def ] + it "heredoc followed by another instruction" $ + let file = Text.unlines ["COPY <