Skip to content

Commit c2d1447

Browse files
elmarcobonzini
authored andcommitted
Add msitools bash completion
1 parent 386321c commit c2d1447

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed

msitools-completion.sh

+143
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# msiinfo bash completion
2+
3+
__msiinfo_all_commands ()
4+
{
5+
local i IFS=" "$'\n'
6+
for i in $(msiinfo --help | grep "^ [^-]" | cut -d' ' -f 3)
7+
do
8+
case $i in
9+
*) echo $i;;
10+
esac
11+
done
12+
}
13+
__msiinfo_commands=
14+
__msiinfo_commands="$(__msiinfo_all_commands 2>/dev/null)"
15+
16+
_msiinfo ()
17+
{
18+
COMPREPLY=()
19+
20+
in_array()
21+
{
22+
local i
23+
for i in $2; do
24+
[[ $i = $1 ]] && return 0
25+
done
26+
return 1
27+
}
28+
29+
local cur prev
30+
# _get_comp_words_by_ref is in bash-completion >= 1.2, which EL-5 lacks.
31+
if type _get_comp_words_by_ref &>/dev/null; then
32+
_get_comp_words_by_ref cur prev
33+
else
34+
cur="${COMP_WORDS[COMP_CWORD]}"
35+
prev="${COMP_WORDS[COMP_CWORD-1]}"
36+
fi
37+
38+
# parse main options and get command
39+
40+
local options="--help --version"
41+
local command=
42+
local command_first=
43+
local path=
44+
45+
local i w
46+
for (( i = 0; i < ${#COMP_WORDS[*]} - 1; i++ )); do
47+
w="${COMP_WORDS[$i]}"
48+
# command
49+
if in_array "$w" "$__msiinfo_commands"; then
50+
command="$w"
51+
command_first=$((i+1))
52+
break
53+
fi
54+
done
55+
56+
# complete base options
57+
58+
if [[ -z $command ]]; then
59+
if [[ $cur == -* ]]; then
60+
COMPREPLY=( $(compgen -W "$options $options_value" -- "$cur") )
61+
return 0
62+
fi
63+
64+
case "$prev" in
65+
*)
66+
COMPREPLY=( $(compgen -W "$__msiinfo_commands" -- "$cur") )
67+
;;
68+
esac
69+
70+
return 0
71+
fi
72+
73+
local after= after_more=
74+
case $command in
75+
streams|tables|extract|export|suminfo)
76+
after="msi"
77+
;;
78+
esac
79+
80+
local all_options="--help $options"
81+
local all_options_value=""
82+
83+
# count non-option parameters
84+
85+
local i w
86+
local last_option=
87+
local after_counter=0
88+
local after_word=
89+
for (( i = $command_first; i < ${#COMP_WORDS[*]} - 1; i++)); do
90+
w="${COMP_WORDS[$i]}"
91+
if [[ ${w:0:1} = - ]]; then
92+
if in_array "$w" "$all_options"; then
93+
last_option="$w"
94+
continue
95+
elif in_array "$w" "$all_options_value"; then
96+
last_option="$w"
97+
((i++))
98+
continue
99+
fi
100+
else
101+
last_word="$w"
102+
fi
103+
in_array "$last_option" "$options_arches" || ((after_counter++))
104+
done
105+
106+
local after_options=
107+
if [[ $after_counter -eq 0 ]] || [[ $after_more = true ]]; then
108+
case $after in
109+
msi) _filedir msi;;
110+
esac
111+
fi
112+
if [[ $after_counter -eq 1 ]]; then
113+
case $command in
114+
extract)
115+
after_options="$(msiinfo streams "$last_word")" ;;
116+
export)
117+
after_options="$(msiinfo tables "$last_word")" ;;
118+
esac
119+
fi
120+
121+
if [[ $cur != -* ]]; then
122+
all_options=
123+
all_options_value=
124+
fi
125+
126+
COMPREPLY+=( $(compgen -W "$all_options $all_options_value $after_options" -- "$cur" ) )
127+
128+
return 0
129+
}
130+
131+
_msibuild ()
132+
{
133+
local cur="${COMP_WORDS[COMP_CWORD]}"
134+
case "$cur" in
135+
-*)
136+
COMPREPLY=( $(compgen -W "-s -q -i -a" -- "$cur" ) )
137+
return 0
138+
;;
139+
esac
140+
}
141+
142+
complete -o default -o nospace -F _msiinfo msiinfo
143+
complete -o default -o nospace -F _msibuild msibuild

0 commit comments

Comments
 (0)