Statistics
| Branch: | Tag: | Revision:

root / test / py / bash_completion.bash @ 91c17910

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