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 5c3a594)
  • Loading branch information
crazy-max committed Mar 14, 2023
1 parent 3825ed5 commit 746249e
Showing 1 changed file with 31 additions and 21 deletions.
52 changes: 31 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
}

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 @@ -5564,10 +5570,14 @@ _docker() {
)

local known_plugin_commands=()

if [ -f "$COMPOSE_PLUGIN_PATH" ] ; then
known_plugin_commands+=("compose")
fi
local plugin_name=""
for plugin_path in ${PLUGINS_PATH//,/ }; do
plugin_name=$(basename "$plugin_path" | sed 's/ *$//g')
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 746249e

Please sign in to comment.