Eric Sunshine <sunsh...@sunshineco.com> writes:

> A here-doc tag can be quoted ('EOF') or escaped (\EOF) to suppress
> interpolation within the body. Although, chainlint recognizes escaped
> tags, it does not know about quoted tags. For completeness, teach it to
> recognize quoted tags, as well.

Is this step merely completeness and future-proofing, or do we have
existing instances that the linter would be confused without this
patch?  I am primarily wondering what the reason is that <<"EOF" is
not looked for while we are at it (the answer could be that we
have tests that use <<'EOF' but not <<"EOF").

> Signed-off-by: Eric Sunshine <sunsh...@sunshineco.com>
> ---
>  t/chainlint.sed                      | 8 ++++----
>  t/chainlint/here-doc.expect          | 2 ++
>  t/chainlint/here-doc.test            | 7 +++++++
>  t/chainlint/subshell-here-doc.expect | 1 +
>  t/chainlint/subshell-here-doc.test   | 4 ++++
>  5 files changed, 18 insertions(+), 4 deletions(-)
>
> diff --git a/t/chainlint.sed b/t/chainlint.sed
> index 2af1a687f8..2901494e8a 100644
> --- a/t/chainlint.sed
> +++ b/t/chainlint.sed
> @@ -94,8 +94,8 @@
>  
>  # here-doc -- swallow it to avoid false hits within its body (but keep the
>  # command to which it was attached)
> -/<<[         ]*[-\\]*[A-Za-z0-9_]/ {
> -     s/^\(.*\)<<[    ]*[-\\]*\([A-Za-z0-9_][A-Za-z0-9_]*\)/<\2>\1<</
> +/<<[         ]*[-\\']*[A-Za-z0-9_]/ {
> +     s/^\(.*\)<<[    ]*[-\\']*\([A-Za-z0-9_][A-Za-z0-9_]*\)'*/<\2>\1<</
>       s/[     ]*<<//
>       :hereslurp
>       N
> @@ -158,7 +158,7 @@ s/.*\n//
>       /"[^'"]*'[^'"]*"/!bsqstring
>  }
>  # here-doc -- swallow it
> -/<<[         ]*[-\\]*[A-Za-z0-9_]/bheredoc
> +/<<[         ]*[-\\']*[A-Za-z0-9_]/bheredoc
>  # comment or empty line -- discard since final non-comment, non-empty line
>  # before closing ")", "done", "elsif", "else", or "fi" will need to be
>  # re-visited to drop "suspect" marking since final line of those constructs
> @@ -268,7 +268,7 @@ bcheckchain
>  # found here-doc -- swallow it to avoid false hits within its body (but keep
>  # the command to which it was attached)
>  :heredoc
> -s/^\(.*\)<<[         ]*[-\\]*\([A-Za-z0-9_][A-Za-z0-9_]*\)/<\2>\1<</
> +s/^\(.*\)<<[         ]*[-\\']*\([A-Za-z0-9_][A-Za-z0-9_]*\)'*/<\2>\1<</
>  s/[  ]*<<//
>  :hereslurpsub
>  N
> diff --git a/t/chainlint/here-doc.expect b/t/chainlint/here-doc.expect
> index 33bc3cc0b4..aff6568716 100644
> --- a/t/chainlint/here-doc.expect
> +++ b/t/chainlint/here-doc.expect
> @@ -2,4 +2,6 @@ boodle wobba        gorgo snoot        wafta snurb &&
>  
>  cat >foo &&
>  
> +cat >bar &&
> +
>  horticulture
> diff --git a/t/chainlint/here-doc.test b/t/chainlint/here-doc.test
> index 8986eefe74..f2bb14b693 100644
> --- a/t/chainlint/here-doc.test
> +++ b/t/chainlint/here-doc.test
> @@ -14,6 +14,13 @@ boz
>  woz
>  Arbitrary_Tag_42
>  
> +# LINT: swallow 'quoted' here-doc
> +cat <<'FUMP' >bar &&
> +snoz
> +boz
> +woz
> +FUMP
> +
>  # LINT: swallow here-doc (EOF is last line of test)
>  horticulture <<\EOF
>  gomez
> diff --git a/t/chainlint/subshell-here-doc.expect 
> b/t/chainlint/subshell-here-doc.expect
> index 7c2da63bc7..7663ea7fc4 100644
> --- a/t/chainlint/subshell-here-doc.expect
> +++ b/t/chainlint/subshell-here-doc.expect
> @@ -5,5 +5,6 @@
>  >) &&
>  (
>       cat >bup &&
> +     cat >bup2 &&
>       meep
>  >)
> diff --git a/t/chainlint/subshell-here-doc.test 
> b/t/chainlint/subshell-here-doc.test
> index 05139af0b5..b6b5a9b33a 100644
> --- a/t/chainlint/subshell-here-doc.test
> +++ b/t/chainlint/subshell-here-doc.test
> @@ -27,5 +27,9 @@
>       glink
>       FIZZ
>       ARBITRARY
> +     cat <<-'ARBITRARY2' >bup2 &&
> +     glink
> +     FIZZ
> +     ARBITRARY2
>       meep
>  )

Reply via email to