_go2() {
COMPREPLY=()
local program=go2
local cur prev words cword
_init_completion -n : || return
declare -a FLAGS
declare -a OPTIONS
declare -a MYWORDS
local INDEX=`expr $cword - 1`
MYWORDS=("${words[@]:1:$cword}")
FLAGS=('--help' 'Show command help' '-h' 'Show command help')
OPTIONS=('--config-file' 'load configuration from this file' '-C' 'load configuration from this file')
__go2_handle_options_flags
case $INDEX in
0)
__comp_current_options || return
__go2_dynamic_comp 'commands' 'connect'$'\t''connect to the hosts'$'\n''cp'$'\t''copy files from/to hosts'$'\n''cssh'$'\t''connect to the hosts via ClusterSSH'$'\n''help'$'\t''Show command help'$'\n''list'$'\t''list the hosts'$'\n''wipe-cache'$'\t''removes all cached machine information'
;;
*)
case ${MYWORDS[0]} in
_meta)
__go2_handle_options_flags
case $INDEX in
1)
__comp_current_options || return
__go2_dynamic_comp 'commands' 'completion'$'\t''Shell completion functions'$'\n''pod'$'\t''Pod documentation'
;;
*)
case ${MYWORDS[1]} in
completion)
__go2_handle_options_flags
case $INDEX in
2)
__comp_current_options || return
__go2_dynamic_comp 'commands' 'generate'$'\t''Generate self completion'
;;
*)
case ${MYWORDS[2]} in
generate)
FLAGS+=('--zsh' 'for zsh' '--bash' 'for bash')
OPTIONS+=('--name' 'name of the program (optional, override name in spec)')
__go2_handle_options_flags
case ${MYWORDS[$INDEX-1]} in
--config-file|-C)
;;
--name)
;;
esac
case $INDEX in
*)
__comp_current_options || return
;;
esac
;;
esac
;;
esac
;;
pod)
__go2_handle_options_flags
case $INDEX in
2)
__comp_current_options || return
__go2_dynamic_comp 'commands' 'generate'$'\t''Generate self pod'
;;
*)
case ${MYWORDS[2]} in
generate)
__go2_handle_options_flags
__comp_current_options true || return
;;
esac
;;
esac
;;
esac
;;
esac
;;
connect)
FLAGS+=('--all' 'SSH to every matching machine, one after the other, instead of the best match only' '-a' 'SSH to every matching machine, one after the other, instead of the best match only' '--verbose' 'verbose output' '-v' 'verbose output' '--external' 'access the machines from an external address, if you'"\\'"'re not in the office or on the VPN' '-e' 'access the machines from an external address, if you'"\\'"'re not in the office or on the VPN' '--dry-run' 'don'"\\'"'t run the ssh command, just print it' '-d' 'don'"\\'"'t run the ssh command, just print it')
__go2_handle_options_flags
case ${MYWORDS[$INDEX-1]} in
--config-file|-C)
;;
esac
case $INDEX in
1)
__comp_current_options || return
_go2_connect_param_regex_completion
;;
*)
__comp_current_options || return
;;
esac
;;
cp)
FLAGS+=('--all' 'SSH to every matching machine, one after the other, instead of the best match only' '-a' 'SSH to every matching machine, one after the other, instead of the best match only' '--verbose' 'verbose output' '-v' 'verbose output' '--external' 'access the machines from an external address, if you'"\\'"'re not in the office or on the VPN' '-e' 'access the machines from an external address, if you'"\\'"'re not in the office or on the VPN' '--dry-run' 'don'"\\'"'t run the ssh command, just print it' '-d' 'don'"\\'"'t run the ssh command, just print it' '--recursive' 'recursively copy entire directories' '-r' 'recursively copy entire directories')
__go2_handle_options_flags
case ${MYWORDS[$INDEX-1]} in
--config-file|-C)
;;
esac
case $INDEX in
1)
__comp_current_options || return
_go2_cp_param_path_completion
;;
*)
__comp_current_options || return
;;
esac
;;
cssh)
FLAGS+=('--all' 'SSH to every matching machine, one after the other, instead of the best match only' '-a' 'SSH to every matching machine, one after the other, instead of the best match only' '--verbose' 'verbose output' '-v' 'verbose output' '--external' 'access the machines from an external address, if you'"\\'"'re not in the office or on the VPN' '-e' 'access the machines from an external address, if you'"\\'"'re not in the office or on the VPN')
__go2_handle_options_flags
case ${MYWORDS[$INDEX-1]} in
--config-file|-C)
;;
esac
case $INDEX in
1)
__comp_current_options || return
_go2_cssh_param_regex_completion
;;
*)
__comp_current_options || return
;;
esac
;;
help)
FLAGS+=('--all' '')
__go2_handle_options_flags
case $INDEX in
1)
__comp_current_options || return
__go2_dynamic_comp 'commands' 'connect'$'\n''cp'$'\n''cssh'$'\n''list'$'\n''wipe-cache'
;;
*)
case ${MYWORDS[1]} in
_meta)
__go2_handle_options_flags
case $INDEX in
2)
__comp_current_options || return
__go2_dynamic_comp 'commands' 'completion'$'\n''pod'
;;
*)
case ${MYWORDS[2]} in
completion)
__go2_handle_options_flags
case $INDEX in
3)
__comp_current_options || return
__go2_dynamic_comp 'commands' 'generate'
;;
*)
case ${MYWORDS[3]} in
generate)
__go2_handle_options_flags
__comp_current_options true || return
;;
esac
;;
esac
;;
pod)
__go2_handle_options_flags
case $INDEX in
3)
__comp_current_options || return
__go2_dynamic_comp 'commands' 'generate'
;;
*)
case ${MYWORDS[3]} in
generate)
__go2_handle_options_flags
__comp_current_options true || return
;;
esac
;;
esac
;;
esac
;;
esac
;;
connect)
__go2_handle_options_flags
__comp_current_options true || return
;;
cp)
__go2_handle_options_flags
__comp_current_options true || return
;;
cssh)
__go2_handle_options_flags
__comp_current_options true || return
;;
list)
__go2_handle_options_flags
__comp_current_options true || return
;;
wipe-cache)
__go2_handle_options_flags
__comp_current_options true || return
;;
esac
;;
esac
;;
list)
FLAGS+=('--all' 'SSH to every matching machine, one after the other, instead of the best match only' '-a' 'SSH to every matching machine, one after the other, instead of the best match only' '--verbose' 'verbose output' '-v' 'verbose output' '--external' 'access the machines from an external address, if you'"\\'"'re not in the office or on the VPN' '-e' 'access the machines from an external address, if you'"\\'"'re not in the office or on the VPN')
__go2_handle_options_flags
case ${MYWORDS[$INDEX-1]} in
--config-file|-C)
;;
esac
case $INDEX in
1)
__comp_current_options || return
_go2_list_param_regex_completion
;;
*)
__comp_current_options || return
;;
esac
;;
wipe-cache)
__go2_handle_options_flags
__comp_current_options true || return
;;
esac
;;
esac
}
_go2_compreply() {
local prefix=""
cur="$(printf '%q' "$cur")"
IFS=$'\n' COMPREPLY=($(compgen -P "$prefix" -W "$*" -- "$cur"))
__ltrim_colon_completions "$prefix$cur"
if [[ ${#COMPREPLY[*]} -eq 1 ]]; then
COMPREPLY=( "${COMPREPLY[0]%% -- *}" )
COMPREPLY=( "${COMPREPLY[0]%%+( )}" )
fi
}
_go2_connect_param_regex_completion() {
local __dynamic_completion
__dynamic_completion=$(PERL5_APPSPECRUN_SHELL=bash PERL5_APPSPECRUN_COMPLETION_PARAMETER='regex' ${words[@]})
__go2_dynamic_comp 'regex' "$__dynamic_completion"
}
_go2_cp_param_path_completion() {
local __dynamic_completion
__dynamic_completion=$(PERL5_APPSPECRUN_SHELL=bash PERL5_APPSPECRUN_COMPLETION_PARAMETER='path' ${words[@]})
__go2_dynamic_comp 'path' "$__dynamic_completion"
}
_go2_cssh_param_regex_completion() {
local __dynamic_completion
__dynamic_completion=$(PERL5_APPSPECRUN_SHELL=bash PERL5_APPSPECRUN_COMPLETION_PARAMETER='regex' ${words[@]})
__go2_dynamic_comp 'regex' "$__dynamic_completion"
}
_go2_list_param_regex_completion() {
local __dynamic_completion
__dynamic_completion=$(PERL5_APPSPECRUN_SHELL=bash PERL5_APPSPECRUN_COMPLETION_PARAMETER='regex' ${words[@]})
__go2_dynamic_comp 'regex' "$__dynamic_completion"
}
__go2_dynamic_comp() {
local argname="$1"
local arg="$2"
local name desc cols desclength formatted
local comp=()
local max=0
while read -r line; do
name="$line"
desc="$line"
name="${name%$'\t'*}"
if [[ "${#name}" -gt "$max" ]]; then
max="${#name}"
fi
done <<< "$arg"
while read -r line; do
name="$line"
desc="$line"
name="${name%$'\t'*}"
desc="${desc/*$'\t'}"
if [[ -n "$desc" && "$desc" != "$name" ]]; then
cols=`tput cols`
[[ -z $cols ]] && cols=80
desclength=`expr $cols - 4 - $max`
formatted=`printf "%-*s -- %-*s" "$max" "$name" "$desclength" "$desc"`
comp+=("$formatted")
else
comp+=("'$name'")
fi
done <<< "$arg"
_go2_compreply ${comp[@]}
}
function __go2_handle_options() {
local i j
declare -a copy
local last="${MYWORDS[$INDEX]}"
local max=`expr ${#MYWORDS[@]} - 1`
for ((i=0; i<$max; i++))
do
local word="${MYWORDS[$i]}"
local found=
for ((j=0; j<${#OPTIONS[@]}; j+=2))
do
local option="${OPTIONS[$j]}"
if [[ "$word" == "$option" ]]; then
found=1
i=`expr $i + 1`
break
fi
done
if [[ -n $found && $i -lt $max ]]; then
INDEX=`expr $INDEX - 2`
else
copy+=("$word")
fi
done
MYWORDS=("${copy[@]}" "$last")
}
function __go2_handle_flags() {
local i j
declare -a copy
local last="${MYWORDS[$INDEX]}"
local max=`expr ${#MYWORDS[@]} - 1`
for ((i=0; i<$max; i++))
do
local word="${MYWORDS[$i]}"
local found=
for ((j=0; j<${#FLAGS[@]}; j+=2))
do
local flag="${FLAGS[$j]}"
if [[ "$word" == "$flag" ]]; then
found=1
break
fi
done
if [[ -n $found ]]; then
INDEX=`expr $INDEX - 1`
else
copy+=("$word")
fi
done
MYWORDS=("${copy[@]}" "$last")
}
__go2_handle_options_flags() {
__go2_handle_options
__go2_handle_flags
}
__comp_current_options() {
local always="$1"
if [[ -n $always || ${MYWORDS[$INDEX]} =~ ^- ]]; then
local options_spec=''
local j=
for ((j=0; j<${#FLAGS[@]}; j+=2))
do
local name="${FLAGS[$j]}"
local desc="${FLAGS[$j+1]}"
options_spec+="$name"$'\t'"$desc"$'\n'
done
for ((j=0; j<${#OPTIONS[@]}; j+=2))
do
local name="${OPTIONS[$j]}"
local desc="${OPTIONS[$j+1]}"
options_spec+="$name"$'\t'"$desc"$'\n'
done
__go2_dynamic_comp 'options' "$options_spec"
return 1
else
return 0
fi
}
complete -o default -F _go2 go2