diff --git a/contrib/completion/bash/docker b/contrib/completion/bash/docker index 644cd275fb..71b41934b7 100644 --- a/contrib/completion/bash/docker +++ b/contrib/completion/bash/docker @@ -1142,6 +1142,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=" @@ -5395,23 +5418,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 @@ -5481,11 +5487,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