chiark / gitweb /
ef219122e6241f65b8be0d5254176928268c7671
[fdroidserver.git] / completion / bash-completion
1 # fdroid(1) completion                                   -*- shell-script -*-
2 #
3 # bash-completion - part of the FDroid server tools
4 #
5 # Copyright (C) 2013-2017 Hans-Christoph Steiner <hans@eds.org>
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_init() {
22         COMPREPLY=()
23         cur="${COMP_WORDS[COMP_CWORD]}"
24         prev="${COMP_WORDS[COMP_CWORD-1]}"
25
26         (( $# >= 1 )) && __complete_${1}
27 }
28
29 __by_ext() {
30         local ext="$1"
31         files=( metadata/*.$ext )
32         files=( ${files[@]#metadata/} )
33         files=${files[@]%.$ext}
34         echo "$files"
35 }
36
37 __package() {
38         files="$(__by_ext txt) $(__by_ext yaml) $(__by_ext json) $(__by_ext xml)"
39         COMPREPLY=( $( compgen -W "$files" -- $cur ) )
40 }
41
42 __apk_package() {
43         files=( ${1}/*.apk )
44         [ -f "${files[0]}" ] || return
45
46         files=( ${files[@]#*/} )
47         files=${files[@]%_*}
48         COMPREPLY=( $( compgen -W "$files" -- $cur ) )
49 }
50
51 __apk_vercode() {
52         local p=${cur:0:-1}
53
54         files=( ${1}/${p}_*.apk )
55         [ -f "${files[0]}" ] || return
56
57         files=( ${files[@]#*_} )
58         files=${files[@]%.apk}
59         COMPREPLY=( $( compgen -P "${p}:" -W "$files" -- $cur ) )
60 }
61
62 __vercode() {
63         local p v
64         echo $cur | IFS=':' read p v
65
66         COMPREPLY=( $( compgen -P "${p}:" -W "$( while read line; do
67                 if [[ "$line" == "Build Version:"* ]]
68                 then
69                         line="${line#*,}"
70                         printf "${line%%,*} "
71                 elif [[ "$line" == "Build:"* ]]
72                 then
73                         line="${line#*,}"
74                         printf "${line%%,*} "
75                 fi
76                 done < "metadata/${p}.txt" )" -- $cur ) )
77 }
78
79 __complete_options() {
80         case "${cur}" in
81                 --*)
82                         COMPREPLY=( $( compgen -W "--help --version ${lopts}" -- $cur ) )
83                         return 0;;
84                 *)
85                         COMPREPLY=( $( compgen -W "-h ${opts} --help --version ${lopts}" -- $cur ) )
86                         return 0;;
87         esac
88 }
89
90 __complete_build() {
91         opts="-v -q -l -s -t -f -a -w"
92
93         lopts="--verbose --quiet --latest --stop --test --server --resetserver
94  --on-server --skip-scan --no-tarball --force --all --wiki --no-refresh"
95         case "${cur}" in
96                 -*)
97                         __complete_options
98                         return 0;;
99                 *:*)
100                         __vercode
101                         return 0;;
102                 *)
103                         __package
104                         return 0;;
105         esac
106 }
107
108 __complete_dscanner() {
109         opts="-v -q -l"
110         lopts="--verbose --quiet --clean-after --clean-before --clean-only --init-only --latest --repo-path"
111         case "${cur}" in
112                 -*)
113                         __complete_options
114                         return 0;;
115                 *:)
116                         __vercode
117                         return 0;;
118                 *)
119                         __package
120                         return 0;;
121         esac
122 }
123
124 __complete_gpgsign() {
125         opts="-v -q"
126         lopts="--verbose --quiet"
127         __complete_options
128 }
129
130 __complete_install() {
131         opts="-v -q"
132         lopts="--verbose --quiet --all"
133         case "${cur}" in
134                 -*)
135                         __complete_options
136                         return 0;;
137                 *:)
138                         __apk_vercode repo
139                         return 0;;
140                 *)
141                         __apk_package repo
142                         return 0;;
143         esac
144 }
145
146 __complete_update() {
147         opts="-c -v -q -b -i -I -e -w"
148         lopts="--create-metadata --verbose --quiet --buildreport
149  --interactive --icons --editor --wiki --pretty --clean --delete-unknown
150  --nosign --rename-apks --use-date-from-apk"
151         case "${prev}" in
152                 -e|--editor)
153                         _filedir
154                         return 0;;
155         esac
156         __complete_options
157 }
158
159 __complete_publish() {
160         opts="-v -q"
161         lopts="--verbose --quiet"
162         case "${cur}" in
163                 -*)
164                         __complete_options
165                         return 0;;
166                 *:)
167                         __apk_vercode unsigned
168                         return 0;;
169                 *)
170                         __apk_package unsigned
171                         return 0;;
172         esac
173 }
174
175 __complete_checkupdates() {
176         opts="-v -q"
177         lopts="--verbose --quiet --auto --autoonly --commit --gplay"
178         case "${cur}" in
179                 -*)
180                         __complete_options
181                         return 0;;
182                 *)
183                         __package
184                         return 0;;
185         esac
186 }
187
188 __complete_import() {
189         opts="-u -s -q"
190         lopts="--url --subdir --rev --quiet"
191         case "${prev}" in
192                 -u|--url|-s|--subdir|--rev) return 0;;
193         esac
194         __complete_options
195 }
196
197 __complete_readmeta() {
198         opts="-v -q"
199         lopts="--verbose --quiet"
200         __complete_options
201 }
202
203 __complete_rewritemeta() {
204         opts="-v -q -l"
205         lopts="--verbose --quiet --list"
206         case "${cur}" in
207                 -*)
208                         __complete_options
209                         return 0;;
210                 *)
211                         __package
212                         return 0;;
213         esac
214 }
215
216 __complete_lint() {
217         opts="-v -q"
218         lopts="--verbose --quiet"
219         case "${cur}" in
220                 -*)
221                         __complete_options
222                         return 0;;
223                 *)
224                         __package
225                         return 0;;
226         esac
227 }
228
229 __complete_scanner() {
230         opts="-v -q"
231         lopts="--verbose --quiet"
232         case "${cur}" in
233                 -*)
234                         __complete_options
235                         return 0;;
236                 *:)
237                         __vercode
238                         return 0;;
239                 *)
240                         __package
241                         return 0;;
242         esac
243 }
244
245 __complete_verify() {
246         opts="-v -q -p"
247         lopts="--verbose --quiet"
248         case "${cur}" in
249                 -*)
250                         __complete_options
251                         return 0;;
252                 *:)
253                         __vercode
254                         return 0;;
255                 *)
256                         __package
257                         return 0;;
258         esac
259 }
260
261 __complete_btlog() {
262         opts="-u"
263         lopts="--git-remote --git-repo --url"
264         __complete_options
265 }
266
267 __complete_stats() {
268         opts="-v -q -d"
269         lopts="--verbose --quiet --download"
270         __complete_options
271 }
272
273 __complete_server() {
274         opts="-i -v -q"
275         lopts="--identity-file --local-copy-dir --sync-from-local-copy-dir
276  --verbose --quiet --no-checksum update"
277         __complete_options
278 }
279
280 __complete_signatures() {
281         opts="-v -q"
282         lopts="--verbose --no-check-https"
283         case "${cur}" in
284                 -*)
285                         __complete_options
286                         return 0;;
287         esac
288 }
289
290 __complete_signindex() {
291         opts="-v -q"
292         lopts="--verbose"
293         __complete_options
294 }
295
296 __complete_init() {
297         opts="-v -q -d"
298         lopts="--verbose --quiet --distinguished-name --keystore
299  --repo-keyalias --android-home --no-prompt"
300         __complete_options
301 }
302
303 __cmds="
304 btlog
305 build
306 checkupdates
307 dscanner
308 gpgsign
309 import
310 init
311 install
312 lint
313 publish
314 readmeta
315 rewritemeta
316 scanner
317 server
318 signatures
319 signindex
320 stats
321 update
322 verify
323 "
324
325 for c in $__cmds; do
326         eval "_fdroid_${c} () {
327                 local cur prev opts lopts
328                 __fdroid_init ${c}
329         }"
330 done
331
332 _fdroid() {
333         local cmd
334         cmd=${COMP_WORDS[1]}
335
336         [[ $__cmds == *\ $cmd\ * ]] && _fdroid_${cmd} || {
337                 (($COMP_CWORD == 1)) && COMPREPLY=( $( compgen -W "${__cmds}" -- $cmd ) )
338         }
339 }
340
341 _fd-commit() {
342         __package
343 }
344
345 complete -F _fdroid fdroid
346 complete -F _fd-commit fd-commit
347
348 return 0