chiark / gitweb /
Merge branch 'p1' into 'master'
[fdroidserver.git] / completion / bash-completion
1 #!/bin/bash
2 #
3 # bash-completion - part of the FDroid server tools
4 # Bash completion for the fdroid main tools
5 #
6 # Copyright (C) 2013, 2014 Daniel Martí <mvdan@mvdan.cc>
7 #
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU Affero General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 # GNU Affero General Public License for more details.
17 #
18 # You should have received a copy of the GNU Affero General Public License
19 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
21 # 'fdroid' is completed automatically, but aliases to it are not.
22 # For instance, to alias 'fd' to 'fdroid' and have competion available:
23 #
24 #       alias fd='fdroid'
25 #       complete -F _fdroid fd
26 #
27 # One can use completion on aliased subcommands as follows:
28 #
29 #       alias fbuild='fdroid build'
30 #       complete -F _fdroid_build fbuild
31
32 __fdroid_init() {
33         COMPREPLY=()
34         cur="${COMP_WORDS[COMP_CWORD]}"
35         prev="${COMP_WORDS[COMP_CWORD-1]}"
36
37         (( $# >= 1 )) && __complete_${1}
38 }
39
40 __by_ext() {
41         local ext="$1"
42         files=( metadata/*.$ext )
43         files=( ${files[@]#metadata/} )
44         files=${files[@]%.$ext}
45         echo "$files"
46 }
47
48 __package() {
49         files="$(__by_ext txt) $(__by_ext yaml) $(__by_ext json) $(__by_ext xml)"
50         COMPREPLY=( $( compgen -W "$files" -- $cur ) )
51 }
52
53 __apk_package() {
54         files=( ${1}/*.apk )
55         [ -f "${files[0]}" ] || return
56
57         files=( ${files[@]#*/} )
58         files=${files[@]%_*}
59         COMPREPLY=( $( compgen -W "$files" -- $cur ) )
60 }
61
62 __apk_vercode() {
63         local p=${cur:0:-1}
64
65         files=( ${1}/${p}_*.apk )
66         [ -f "${files[0]}" ] || return
67
68         files=( ${files[@]#*_} )
69         files=${files[@]%.apk}
70         COMPREPLY=( $( compgen -P "${p}:" -W "$files" -- $cur ) )
71 }
72
73 __vercode() {
74         local p v
75         echo $cur | IFS=':' read p v
76
77         COMPREPLY=( $( compgen -P "${p}:" -W "$( while read line; do
78                 if [[ "$line" == "Build Version:"* ]]
79                 then
80                         line="${line#*,}"
81                         printf "${line%%,*} "
82                 elif [[ "$line" == "Build:"* ]]
83                 then
84                         line="${line#*,}"
85                         printf "${line%%,*} "
86                 fi
87                 done < "metadata/${p}.txt" )" -- $cur ) )
88 }
89
90 __complete_options() {
91         case "${cur}" in
92                 --*)
93                         COMPREPLY=( $( compgen -W "--help --version ${lopts}" -- $cur ) )
94                         return 0;;
95                 *)
96                         COMPREPLY=( $( compgen -W "-h ${opts} --help --version ${lopts}" -- $cur ) )
97                         return 0;;
98         esac
99 }
100
101 __complete_build() {
102         opts="-v -q -l -s -t -f -a -w"
103
104         lopts="--verbose --quiet --latest --stop --test --server --resetserver
105  --on-server --skip-scan --no-tarball --force --all --wiki --no-refresh"
106         case "${cur}" in
107                 -*)
108                         __complete_options
109                         return 0;;
110                 *:*)
111                         __vercode
112                         return 0;;
113                 *)
114                         __package
115                         return 0;;
116         esac
117 }
118
119 __complete_install() {
120         opts="-v -q"
121         lopts="--verbose --quiet --all"
122         case "${cur}" in
123                 -*)
124                         __complete_options
125                         return 0;;
126                 *:)
127                         __apk_vercode repo
128                         return 0;;
129                 *)
130                         __apk_package repo
131                         return 0;;
132         esac
133 }
134
135 __complete_update() {
136         opts="-c -v -q -b -i -I -e -w"
137         lopts="--create-metadata --verbose --quiet --buildreport
138  --interactive --icons --editor --wiki --pretty --clean --delete-unknown
139  --nosign --use-date-from-apk"
140         case "${prev}" in
141                 -e|--editor)
142                         _filedir
143                         return 0;;
144         esac
145         __complete_options
146 }
147
148 __complete_publish() {
149         opts="-v -q"
150         lopts="--verbose --quiet"
151         case "${cur}" in
152                 -*)
153                         __complete_options
154                         return 0;;
155                 *:)
156                         __apk_vercode unsigned
157                         return 0;;
158                 *)
159                         __apk_package unsigned
160                         return 0;;
161         esac
162 }
163
164 __complete_checkupdates() {
165         opts="-v -q"
166         lopts="--verbose --quiet --auto --autoonly --commit --gplay"
167         case "${cur}" in
168                 -*)
169                         __complete_options
170                         return 0;;
171                 *)
172                         __package
173                         return 0;;
174         esac
175 }
176
177 __complete_import() {
178         opts="-u -s -q"
179         lopts="--url --subdir --rev --quiet"
180         case "${prev}" in
181                 -u|--url|-s|--subdir|--rev) return 0;;
182         esac
183         __complete_options
184 }
185
186 __complete_readmeta() {
187         opts="-v -q"
188         lopts="--verbose --quiet"
189         __complete_options
190 }
191
192 __complete_rewritemeta() {
193         opts="-v -q -l"
194         lopts="--verbose --quiet --list"
195         case "${cur}" in
196                 -*)
197                         __complete_options
198                         return 0;;
199                 *)
200                         __package
201                         return 0;;
202         esac
203 }
204
205 __complete_lint() {
206         opts="-v -q"
207         lopts="--verbose --quiet"
208         case "${cur}" in
209                 -*)
210                         __complete_options
211                         return 0;;
212                 *)
213                         __package
214                         return 0;;
215         esac
216 }
217
218 __complete_scanner() {
219         opts="-v -q"
220         lopts="--verbose --quiet"
221         case "${cur}" in
222                 -*)
223                         __complete_options
224                         return 0;;
225                 *:)
226                         __vercode
227                         return 0;;
228                 *)
229                         __package
230                         return 0;;
231         esac
232 }
233
234 __complete_verify() {
235         opts="-v -q -p"
236         lopts="--verbose --quiet"
237         case "${cur}" in
238                 -*)
239                         __complete_options
240                         return 0;;
241                 *:)
242                         __vercode
243                         return 0;;
244                 *)
245                         __package
246                         return 0;;
247         esac
248 }
249
250 __complete_stats() {
251         opts="-v -q -d"
252         lopts="--verbose --quiet --download"
253         __complete_options
254 }
255
256 __complete_server() {
257         opts="-i -v -q"
258         lopts="--identity-file --local-copy-dir --sync-from-local-copy-dir
259  --verbose --quiet --no-checksum update"
260         __complete_options
261 }
262
263 __complete_signindex() {
264         opts="-v -q"
265         lopts="--verbose"
266         __complete_options
267 }
268
269 __complete_init() {
270         opts="-v -q -d"
271         lopts="--verbose --quiet --distinguished-name --keystore
272  --repo-keyalias --android-home --no-prompt"
273         __complete_options
274 }
275
276 __cmds=" build init install update publish checkupdates import readmeta \
277 rewritemeta lint scanner verify stats server signindex "
278
279 for c in $__cmds; do
280         eval "_fdroid_${c} () {
281                 local cur prev opts lopts
282                 __fdroid_init ${c}
283         }"
284 done
285
286 _fdroid() {
287         local cmd
288         cmd=${COMP_WORDS[1]}
289
290         [[ $__cmds == *\ $cmd\ * ]] && _fdroid_${cmd} || {
291                 (($COMP_CWORD == 1)) && COMPREPLY=( $( compgen -W "${__cmds}" -- $cmd ) )
292         }
293 }
294
295 _fd-commit() {
296         __package
297 }
298
299 complete -F _fdroid fdroid
300 complete -F _fd-commit fd-commit
301
302 return 0