소스 검색

Merge pull request #27316 from albers/completion-plugins

Align bash completion of plugins to completion of nodes and services
Vincent Demeester 8 년 전
부모
커밋
ff43982fbb
1개의 변경된 파일47개의 추가작업 그리고 15개의 파일을 삭제
  1. 47 15
      contrib/completion/bash/docker

+ 47 - 15
contrib/completion/bash/docker

@@ -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)