From 928e470879d62d5981b8cf8f5301287a112e05dd Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Mon, 13 Mar 2023 19:46:58 +0100 Subject: [PATCH] Add bash completion for available plugins Signed-off-by: CrazyMax (cherry picked from commit aa0aa4a6dcf9d86f6f46979e9684ef0b48e5f6fe) --- contrib/completion/bash/docker | 53 ++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/contrib/completion/bash/docker b/contrib/completion/bash/docker index 170732c23d..245d70071a 100644 --- a/contrib/completion/bash/docker +++ b/contrib/completion/bash/docker @@ -1184,6 +1184,29 @@ __docker_complete_user_group() { fi } +DOCKER_PLUGINS_PATH=$(docker info --format '{{range .ClientInfo.Plugins}}{{.Path}}:{{end}}') + +__docker_complete_plugin() { + local path=$1 + local completionCommand="__completeNoDesc" + local resultArray=($path $completionCommand) + for value in "${words[@]:2}"; do + if [ -z "$value" ]; then + resultArray+=( "''" ) + else + resultArray+=( "$value" ) + fi + done + local result=$(eval "${resultArray[*]}" 2> /dev/null | grep -v '^:[0-9]*$') + + # if result empty, just use filename completion as fallback + if [ -z "$result" ]; then + _filedir + else + COMPREPLY=( $(compgen -W "${result}" -- "${current-}") ) + fi +} + _docker_docker() { # global options that may appear after the docker command local boolean_options=" @@ -5477,23 +5500,6 @@ _docker_wait() { _docker_container_wait } -COMPOSE_PLUGIN_PATH=$(docker info --format '{{range .ClientInfo.Plugins}}{{if eq .Name "compose"}}{{.Path}}{{end}}{{end}}') - -_docker_compose() { - local completionCommand="__completeNoDesc" - local resultArray=($COMPOSE_PLUGIN_PATH $completionCommand compose) - for value in "${words[@]:2}"; do - if [ -z "$value" ]; then - resultArray+=( "''" ) - else - resultArray+=( "$value" ) - fi - done - local result=$(eval "${resultArray[*]}" 2> /dev/null | grep -v '^:[0-9]*$') - - COMPREPLY=( $(compgen -W "${result}" -- "$current") ) -} - _docker() { local previous_extglob_setting=$(shopt -p extglob) shopt -s extglob @@ -5563,11 +5569,16 @@ _docker() { wait ) + # Create completion functions for all registered plugins local known_plugin_commands=() - - if [ -f "$COMPOSE_PLUGIN_PATH" ] ; then - known_plugin_commands+=("compose") - fi + local plugin_name="" + for plugin_path in ${DOCKER_PLUGINS_PATH//:/ }; do + plugin_name=$(basename "$plugin_path" | sed 's/ *$//') + plugin_name=${plugin_name#docker-} + plugin_name=${plugin_name%%.*} + eval "_docker_${plugin_name}() { __docker_complete_plugin \"${plugin_path}\"; }" + known_plugin_commands+=(${plugin_name}) + done local experimental_server_commands=( checkpoint