diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7529e72dfa9..9c3b80eadc8 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,7 +13,7 @@ repos: hooks: - id: shfmt types: [text] - files: ^(bash_completion(\.d/[^/]+\.bash)?|completions/.+|test/(config/bashrc|fallback/update-fallback-links|runLint|update-test-cmd-list)|.+\.sh(\.in)?)$ + files: ^(bash_completion(\.d/[^/]+\.bash)?|completions/.+|test/(config/bashrc|fixtures/.+/bin/.+|fallback/update-fallback-links|runLint|update-test-cmd-list)|.+\.sh(\.in)?)$ exclude: ^completions/(\.gitignore|Makefile.*)$ - repo: https://github.com/shellcheck-py/shellcheck-py @@ -22,7 +22,7 @@ repos: - id: shellcheck args: [-f, gcc] types: [text] - files: ^(bash_completion(\.d/[^/]+\.bash)?|completions/.+|test/(config/bashrc|fallback/update-fallback-links|runLint|update-test-cmd-list)|.+\.sh(\.in)?)$ + files: ^(bash_completion(\.d/[^/]+\.bash)?|completions/.+|test/(config/bashrc|fixtures/.+/bin/.+|fallback/update-fallback-links|runLint|update-test-cmd-list)|.+\.sh(\.in)?)$ exclude: ^completions/(\.gitignore|Makefile.*)$ require_serial: false # We disable SC1090 anyway, so parallel is ok diff --git a/test/fixtures/mount/bin/showmount b/test/fixtures/mount/bin/showmount index 2751c4bae26..c79ee06010e 100755 --- a/test/fixtures/mount/bin/showmount +++ b/test/fixtures/mount/bin/showmount @@ -1,6 +1,6 @@ -#!/bin/sh +#!/bin/bash -if [ "$1" = -e ] && [ "$2" = mocksrv ]; then +if [[ $1 == -e && $2 == "mocksrv" ]]; then echo "Header line" echo "/test/path" echo "/test/path2" diff --git a/test/fixtures/scp/bin/ssh b/test/fixtures/scp/bin/ssh new file mode 100755 index 00000000000..0392dfe5d38 --- /dev/null +++ b/test/fixtures/scp/bin/ssh @@ -0,0 +1,19 @@ +#!/bin/bash +set -eu +args=("$@") +while true; do + arg="${args[0]-}" + case "$arg" in + -o) + args=("${args[@]:2}") + ;; + local) + args=("${args[@]:1}") + ;; + *) + break + ;; + esac +done +#shellcheck disable=SC2068 +${args[@]} diff --git a/test/t/test_scp.py b/test/t/test_scp.py index 6410119eb56..b91e5476827 100644 --- a/test/t/test_scp.py +++ b/test/t/test_scp.py @@ -2,7 +2,7 @@ import pytest -from conftest import assert_bash_exec, assert_complete +from conftest import assert_bash_exec, assert_complete, bash_env_saved LIVE_HOST = "bash_completion" @@ -23,7 +23,7 @@ def test_basic(self, hosts, completion): ) ), # Local filenames - ["config", "known_hosts", r"spaced\ \ conf"], + ["bin/", "config", "known_hosts", r"spaced\ \ conf"], ) ) assert completion == expected @@ -43,7 +43,7 @@ def test_basic_spaced_conf(self, hosts, completion): ) ), # Local filenames - ["config", "known_hosts", r"spaced\ \ conf"], + ["bin/", "config", "known_hosts", r"spaced\ \ conf"], ) ) assert completion == expected @@ -101,3 +101,43 @@ def test_remote_path_with_spaces(self, bash): completion = assert_complete(bash, "scp remote_host:spaces") assert_bash_exec(bash, "unset -f ssh") assert completion == r"\\\ in\\\ filename.txt" + + def test_xfunc_remote_files(self, bash): + with bash_env_saved(bash) as bash_env: + bash_env.save_variable("COMPREPLY") + bash_env.write_variable( + "PATH", + "$PWD/scp/bin:$PATH", + quote=False, + ) + bash_env.write_variable("cur", "local:shared/default/") + completions_regular_escape = ( + assert_bash_exec( + bash, + r'_comp_compgen -x scp remote_files; printf "%s\n" "${COMPREPLY[@]}"', + want_output=True, + ) + .strip() + .splitlines() + ) + completions_less_escape = ( + assert_bash_exec( + bash, + r'_comp_compgen -x scp remote_files -l; printf "%s\n" "${COMPREPLY[@]}"', + want_output=True, + ) + .strip() + .splitlines() + ) + assert completions_regular_escape == [ + "shared/default/bar ", + r"shared/default/bar\\\ bar.d/", + "shared/default/foo ", + "shared/default/foo.d/", + ] + assert completions_less_escape == [ + "shared/default/bar ", + r"shared/default/bar\ bar.d/", + "shared/default/foo ", + "shared/default/foo.d/", + ]