# msiinfo bash completion __msiinfo_all_commands () { local i IFS=" "$'\n' for i in $(msiinfo --help | grep "^ [^-]" | cut -d' ' -f 3) do case $i in *) echo $i;; esac done } __msiinfo_commands= __msiinfo_commands="$(__msiinfo_all_commands 2>/dev/null)" _msiinfo () { COMPREPLY=() in_array() { local i for i in $2; do [[ $i = $1 ]] && return 0 done return 1 } local cur prev # _get_comp_words_by_ref is in bash-completion >= 1.2, which EL-5 lacks. if type _get_comp_words_by_ref &>/dev/null; then _get_comp_words_by_ref cur prev else cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" fi # parse main options and get command local options="--help --version" local command= local command_first= local path= local i w for (( i = 0; i < ${#COMP_WORDS[*]} - 1; i++ )); do w="${COMP_WORDS[$i]}" # command if in_array "$w" "$__msiinfo_commands"; then command="$w" command_first=$((i+1)) break fi done # complete base options if [[ -z $command ]]; then if [[ $cur == -* ]]; then COMPREPLY=( $(compgen -W "$options $options_value" -- "$cur") ) return 0 fi case "$prev" in *) COMPREPLY=( $(compgen -W "$__msiinfo_commands" -- "$cur") ) ;; esac return 0 fi local after= after_more= case $command in streams|tables|extract|export|suminfo) after="msi" ;; esac local all_options="--help $options" local all_options_value="" # count non-option parameters local i w local last_option= local after_counter=0 local after_word= for (( i = $command_first; i < ${#COMP_WORDS[*]} - 1; i++)); do w="${COMP_WORDS[$i]}" if [[ ${w:0:1} = - ]]; then if in_array "$w" "$all_options"; then last_option="$w" continue elif in_array "$w" "$all_options_value"; then last_option="$w" ((i++)) continue fi else last_word="$w" fi in_array "$last_option" "$options_arches" || ((after_counter++)) done local after_options= if [[ $after_counter -eq 0 ]] || [[ $after_more = true ]]; then case $after in msi) _filedir msi;; esac fi if [[ $after_counter -eq 1 ]]; then case $command in extract) after_options="$(msiinfo streams "$last_word")" ;; export) after_options="$(msiinfo tables "$last_word")" ;; esac fi if [[ $cur != -* ]]; then all_options= all_options_value= fi COMPREPLY+=( $(compgen -W "$all_options $all_options_value $after_options" -- "$cur" ) ) return 0 } _msibuild () { local cur="${COMP_WORDS[COMP_CWORD]}" case "$cur" in -*) COMPREPLY=( $(compgen -W "-s -q -i -a" -- "$cur" ) ) return 0 ;; esac } complete -o default -o nospace -F _msiinfo msiinfo complete -o default -o nospace -F _msibuild msibuild