root / test / py / bash_completion.bash @ 14933c17
History | View | Annotate | Download (5.2 kB)
1 | 92886204 | Michael Hanselmann | #!/bin/bash |
---|---|---|---|
2 | 92886204 | Michael Hanselmann | # |
3 | 92886204 | Michael Hanselmann | |
4 | 92886204 | Michael Hanselmann | # Copyright (C) 2012 Google Inc. |
5 | 92886204 | Michael Hanselmann | # |
6 | 92886204 | Michael Hanselmann | # This program is free software; you can redistribute it and/or modify |
7 | 92886204 | Michael Hanselmann | # it under the terms of the GNU General Public License as published by |
8 | 92886204 | Michael Hanselmann | # the Free Software Foundation; either version 2 of the License, or |
9 | 92886204 | Michael Hanselmann | # (at your option) any later version. |
10 | 92886204 | Michael Hanselmann | # |
11 | 92886204 | Michael Hanselmann | # This program is distributed in the hope that it will be useful, but |
12 | 92886204 | Michael Hanselmann | # WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | 92886204 | Michael Hanselmann | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | 92886204 | Michael Hanselmann | # General Public License for more details. |
15 | 92886204 | Michael Hanselmann | # |
16 | 92886204 | Michael Hanselmann | # You should have received a copy of the GNU General Public License |
17 | 92886204 | Michael Hanselmann | # along with this program; if not, write to the Free Software |
18 | 92886204 | Michael Hanselmann | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
19 | 92886204 | Michael Hanselmann | # 02110-1301, USA. |
20 | 92886204 | Michael Hanselmann | |
21 | 92886204 | Michael Hanselmann | set -e -u -o pipefail |
22 | 92886204 | Michael Hanselmann | |
23 | 92886204 | Michael Hanselmann | # Disable any locales |
24 | 92886204 | Michael Hanselmann | export LC_ALL=C |
25 | 92886204 | Michael Hanselmann | |
26 | 92886204 | Michael Hanselmann | readonly bash_completion=${TOP_BUILDDIR:-.}/doc/examples/bash_completion-debug |
27 | 92886204 | Michael Hanselmann | readonly default_wordbreaks=$' \t\n"'\''@><=;|&(:' |
28 | 92886204 | Michael Hanselmann | |
29 | 92886204 | Michael Hanselmann | err() { |
30 | 92886204 | Michael Hanselmann | echo "$@" |
31 | 92886204 | Michael Hanselmann | echo 'Aborting' |
32 | 92886204 | Michael Hanselmann | exit 1 |
33 | 92886204 | Michael Hanselmann | } |
34 | 92886204 | Michael Hanselmann | |
35 | 92886204 | Michael Hanselmann | contains() { |
36 | 92886204 | Michael Hanselmann | local -r needle="$1"; shift |
37 | 92886204 | Michael Hanselmann | |
38 | 92886204 | Michael Hanselmann | for value; do |
39 | 92886204 | Michael Hanselmann | if [[ "$value" = "$needle" ]]; then |
40 | 92886204 | Michael Hanselmann | return 0 |
41 | 92886204 | Michael Hanselmann | fi |
42 | 92886204 | Michael Hanselmann | done |
43 | 92886204 | Michael Hanselmann | |
44 | 92886204 | Michael Hanselmann | return 1 |
45 | 92886204 | Michael Hanselmann | } |
46 | 92886204 | Michael Hanselmann | |
47 | 92886204 | Michael Hanselmann | # Prepares a subshell for testing bash completion functions |
48 | 92886204 | Michael Hanselmann | setup() { |
49 | 92886204 | Michael Hanselmann | local -r unused=UNUSED |
50 | 92886204 | Michael Hanselmann | |
51 | 92886204 | Michael Hanselmann | set +e +u -o pipefail |
52 | 92886204 | Michael Hanselmann | |
53 | 92886204 | Michael Hanselmann | . $bash_completion |
54 | 92886204 | Michael Hanselmann | |
55 | 92886204 | Michael Hanselmann | COMP_KEY=$unused |
56 | 92886204 | Michael Hanselmann | COMP_LINE=$unused |
57 | 92886204 | Michael Hanselmann | COMP_POINT=$unused |
58 | 92886204 | Michael Hanselmann | COMP_TYPE=$unused |
59 | 92886204 | Michael Hanselmann | COMP_WORDBREAKS="$default_wordbreaks" |
60 | 92886204 | Michael Hanselmann | |
61 | 92886204 | Michael Hanselmann | GANETI_COMPL_LOG= |
62 | 92886204 | Michael Hanselmann | |
63 | 92886204 | Michael Hanselmann | unset COMP_CWORD |
64 | 92886204 | Michael Hanselmann | unset COMP_WORDS |
65 | 92886204 | Michael Hanselmann | } |
66 | 92886204 | Michael Hanselmann | |
67 | 92886204 | Michael Hanselmann | # Check if default wordbreaks are still valid (this detects cases where Bash |
68 | 92886204 | Michael Hanselmann | # were to change its built-in default value) |
69 | 92886204 | Michael Hanselmann | # TODO: May need an update for older Bash versions; some didn't include the |
70 | 92886204 | Michael Hanselmann | # colon character (':') in COMP_WORDBREAKS |
71 | 92886204 | Michael Hanselmann | ( |
72 | 92886204 | Michael Hanselmann | bashdef=$(env - bash --noprofile --norc -c 'echo -n "$COMP_WORDBREAKS"') |
73 | 92886204 | Michael Hanselmann | case "$bashdef" in |
74 | 92886204 | Michael Hanselmann | $default_wordbreaks) ;; |
75 | 92886204 | Michael Hanselmann | *) |
76 | 92886204 | Michael Hanselmann | err 'Bash uses unknown value for COMP_WORDBREAKS' |
77 | 92886204 | Michael Hanselmann | ;; |
78 | 92886204 | Michael Hanselmann | esac |
79 | 92886204 | Michael Hanselmann | ) |
80 | 92886204 | Michael Hanselmann | |
81 | 92886204 | Michael Hanselmann | # Check for --help |
82 | 92886204 | Michael Hanselmann | for cmd in gnt-{instance,node,group,job}; do |
83 | 92886204 | Michael Hanselmann | ( |
84 | 92886204 | Michael Hanselmann | setup |
85 | 92886204 | Michael Hanselmann | COMP_CWORD=2 |
86 | 92886204 | Michael Hanselmann | COMP_WORDS=( $cmd list - ) |
87 | 92886204 | Michael Hanselmann | _${cmd/-/_} |
88 | 92886204 | Michael Hanselmann | contains --help "${COMPREPLY[@]}" || \ |
89 | 92886204 | Michael Hanselmann | err "'$cmd list' did not list --help as an option" |
90 | 92886204 | Michael Hanselmann | ) |
91 | 92886204 | Michael Hanselmann | done |
92 | 92886204 | Michael Hanselmann | |
93 | 92886204 | Michael Hanselmann | # Completing a yes/no option |
94 | 92886204 | Michael Hanselmann | ( |
95 | 92886204 | Michael Hanselmann | setup |
96 | 92886204 | Michael Hanselmann | COMP_CWORD=3 |
97 | 92886204 | Michael Hanselmann | COMP_WORDS=( gnt-node modify --drained ) |
98 | 92886204 | Michael Hanselmann | _gnt_node |
99 | 92886204 | Michael Hanselmann | if [[ "${COMPREPLY[*]}" != 'no yes' ]]; then |
100 | 92886204 | Michael Hanselmann | err "Completing '${COMP_WORDS[@]}' did not give correct result" |
101 | 92886204 | Michael Hanselmann | fi |
102 | 92886204 | Michael Hanselmann | ) |
103 | 92886204 | Michael Hanselmann | |
104 | 92886204 | Michael Hanselmann | # Completing a multiple-choice option |
105 | 92886204 | Michael Hanselmann | ( |
106 | 92886204 | Michael Hanselmann | setup |
107 | 92886204 | Michael Hanselmann | COMP_CWORD=2 |
108 | 92886204 | Michael Hanselmann | COMP_WORDS=( gnt-debug allocator --disk-template=sh foo ) |
109 | 92886204 | Michael Hanselmann | _gnt_debug |
110 | 92886204 | Michael Hanselmann | if [[ "${COMPREPLY[*]}" != sharedfile ]]; then |
111 | 92886204 | Michael Hanselmann | err "Completing '${COMP_WORDS[*]}' did not give correct result" |
112 | 92886204 | Michael Hanselmann | fi |
113 | 92886204 | Michael Hanselmann | ) |
114 | 92886204 | Michael Hanselmann | |
115 | 92886204 | Michael Hanselmann | # Completing a node name |
116 | 92886204 | Michael Hanselmann | ( |
117 | 92886204 | Michael Hanselmann | setup |
118 | 92886204 | Michael Hanselmann | |
119 | 92886204 | Michael Hanselmann | # Override built-in function |
120 | 92886204 | Michael Hanselmann | _ganeti_nodes() { |
121 | 92886204 | Michael Hanselmann | echo aanode1 bbnode2 aanode3 |
122 | 92886204 | Michael Hanselmann | } |
123 | 92886204 | Michael Hanselmann | |
124 | 92886204 | Michael Hanselmann | COMP_CWORD=4 |
125 | 92886204 | Michael Hanselmann | COMP_WORDS=( gnt-node modify --drained yes aa ) |
126 | 92886204 | Michael Hanselmann | _gnt_node |
127 | 92886204 | Michael Hanselmann | if [[ "${COMPREPLY[*]}" != 'aanode1 aanode3' ]]; then |
128 | 92886204 | Michael Hanselmann | err 'Completing node names failed' |
129 | 92886204 | Michael Hanselmann | fi |
130 | 92886204 | Michael Hanselmann | ) |
131 | 92886204 | Michael Hanselmann | |
132 | 92886204 | Michael Hanselmann | # Completing an option when it's not at the end |
133 | 92886204 | Michael Hanselmann | ( |
134 | 92886204 | Michael Hanselmann | setup |
135 | 92886204 | Michael Hanselmann | |
136 | 92886204 | Michael Hanselmann | # Override built-in function |
137 | 92886204 | Michael Hanselmann | _ganeti_instances() { |
138 | 92886204 | Michael Hanselmann | echo inst{1..5} |
139 | 92886204 | Michael Hanselmann | } |
140 | 92886204 | Michael Hanselmann | |
141 | 92886204 | Michael Hanselmann | # Completing word in the middle |
142 | 92886204 | Michael Hanselmann | COMP_CWORD=2 |
143 | 92886204 | Michael Hanselmann | COMP_WORDS=( gnt-instance list --o inst3 inst inst5 ) |
144 | 92886204 | Michael Hanselmann | _gnt_node |
145 | 92886204 | Michael Hanselmann | contains --output "${COMPREPLY[@]}" || err 'Did not complete parameter' |
146 | 92886204 | Michael Hanselmann | ) |
147 | 92886204 | Michael Hanselmann | |
148 | 92886204 | Michael Hanselmann | # Completing an instance name |
149 | 92886204 | Michael Hanselmann | ( |
150 | 92886204 | Michael Hanselmann | setup |
151 | 92886204 | Michael Hanselmann | |
152 | 92886204 | Michael Hanselmann | # Override built-in function |
153 | 92886204 | Michael Hanselmann | _ganeti_instances() { |
154 | 92886204 | Michael Hanselmann | echo inst{1..5} |
155 | 92886204 | Michael Hanselmann | } |
156 | 92886204 | Michael Hanselmann | |
157 | 92886204 | Michael Hanselmann | # Completing word in the middle |
158 | 92886204 | Michael Hanselmann | COMP_CWORD=5 |
159 | 92886204 | Michael Hanselmann | COMP_WORDS=( gnt-instance list -o foobar inst1 inst inst5 ) |
160 | 92886204 | Michael Hanselmann | _gnt_instance |
161 | 92886204 | Michael Hanselmann | if [[ "${COMPREPLY[*]}" != "$(echo inst{1..5})" ]]; then |
162 | 92886204 | Michael Hanselmann | err "Completing '${COMP_WORDS[*]}' did not give correct result" |
163 | 92886204 | Michael Hanselmann | fi |
164 | 92886204 | Michael Hanselmann | ) |
165 | 92886204 | Michael Hanselmann | |
166 | 92886204 | Michael Hanselmann | # Need to test node expansion with different wordbreak settings |
167 | 92886204 | Michael Hanselmann | [[ "$default_wordbreaks" == *:* ]] || \ |
168 | 92886204 | Michael Hanselmann | err 'No colon in default wordbreak characters' |
169 | 92886204 | Michael Hanselmann | for wb in "$default_wordbreaks" "${default_wordbreaks/:/}"; do |
170 | 92886204 | Michael Hanselmann | ( |
171 | 92886204 | Michael Hanselmann | setup |
172 | 92886204 | Michael Hanselmann | |
173 | 92886204 | Michael Hanselmann | # Override built-in function |
174 | 92886204 | Michael Hanselmann | _ganeti_nodes() { |
175 | 92886204 | Michael Hanselmann | echo node{A..C} |
176 | 92886204 | Michael Hanselmann | } |
177 | 92886204 | Michael Hanselmann | |
178 | 92886204 | Michael Hanselmann | COMP_WORDBREAKS="$wb" |
179 | 92886204 | Michael Hanselmann | |
180 | 92886204 | Michael Hanselmann | # Completing nodes |
181 | 92886204 | Michael Hanselmann | COMP_CWORD=3 |
182 | 92886204 | Michael Hanselmann | COMP_WORDS=( gnt-instance add -n ) |
183 | 92886204 | Michael Hanselmann | _gnt_instance |
184 | 92886204 | Michael Hanselmann | if [[ "${COMPREPLY[*]}" != 'nodeA nodeA: nodeB nodeB: nodeC nodeC:' ]]; then |
185 | 92886204 | Michael Hanselmann | err 'Got wrong node list' |
186 | 92886204 | Michael Hanselmann | fi |
187 | 92886204 | Michael Hanselmann | |
188 | 92886204 | Michael Hanselmann | COMP_CWORD=3 |
189 | 92886204 | Michael Hanselmann | COMP_WORDS=( gnt-instance add -n nodeB ) |
190 | 92886204 | Michael Hanselmann | _gnt_instance |
191 | 92886204 | Michael Hanselmann | if [[ "${COMPREPLY[*]}" != 'nodeB nodeB:' ]]; then |
192 | 92886204 | Michael Hanselmann | err 'Got wrong node list' |
193 | 92886204 | Michael Hanselmann | fi |
194 | 92886204 | Michael Hanselmann | |
195 | 92886204 | Michael Hanselmann | COMP_CWORD=3 |
196 | 92886204 | Michael Hanselmann | COMP_WORDS=( gnt-instance add -n nodeC: ) |
197 | 92886204 | Michael Hanselmann | _gnt_instance |
198 | 92886204 | Michael Hanselmann | if [[ "$COMP_WORDBREAKS" == *:* ]]; then |
199 | 92886204 | Michael Hanselmann | expected='nodeA nodeB' |
200 | 92886204 | Michael Hanselmann | else |
201 | 92886204 | Michael Hanselmann | expected='nodeC:nodeA nodeC:nodeB' |
202 | 92886204 | Michael Hanselmann | fi |
203 | 92886204 | Michael Hanselmann | if [[ "${COMPREPLY[*]}" != "$expected" ]]; then |
204 | 92886204 | Michael Hanselmann | err 'Got wrong node list' |
205 | 92886204 | Michael Hanselmann | fi |
206 | 92886204 | Michael Hanselmann | ) |
207 | 92886204 | Michael Hanselmann | done |
208 | 92886204 | Michael Hanselmann | |
209 | 92886204 | Michael Hanselmann | # Need to test different settings for the extglob shell option |
210 | 92886204 | Michael Hanselmann | for opt in -u -s; do |
211 | 92886204 | Michael Hanselmann | verify_extglob() { |
212 | 92886204 | Michael Hanselmann | if [[ "$(shopt -p extglob)" != "shopt $opt extglob" ]]; then |
213 | 92886204 | Michael Hanselmann | err 'The "extglob" shell option has an unexpected value' |
214 | 92886204 | Michael Hanselmann | fi |
215 | 92886204 | Michael Hanselmann | } |
216 | 92886204 | Michael Hanselmann | |
217 | 92886204 | Michael Hanselmann | ( |
218 | 92886204 | Michael Hanselmann | shopt $opt extglob |
219 | 92886204 | Michael Hanselmann | |
220 | 92886204 | Michael Hanselmann | verify_extglob |
221 | 92886204 | Michael Hanselmann | setup |
222 | 92886204 | Michael Hanselmann | verify_extglob |
223 | 92886204 | Michael Hanselmann | |
224 | 92886204 | Michael Hanselmann | # Completing nodes |
225 | 92886204 | Michael Hanselmann | COMP_CWORD=4 |
226 | 92886204 | Michael Hanselmann | COMP_WORDS=( gnt-instance add --os-type busybox --no-n ) |
227 | 92886204 | Michael Hanselmann | _gnt_instance |
228 | 92886204 | Michael Hanselmann | if [[ "${COMPREPLY[*]}" != '--no-name-check --no-nics' ]]; then |
229 | 92886204 | Michael Hanselmann | err "Completing '${COMP_WORDS[*]}' did not give correct result" |
230 | 92886204 | Michael Hanselmann | fi |
231 | 92886204 | Michael Hanselmann | verify_extglob |
232 | 92886204 | Michael Hanselmann | ) |
233 | 92886204 | Michael Hanselmann | done |
234 | 92886204 | Michael Hanselmann | |
235 | 92886204 | Michael Hanselmann | exit 0 |