Align bash completion of plugins to completion of nodes and services

Signed-off-by: Harald Albers <github@albersweb.de>
master
Harald Albers 2016-10-11 03:21:47 -07:00 committed by Tibor Vass
parent 2160c366b8
commit 34630120b3
1 changed files with 47 additions and 15 deletions

View File

@ -237,12 +237,49 @@ __docker_complete_volumes() {
COMPREPLY=( $(compgen -W "$(__docker_volumes "$@")" -- "$current") )
}
# Returns a list of all plugins of a given type.
# The type has to be specified with the mandatory option `--type`.
# Valid types are: Network, Volume, Authorization.
# Completions may be added or removed with `--add` and `--remove`
__docker_plugins() {
__docker_q info | sed -n "/^Plugins/,/^[^ ]/s/ $1: //p"
local type add=() remove=()
while true ; do
case "$1" in
--type)
type="$2"
shift 2
;;
--add)
add+=("$2")
shift 2
;;
--remove)
remove+=("$2")
shift 2
;;
*)
break
;;
esac
done
local plugins=($(__docker_q info | sed -n "/^Plugins/,/^[^ ]/s/ $type: //p"))
for del in "${remove[@]}" ; do
plugins=(${plugins[@]/$del/})
done
echo "${plugins[@]} ${add[@]}"
}
# Applies completion of plugins based on the current value of `$cur` or
# the value of the optional first option `--cur`, if given.
# The plugin type has to be specified with the next option `--type`.
__docker_complete_plugins() {
COMPREPLY=( $(compgen -W "$(__docker_plugins $1)" -- "$cur") )
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(compgen -W "$(__docker_plugins "$@")" -- "$current") )
}
__docker_runtimes() {
@ -1029,7 +1066,7 @@ _docker_daemon() {
case "$prev" in
--authorization-plugin)
__docker_complete_plugins Authorization
__docker_complete_plugins --type Authorization
return
;;
--cluster-store)
@ -1528,11 +1565,8 @@ _docker_network_create() {
return
;;
--driver|-d)
local plugins="$(__docker_plugins Network) macvlan"
# remove drivers that allow one instance only
plugins=${plugins/ host / }
plugins=${plugins/ null / }
COMPREPLY=( $(compgen -W "$plugins" -- "$cur") )
# remove drivers that allow one instance only, add drivers missing in `docker info`
__docker_complete_plugins --type Network --remove host --remove null --add macvlan
return
;;
--label)
@ -1583,8 +1617,7 @@ _docker_network_ls() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
driver)
local plugins=" $(__docker_plugins Network) "
COMPREPLY=( $(compgen -W "$plugins" -- "${cur##*=}") )
__docker_complete_plugins --cur "${cur##*=}" --type Network --add macvlan
return
;;
id)
@ -2587,7 +2620,7 @@ _docker_run() {
__docker_complete_containers_all --cur "${cur#*:}"
;;
*)
COMPREPLY=( $( compgen -W "$(__docker_plugins Network) $(__docker_networks) container:" -- "$cur") )
COMPREPLY=( $( compgen -W "$(__docker_plugins --type Network) $(__docker_networks) container:" -- "$cur") )
if [ "${COMPREPLY[*]}" = "container:" ] ; then
__docker_nospace
fi
@ -2634,7 +2667,7 @@ _docker_run() {
return
;;
--volume-driver)
__docker_complete_plugins Volume
__docker_complete_plugins --type Volume
return
;;
--volumes-from)
@ -2855,7 +2888,7 @@ _docker_version() {
_docker_volume_create() {
case "$prev" in
--driver|-d)
__docker_complete_plugins Volume
__docker_complete_plugins --type Volume
return
;;
--label|--opt|-o)
@ -2895,8 +2928,7 @@ _docker_volume_ls() {
return
;;
driver)
cur=${cur##*=}
__docker_complete_plugins Volume
__docker_complete_plugins --cur "${cur##*=}" --type Volume
return
;;
name)