Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 86 additions & 15 deletions contrib/completion/bash/docker
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,31 @@ __docker_daemon_os_is() {
[ "$actual_os" = "$expected_os" ]
}

# __docker_stack_orchestrator_is tests whether the client is configured to use
# the orchestrator that is passed in as the first argument.
__docker_stack_orchestrator_is() {
case "$1" in
kubernetes)
if [ -z "$stack_orchestrator_is_kubernetes" ] ; then
__docker_q stack ls --help | grep -qe --namespace
stack_orchestrator_is_kubernetes=$?
fi
return $stack_orchestrator_is_kubernetes
;;
swarm)
if [ -z "$stack_orchestrator_is_swarm" ] ; then
__docker_q stack deploy --help | grep -qe "with-registry-auth"
stack_orchestrator_is_swarm=$?
fi
return $stack_orchestrator_is_swarm
;;
*)
return 1
;;

esac
}

# __docker_pos_first_nonflag finds the position of the first word that is neither
# option nor an option's argument. If there are options that require arguments,
# you should pass a glob describing those options, e.g. "--option1|-o|--option2"
Expand Down Expand Up @@ -1050,6 +1075,23 @@ __docker_complete_signals() {
COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo "$cur" | tr '[:lower:]' '[:upper:]')" ) )
}

__docker_complete_stack_orchestrator_options() {
case "$prev" in
--kubeconfig)
_filedir
return 0
;;
--namespace)
return 0
;;
--orchestrator)
COMPREPLY=( $( compgen -W "all kubernetes swarm" -- "$cur") )
return 0
;;
esac
return 1
}

__docker_complete_user_group() {
if [[ $cur == *:* ]] ; then
COMPREPLY=( $(compgen -g -- "${cur#*:}") )
Expand Down Expand Up @@ -4378,11 +4420,15 @@ _docker_stack() {
remove
up
"

__docker_complete_stack_orchestrator_options && return
__docker_subcommands "$subcommands $aliases" && return

case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
local options="--help --orchestrator"
__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
Expand All @@ -4391,12 +4437,12 @@ _docker_stack() {
}

_docker_stack_deploy() {
__docker_complete_stack_orchestrator_options && return

case "$prev" in
--bundle-file)
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed the selective completion here although it is correct behavior.

The important part is that --bundle-file is not completed if it is not appropriate, which is already taken care for.
If someone insists on manually typing this option, he will now get it completed although it does not exist in this context.
This is an error, but given the growing complexity of hiding options based on operating system, client/server experimental state and orchestrator replicating the hiding logic in the individual option's completions will bloat the code without much value.

if __docker_daemon_is_experimental ; then
_filedir dab
return
fi
_filedir dab
return
;;
--compose-file|-c)
_filedir yml
Expand All @@ -4410,12 +4456,14 @@ _docker_stack_deploy() {

case "$cur" in
-*)
local options="--compose-file -c --help --prune --resolve-image --with-registry-auth"
__docker_daemon_is_experimental && options+=" --bundle-file"
local options="--compose-file -c --help --orchestrator"
__docker_daemon_is_experimental && __docker_stack_orchestrator_is swarm && options+=" --bundle-file"
__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
__docker_stack_orchestrator_is swarm && options+=" --prune --resolve-image --with-registry-auth"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--bundle-file|--compose-file|-c|--resolve-image')
local counter=$(__docker_pos_first_nonflag '--bundle-file|--compose-file|-c|--kubeconfig|--namespace|--orchestrator|--resolve-image')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_stacks
fi
Expand All @@ -4432,6 +4480,8 @@ _docker_stack_list() {
}

_docker_stack_ls() {
__docker_complete_stack_orchestrator_options && return

case "$prev" in
--format)
return
Expand All @@ -4440,7 +4490,9 @@ _docker_stack_ls() {

case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format --help" -- "$cur" ) )
local options="--format --help --orchestrator"
__docker_stack_orchestrator_is kubernetes && options+=" --all-namespaces --kubeconfig --namespace"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
esac
}
Expand All @@ -4462,6 +4514,8 @@ _docker_stack_ps() {
;;
esac

__docker_complete_stack_orchestrator_options && return

case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "id name desired-state" -- "$cur" ) )
Expand All @@ -4475,10 +4529,12 @@ _docker_stack_ps() {

case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter -f --format --help --no-resolve --no-trunc --quiet -q" -- "$cur" ) )
local options="--filter -f --format --help --no-resolve --no-trunc --orchestrator --quiet -q"
__docker_stack_orchestrator_is kubernetes && options+=" --all-namespaces --kubeconfig --namespace"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--filter|-f')
local counter=$(__docker_pos_first_nonflag '--all-namespaces|--filter|-f|--format|--kubeconfig|--namespace')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_stacks
fi
Expand All @@ -4491,9 +4547,13 @@ _docker_stack_remove() {
}

_docker_stack_rm() {
__docker_complete_stack_orchestrator_options && return

case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
local options="--help --orchestrator"
__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
__docker_complete_stacks
Expand All @@ -4517,6 +4577,8 @@ _docker_stack_services() {
;;
esac

__docker_complete_stack_orchestrator_options && return

case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "id label name" -- "$cur" ) )
Expand All @@ -4530,10 +4592,12 @@ _docker_stack_services() {

case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter -f --format --help --quiet -q" -- "$cur" ) )
local options="--filter -f --format --help --orchestrator --quiet -q"
__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--filter|-f|--format')
local counter=$(__docker_pos_first_nonflag '--filter|-f|--format|--kubeconfig|--namespace|--orchestrator')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_stacks
fi
Expand Down Expand Up @@ -4800,6 +4864,8 @@ _docker_top() {
}

_docker_version() {
__docker_complete_stack_orchestrator_options && return

case "$prev" in
--format|-f)
return
Expand All @@ -4808,7 +4874,9 @@ _docker_version() {

case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
local options="--format -f --help"
__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
esac
}
Expand Down Expand Up @@ -5038,6 +5106,9 @@ _docker() {

local host config daemon_os

# variables to cache client info, populated on demand for performance reasons
local stack_orchestrator_is_kubernetes stack_orchestrator_is_swarm

COMPREPLY=()
local cur prev words cword
_get_comp_words_by_ref -n : cur prev words cword
Expand Down