Skip to content

Commit

Permalink
Add bash completion for available plugins
Browse files Browse the repository at this point in the history
Signed-off-by: CrazyMax <github@crazymax.dev>
(cherry picked from commit aa0aa4a)
  • Loading branch information
crazy-max committed Mar 17, 2023
1 parent 3825ed5 commit 928e470
Showing 1 changed file with 32 additions and 21 deletions.
53 changes: 32 additions & 21 deletions contrib/completion/bash/docker
Original file line number Diff line number Diff line change
Expand Up @@ -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="
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 928e470

Please sign in to comment.