From 60d97a4a63bc32d55d40b62e08e21260f4416a5f Mon Sep 17 00:00:00 2001 From: Rory Hunter Date: Thu, 30 Jul 2015 15:09:24 +0100 Subject: [PATCH] Make run and rmi bash completions configurable Allow the user to configure how Docker's bash completion works for the "events", "history", "inspect", "run", "rmi" and "save" commands through the following environment variables: DOCKER_COMPLETION_SHOW_IMAGE_IDS "none" - Show names only (default) "non-intermediate" - Show names and ids, but omit intermediate image IDs "all" - Show names and ids, including intermediate image IDs DOCKER_COMPLETION_SHOW_TAGS "yes" - include tags in completion options (default) "no" - don't include tags in completion options Fixes #9474. Signed-off-by: Rory Hunter --- contrib/completion/bash/docker | 71 +++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/contrib/completion/bash/docker b/contrib/completion/bash/docker index d056c2c46d..7e40b5cfbf 100644 --- a/contrib/completion/bash/docker +++ b/contrib/completion/bash/docker @@ -14,6 +14,22 @@ # - copy this file to e.g. ~/.docker-completion.sh and add the line # below to your .bashrc after bash completion features are loaded # . ~/.docker-completion.sh +# +# Configuration: +# +# You can tailor completion for the "events", "history", "inspect", "run", +# "rmi" and "save" commands by settings the following environment +# variables: +# +# DOCKER_COMPLETION_SHOW_IMAGE_IDS +# "none" - Show names only (default) +# "non-intermediate" - Show names and ids, but omit intermediate image IDs +# "all" - Show names and ids, including intermediate image IDs +# +# DOCKER_COMPLETION_SHOW_TAGS +# "yes" - include tags in completion options (default) +# "no" - don't include tags in completion options + # # Note: # Currently, the completions will not work if the docker daemon is not @@ -70,6 +86,40 @@ __docker_container_ids() { COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") ) } +__docker_images() { + local images_args="" + + case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in + all) + images_args="--no-trunc -a" + ;; + non-intermediate) + images_args="--no-trunc" + ;; + esac + + local repo_print_command + if [ "${DOCKER_COMPLETION_SHOW_TAGS:-yes}" = "yes" ]; then + repo_print_command='print $1; print $1":"$2' + else + repo_print_command='print $1' + fi + + local awk_script + case "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" in + all|non-intermediate) + awk_script='NR>1 { print $3; if ($1 != "") { '"$repo_print_command"' } }' + ;; + none|*) + awk_script='NR>1 && $1 != "" { '"$repo_print_command"' }' + ;; + esac + + local images=$(__docker_q images $images_args | awk "$awk_script") + COMPREPLY=( $(compgen -W "$images" -- "$cur") ) + __ltrim_colon_completions "$cur" +} + __docker_image_repos() { local repos="$(__docker_q images | awk 'NR>1 && $1 != "" { print $1 }')" COMPREPLY=( $(compgen -W "$repos" -- "$cur") ) @@ -81,16 +131,10 @@ __docker_image_repos_and_tags() { __ltrim_colon_completions "$cur" } -__docker_image_repos_and_tags_and_ids() { - local images="$(__docker_q images -a --no-trunc | awk 'NR>1 { print $3; if ($1 != "") { print $1; print $1":"$2 } }')" - COMPREPLY=( $(compgen -W "$images" -- "$cur") ) - __ltrim_colon_completions "$cur" -} - __docker_containers_and_images() { __docker_containers_all local containers=( "${COMPREPLY[@]}" ) - __docker_image_repos_and_tags_and_ids + __docker_images COMPREPLY+=( "${containers[@]}" ) } @@ -599,7 +643,7 @@ _docker_events() { ;; *image=*) cur="${cur#=}" - __docker_image_repos_and_tags_and_ids + __docker_images return ;; esac @@ -657,7 +701,7 @@ _docker_history() { *) local counter=$(__docker_pos_first_nonflag) if [ $cword -eq $counter ]; then - __docker_image_repos_and_tags_and_ids + __docker_images fi ;; esac @@ -750,7 +794,7 @@ _docker_inspect() { __docker_containers_all ;; image) - __docker_image_repos_and_tags_and_ids + __docker_images ;; esac esac @@ -990,7 +1034,7 @@ _docker_rmi() { COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) ) ;; *) - __docker_image_repos_and_tags_and_ids + __docker_images ;; esac } @@ -1195,9 +1239,8 @@ _docker_run() { ;; *) local counter=$( __docker_pos_first_nonflag $( __docker_to_alternatives "$options_with_args" ) ) - if [ $cword -eq $counter ]; then - __docker_image_repos_and_tags_and_ids + __docker_images fi ;; esac @@ -1216,7 +1259,7 @@ _docker_save() { COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) ) ;; *) - __docker_image_repos_and_tags_and_ids + __docker_images ;; esac }