bash-completion icon indicating copy to clipboard operation
bash-completion copied to clipboard

scp remote path completion no longer working since 2.12

Open upekkha opened this issue 1 year ago • 4 comments

Describe the bug

The completion of remote paths with scp is no longer working for me since 2.12.

To reproduce

scp example.com:/et<tab>

Expected behavior

Should complete the remote path to /etc (for instance)

Versions (please complete the following information)

  • [X] Operating system name/distribution and version: macOS with homebrew
  • [X] bash version, echo "$BASH_VERSION": 5.2.26(1)-release
  • [X] bash-completion version, (IFS=.; echo "${BASH_COMPLETION_VERSINFO[*]}"): 2.13.0

Additional context

First hit by the bug on macOS with homebrew, it seems to be also reproducible in Debian 12 with the current 2.13 tarball.

Starting from a bash without config files and env vars, I source the bash completion, and try completing an scp command.

env -i $(which bash) --norc --noprofile
. bash_completion
set -x
scp example.com:/et<tab>

Debug trace

Showing the last lines with inline comments added.

[...]
+ _comp_xfunc_scp_compgen_remote_files     # <----- calling the new function from 2.12
+ cur=example.com:/et
+ local _userhost=example.com
+ local _path=/et
++ command sed -e 's/\\\\\\\([][(){}<>"'\'',:;^&!$=?`\\|[:space:]]\)/\\\1/g'
+ _path=/et
+ [[ ! -n /et ]]
+ local _files
+ [[ '' == -d ]]
++ ssh -o 'Batchmode yes' example.com command ls -aF1dL '/et*'
++ command sed -e 's/[][(){}<>"'\'',:;^&!$=?`\\|[:space:]]/\\\\\\&/g' -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g'
+ _files=/etc/                      # <----- ssh command was working and returned the correct /etc
+ _comp_compgen_split -l -- /etc/
+ local '_ifs=
'
+ _compgen_options=()
+ local -a _compgen_options
+ local OPTIND=1 OPTARG= OPTERR=0 _opt
+ getopts :lF:X:S:P:o: _opt -l -- /etc/
+ case $_opt in
+ _ifs='
'
+ getopts :lF:X:S:P:o: _opt -l -- /etc/
+ shift 2
+ (( 1 != 1 ))
+ local input=/etc/ 'IFS=
'
+ _comp_compgen -F '
' -U input -- -W '$input'
+ local _append=
+ local _var=
+ local _cur=example.com:/et
+ local _dir=
+ local '_ifs=
' _has_ifs=
+ local _icmd= _xcmd=
+ _upvars=()
+ local -a _upvars
+ local _old_nocasematch=
+ shopt -q nocasematch
+ local OPTIND=1 OPTARG= OPTERR=0 _opt
+ getopts :av:U:Rc:C:lF:i:x: _opt -F '
' -U input -- -W '$input'
+ case $_opt in
+ _has_ifs=set
+ _ifs='
'
+ getopts :av:U:Rc:C:lF:i:x: _opt -F '
' -U input -- -W '$input'
+ case $_opt in
+ [[ input == @(*[^_a-zA-Z0-9]*|[0-9]*|) ]]
+ [[ input == @(_*|IFS|OPTIND|OPTARG|OPTERR|cur) ]]
+ _upvars+=("$OPTARG")
+ getopts :av:U:Rc:C:lF:i:x: _opt -F '
' -U input -- -W '$input'
+ [[ -n '' ]]
+ shift 5
+ (( 2 == 0 ))
+ [[ ! -n '' ]]
+ _var=COMPREPLY
+ [[ -n '' ]]
+ _append=
+ [[ -W != -* ]]
+ [[ -n '' ]]
+ [[ -n '' ]]
+ local 'IFS=
'
+ [[ -W $input == *\$[0-9]* ]]
+ [[ -W $input == *\$\{[0-9]* ]]
+ local _result
++ [[ -n '' ]]
++ IFS='
'
++ compgen -W '$input' -- example.com:/et
+ _result=
+ _comp_compgen__error_fallback
+ local _status=1
+ [[ -n '' ]]
+ eval -- 'COMPREPLY=()'
++ COMPREPLY=()
+ return 1
+ return
+ return
# <---- but no completion to /etc is performed

As comparison, the last lines of 2.11, where the completion is working:

+ _scp_remote_files    # <----- calling the old function
+ local 'IFS=
'
+ cur=example.com:/et
+ local userhost=example.com
+ local path=/et
++ command sed -e 's/\\\\\\\([][(){}<>"'\'',:;^&!$=?`\\|[:space:]]\)/\\\1/g'
+ path=/et
+ [[ -z /et ]]
+ local files
+ [[ '' == -d ]]
++ ssh -o 'Batchmode yes' example.com command ls -aF1dL '/et*'
++ command sed -e 's/[][(){}<>"'\'',:;^&!$=?`\\|[:space:]]/\\\\\\&/g' -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g'
+ files=/etc/        # <----- ssh command was working and returned the correct /etc
+ COMPREPLY+=($files)
+ return
c/           # <------ correct completion to from /et to /etc/

upekkha avatar Apr 05 '24 07:04 upekkha

Thank you for the detailed report.

akinomyoga avatar Apr 05 '24 08:04 akinomyoga

The rsync completion had the same problem in 2.12, ie. it wouldn't complete the remote path on doing something like rsync -avP remote-host:/et<TAB> ... haven't tried 2.13.0 yet. Sorry for coming up late with this! :innocent:

z1atk0 avatar Apr 05 '24 08:04 z1atk0

Thanks for the additional information. The rsync completion actually uses the same function _comp_xfunc_scp_compgen_remote_files. I confirmed the behavior of rsync in 2.13 and also confirmed that it is fixed by #1158.

akinomyoga avatar Apr 05 '24 08:04 akinomyoga

Thanks for the quick fix. Works like a charm for scp and rsync.

upekkha avatar Apr 05 '24 08:04 upekkha