diff options
Diffstat (limited to '')
-rw-r--r-- | completions/svcadm | 81 |
1 files changed, 41 insertions, 40 deletions
diff --git a/completions/svcadm b/completions/svcadm index 5269c7b..8505457 100644 --- a/completions/svcadm +++ b/completions/svcadm @@ -11,25 +11,25 @@ # but to not clutter the interface with all completions, we will only # cut every completion alternative at the next slash. # -# For example, if the user types <nothing><tab>, we will propose for svc://foo/bar/bar/baz -# the following completion: foo/, bar/ and baz +# For example, if the user types <nothing><tab>, we will propose +# for svc://foo/bar/bar/baz the following completion: foo/, bar/ and baz # If the user types <b><tab>, we will propose: bar/ and baz # If the user types <bar/><tab>, we will propose: bar/bar/ and bar/baz # -# By default, the function proproses only abbreviated completions except if the user already -# began to type svc:. In that case we will propose only the complete FMRI beginning with the -# pattern +# By default, the function proproses only abbreviated completions except if the +# user already began to type svc:. In that case we will propose only the +# complete FMRI beginning with the pattern # -_smf_complete_fmri() +_comp_cmd_svcadm__fmri() { local cur="$1" prefix="$2" local cur_prefix fmri fmri_list="" - local exact_mode pattern + local exact_mode="" pattern if [[ $cur == $prefix* ]]; then [[ $cur == "$prefix" ]] && cur+="/" pattern="$cur*" - exact_mode=1 + exact_mode=set else pattern="$prefix*/$cur*" fi @@ -38,22 +38,22 @@ _smf_complete_fmri() for fmri in $(svcs -H -o FMRI "$pattern" 2>/dev/null); do local fmri_part_list fmri_part - if [[ -z $exact_mode ]]; then - fmri=${fmri#$prefix/} + if [[ ! $exact_mode ]]; then + fmri=${fmri#"$prefix/"} - # we generate all possibles abbrevations for the FMRI + # we generate all possibles abbreviations for the FMRI # no need to have a generic loop as we will have a finite # number of components - local ifs="$IFS" - IFS="/" - set -- $fmri - IFS=$ifs - case $# in - 1) fmri_part_list=" $1" ;; - 2) fmri_part_list=" $2 $1/$2" ;; - 3) fmri_part_list=" $3 $2/$3 $1/$2/$3" ;; - 4) fmri_part_list=" $4 $3/$4 $2/$3/$4 $1/$2/$3/$4" ;; - esac + local -a tmp + if _comp_split -F / tmp "$fmri"; then + set -- "${tmp[@]}" + case $# in + 1) fmri_part_list=" $1" ;; + 2) fmri_part_list=" $2 $1/$2" ;; + 3) fmri_part_list=" $3 $2/$3 $1/$2/$3" ;; + 4) fmri_part_list=" $4 $3/$4 $2/$3/$4 $1/$2/$3/$4" ;; + esac + fi else fmri_part_list="$fmri" fi @@ -62,14 +62,14 @@ _smf_complete_fmri() # we cut them at the first slash for fmri_part in $fmri_part_list; do [[ $fmri_part == $cur* ]] || continue - local first_part=${fmri_part#$cur_prefix} + local first_part=${fmri_part#"$cur_prefix"} first_part=$cur_prefix${first_part%%/*} [[ $first_part != "$fmri_part" ]] && first_part+="/" fmri_list+=" $first_part" done done - COMPREPLY=($fmri_list) + _comp_split COMPREPLY "$fmri_list" # here we want to detect if there only one completion proposed and that # it ends with a slash. That means the users will still have to complete @@ -83,7 +83,7 @@ _smf_complete_fmri() ((i--)) done if ((i == 0)); then - _smf_complete_fmri "${COMPREPLY[0]}" "$prefix" + _comp_cmd_svcadm__fmri "${COMPREPLY[0]}" "$prefix" return fi fi @@ -98,53 +98,54 @@ _smf_complete_fmri() done } -_svcadm() +_comp_cmd_svcadm() { - local cur prev words cword - _init_completion -n : || return + local cur prev words cword comp_args + _comp_initialize -n : -- "$@" || return local command_list="enable disable restart refresh clear mark milestone" - local command i + local command="" i for ((i = 1; i < cword; i++)); do if [[ ${words[i]} == @(enable|disable|restart|refresh|clear|mark|milestone) ]]; then command=${words[i]} + break fi done - if [[ ! -v command ]]; then + if [[ ! $command ]]; then if [[ ${cur} == -* ]]; then - COMPREPLY=($(compgen -W "-v" -- ${cur})) + _comp_compgen -- -W "-v" else - COMPREPLY=($(compgen -W "$command_list" -- ${cur})) + _comp_compgen -- -W "$command_list" fi else if [[ ${cur} == -* ]]; then case "$command" in enable) - COMPREPLY=($(compgen -W "-r -s -t" -- ${cur})) + _comp_compgen -- -W "-r -s -t" ;; disable) - COMPREPLY=($(compgen -W "-s -t" -- ${cur})) + _comp_compgen -- -W "-s -t" ;; mark) - COMPREPLY=($(compgen -W "-I -t" -- ${cur})) + _comp_compgen -- -W "-I -t" ;; milestone) - COMPREPLY=($(compgen -W "-d" -- ${cur})) + _comp_compgen -- -W "-d" ;; esac else - if [[ $command == "mark" ]] && [[ $prev != @(degraded|maintenance) ]]; then - COMPREPLY=($(compgen -W "degraded maintenance" -- ${cur})) + if [[ $command == "mark" && $prev != @(degraded|maintenance) ]]; then + _comp_compgen -- -W "degraded maintenance" elif [[ $command == "milestone" ]]; then - _smf_complete_fmri "${cur}" "svc:/milestone" + _comp_cmd_svcadm__fmri "${cur}" "svc:/milestone" else - _smf_complete_fmri "${cur}" "svc:" + _comp_cmd_svcadm__fmri "${cur}" "svc:" fi fi fi } && - complete -F _svcadm svcadm + complete -F _comp_cmd_svcadm svcadm # ex: filetype=sh |