Control: severity -1 important
Control: tags -1 + confirmed

Hi, Anthony,

thanks for the report!

On 17 Jul 2020, Anthony Fok wrote:

>I ran into the following error while packaging the latest version of
>hugo package:
>
>    dh_bash-completion: error: Cannot resolve variable 
> "${BASH_COMP_DEBUG_FILE}" in debian/hugo.bash-completion (line 5)
>
>where debian/hugo.bash-completion is a proper completion snippet.

How to reproduce (note to myself):

  On a system with debhelper >= 13:
  $ git clone https://salsa.debian.org/go-team/packages/hugo.git
  $ cd hugo
  # apt install hugo
  $ hugo gen autocomplete --completionfile=debian/hugo.bash-completion
  $ dh_bash-completion 
  dh_bash-completion: error: Cannot resolve variable "${BASH_COMP_DEBUG_FILE}" 
in debian/hugo.bash-completion (line 5)

>It turns out that the error was triggered when I bumped
>"debhelper-compat (= 12)" to "debhelper-compat (= 13)" in debian/control.
>
>This is a behavioural change in debhelper v13.  From debhelper(7):
>
>  - Many dh_* tools now support limited variable expansion via
>    the ${foo} syntax.  In many cases, this can be used to
>    reference paths that contain either spaces or
>    dpkg-architecture(1) values.  While this can reduce the
>    need for dh-exec(1) in some cases, it is not a replacement
>    dh-exec(1) in general.  If you need filtering, renaming,
>    etc., the package will still need dh-exec(1).
>
>    Please see "Substitutions in debhelper config files" for
>    syntax and available substitution variables.  To dh_* tool
>    writers, substitution expansion occurs as a part of the
>    filearray and filedoublearray functions.
>
>dh_bash-completion currently uses filedoublearray() to detect if
>debian/package.bash-completion is a list of files or not.
>While it has worked well in the past, it has now become a lot more
>flakey and error-prone as debhelper v13+ now always attempt
>such variable substitution.

Thanks for the analysis. :)

>While one could try to work around the issue by changing
>"${foo}" to "$foo" in the proper completion snippet,
>quoting variables with curly braces like ${foo} is nonetheless
>perfectly valid bash syntax, and it is often unavoidable
>in cases such as "${foo}bar" or "${foo}_bar".

I agree, it would be terrible to forbid scripts from using it. 

>Perhaps there are better ways to distinguish whether
>debian/package.bash-completion is a file list or proper snippet
>than sending it to filedoublearray() and see if it fails or not?

I really suck at perl programming, but, as far as I can tell, that's
not the only reason to call filedoublearray(). dh_bash-completion uses
the *output* of filedoublearray(), not its return code, to detect
whether the file is a proper snippet. However, since debhelper 13,
filedoublearray() fails during variable expansion (if we track the
failure down, it happens in _variable_substitution()), so
dh_bash-completion doesn't actually get a chance to check if the file
is a proper snippet or a list of files.

I'll try and find a solution for this, but I might need help from perl
experts. :)

Cheers,
Gabriel

Reply via email to