Bash completion: avoid 'compopt: command not found' errors on Mac OS

The shell builtin `compopt` is not available on the outdated bash
version 3.2.57 that ships with Mac OS.
It is used in Docker's bash completion to suppress trailing spaces
in advanced completions of hash map options, e.g. `--log-opt`.

If `compopt` is not available, the new behavior is to do nothing,
i.e. the user will have to delete the additional space.

Signed-off-by: Harald Albers <github@albersweb.de>
This commit is contained in:
Harald Albers 2015-09-22 12:17:30 -07:00 committed by Tibor Vass
parent 83a6b3e927
commit 7310f4a2bd
1 changed files with 22 additions and 16 deletions

View File

@ -212,6 +212,12 @@ __docker_to_extglob() {
echo "@($extglob)"
}
# suppress trailing whitespace
__docker_nospace() {
# compopt is not available in ancient bash versions
type compopt &>/dev/null && compopt -o nospace
}
__docker_resolve_hostname() {
command -v host >/dev/null 2>&1 || return
COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
@ -305,7 +311,7 @@ __docker_log_driver_options() {
;;
esac
compopt -o nospace
__docker_nospace
}
__docker_complete_log_driver_options() {
@ -314,12 +320,12 @@ __docker_complete_log_driver_options() {
case "${words[$cword-2]}$prev=" in
*gelf-address=*)
COMPREPLY=( $( compgen -W "udp" -S "://" -- "${cur#=}" ) )
compopt -o nospace
__docker_nospace
return
;;
*syslog-address=*)
COMPREPLY=( $( compgen -W "tcp udp unix" -S "://" -- "${cur#=}" ) )
compopt -o nospace
__docker_nospace
return
;;
*syslog-facility=*)
@ -492,7 +498,7 @@ _docker_cp() {
*)
__docker_containers_all
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
compopt -o nospace
__docker_nospace
return
;;
esac
@ -599,7 +605,7 @@ _docker_daemon() {
return
;;
esac
compopt -o nospace
__docker_nospace
return
;;
--log-level|-l)
@ -662,7 +668,7 @@ _docker_events() {
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "container event image" -- "$cur" ) )
compopt -o nospace
__docker_nospace
return
;;
--since|--until)
@ -777,7 +783,7 @@ _docker_images() {
--filter|-f)
COMPREPLY=( $( compgen -W "dangling=true label=" -- "$cur" ) )
if [ "$COMPREPLY" = "label=" ]; then
compopt -o nospace
__docker_nospace
fi
return
;;
@ -975,7 +981,7 @@ _docker_ps() {
;;
--filter|-f)
COMPREPLY=( $( compgen -S = -W "ancestor exited id label name status" -- "$cur" ) )
compopt -o nospace
__docker_nospace
return
;;
--format|-n)
@ -1207,18 +1213,18 @@ _docker_run() {
;;
'')
COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
compopt -o nospace
__docker_nospace
;;
/*)
_filedir
compopt -o nospace
__docker_nospace
;;
esac
return
;;
--env|-e)
COMPREPLY=( $( compgen -e -- "$cur" ) )
compopt -o nospace
__docker_nospace
return
;;
--ipc)
@ -1230,7 +1236,7 @@ _docker_run() {
*)
COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
if [ "$COMPREPLY" = "container:" ]; then
compopt -o nospace
__docker_nospace
fi
;;
esac
@ -1243,7 +1249,7 @@ _docker_run() {
*)
__docker_containers_running
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
compopt -o nospace
__docker_nospace
;;
esac
return
@ -1265,7 +1271,7 @@ _docker_run() {
*)
COMPREPLY=( $( compgen -W "bridge none container: host" -- "$cur") )
if [ "${COMPREPLY[*]}" = "container:" ] ; then
compopt -o nospace
__docker_nospace
fi
;;
esac
@ -1289,12 +1295,12 @@ _docker_run() {
local cur=${cur##*:}
COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "$cur") )
if [ "${COMPREPLY[*]}" != "disable" ] ; then
compopt -o nospace
__docker_nospace
fi
;;
*)
COMPREPLY=( $( compgen -W "label apparmor" -S ":" -- "$cur") )
compopt -o nospace
__docker_nospace
;;
esac
return