chiark / gitweb /
Better parsing of args, install now works as it should
[fdroidserver.git] / completion / bash-completion
1 #!/bin/bash
2 #
3 # fdroid completion support.
4 #
5 # 'fdroid' is aliased automatically, but aliases to it are not. For instance,
6 # to alias 'fd' to 'fdroid' and have competion available:
7 #
8 #       alias fd='fdroid'
9 #       complete -F _fdroid fd
10 #
11 # One can use completion on aliased subcommands as follows:
12 #
13 #       alias fbuild='fdroid build'
14 #       complete -F _fdroid_build fbuild
15 #
16 # There are also completion function for '-p com.some.app' aliases:
17 #
18 #       alias fbld='fdroid build -v -l -p'
19 #       complete -F _fdroid_build_project fbld
20 #
21 #       alias fcheckup='fdroid checkupdates -v -p'
22 #       complete -F _fdroid_checkupdates_project fcheckup
23 #
24 # This way, one can simply do 'fbld com.some.app' or 'fcheckup com.some.app'
25
26 __fdroid_init() {
27         COMPREPLY=()
28         cur="${COMP_WORDS[COMP_CWORD]}"
29         prev="${COMP_WORDS[COMP_CWORD-1]}"
30
31         (( $# >= 1 )) && __complete_${1}
32 }
33
34 __package() {
35         files=( metadata/*.txt )
36         files=( ${files[@]#metadata/} )
37         files=${files[@]%.txt}
38         COMPREPLY=( $( compgen -W "$files" -- $cur ) )
39 }
40
41 __signed_package() {
42         files=( repo/*.apk )
43         if [ "${files[0]}" == "repo/*.apk" ]; then
44                 return
45         fi
46         files=( ${files[@]#repo/} )
47         files=${files[@]%_*}
48         COMPREPLY=( $( compgen -W "$files" -- $cur ) )
49 }
50
51 __signed_vercode() {
52         local p
53         p=${cur:0:-1}
54
55         files=( repo/${p}_*.apk )
56         files=( ${files[@]#*_} )
57         files=${files[@]%.apk}
58         COMPREPLY=( $( compgen -P "${p}:" -W "$files" -- $cur ) )
59 }
60
61 __vercode() {
62         local p
63         p=${cur:0:-1}
64
65         COMPREPLY=( $( compgen -P "${p}:" -W "$( while read line; do
66                 if [[ "$line" == "Build Version:"* ]]
67                 then
68                         line="${line#*,}"
69                         printf "${line%%,*} "
70                 elif [[ "$line" == "Build:"* ]]
71                 then
72                         line="${line#*,}"
73                         printf "${line%%,*} "
74                 fi
75                 done < "metadata/${p}.txt" )" -- $cur ) )
76 }
77
78 __complete_options() {
79         case "${cur}" in
80                 --*)
81                         COMPREPLY=( $( compgen -W "${lopts}" -- $cur ) )
82                         return 0;;
83                 *)
84                         COMPREPLY=( $( compgen -W "${opts} ${lopts}" -- $cur ) )
85                         return 0;;
86         esac
87 }
88
89 __complete_build() {
90         opts="-h -v -p -c -l -s -t -f"
91         lopts="--help --verbose --latest --server --resetserver --on-server
92  --force --all"
93         case "${cur}" in
94                 *:)
95                         __vercode
96                         return 0;;
97                 *)
98                         __package
99                         return 0;;
100         esac
101         __complete_options
102 }
103
104 __complete_install() {
105         opts="-h -v"
106         lopts="--help --verbose --all"
107         case "${cur}" in
108                 -*)
109                         __complete_options
110                         return 0;;
111                 *:)
112                         __signed_vercode
113                         return 0;;
114                 *)
115                         __signed_package
116                         return 0;;
117         esac
118 }
119
120 __complete_update() {
121         opts="-h -c -v -q -b -i -I -e -w"
122         lopts="--help --createmeta --verbose --quiet --buildreport --interactive
123  --icons --editor --wiki --pretty --clean"
124         case "${prev}" in
125                 -e|--editor)
126                         _filedir
127                         return 0;;
128         esac
129         __complete_options
130 }
131
132 __complete_publish() {
133         opts="-h -v -p"
134         lopts="--help --verbose --package"
135         case "${prev}" in
136                 -p|--package)
137                         __package
138                         return 0;;
139         esac
140         __complete_options
141 }
142
143 __complete_checkupdates() {
144         opts="-h -v -p"
145         lopts="--help --verbose --auto --autoonly --commit --gplay"
146         case "${cur}" in
147                 -*)
148                         __complete_options
149                         return 0;;
150                 *)
151                         __package
152                         return 0;;
153         esac
154 }
155
156 __complete_import() {
157         opts="-h -u -s -r"
158         lopts="--help --url --subdir --repo"
159         case "${prev}" in
160                 -u|--url|-r|--repo) return 0;;
161                 -s|--subdir)
162                         _filedir
163                         return 0;;
164         esac
165         __complete_options
166 }
167
168 __complete_rewritemeta() {
169         opts="-h -v -p"
170         lopts="--help --verbose --package"
171         case "${prev}" in
172                 -p|--package)
173                         __package
174                         return 0;;
175         esac
176         __complete_options
177 }
178
179 __complete_scanner() {
180         opts="-h -v -p"
181         lopts="--help --verbose --package --nosvn"
182         case "${prev}" in
183                 -p|--package)
184                         __package
185                         return 0;;
186         esac
187         __complete_options
188 }
189
190 __complete_verify() {
191         opts="-h -v -p"
192         lopts="--help --verbose --package"
193         case "${prev}" in
194                 -p|--package)
195                         __package
196                         return 0;;
197         esac
198         __complete_options
199 }
200
201 __complete_stats() {
202         opts="-h -v -d"
203         lopts="--help --verbose --download"
204         __complete_options
205 }
206
207 __complete_server() {
208         opts="-h -v"
209         lopts="--help --verbose update"
210         __complete_options
211 }
212
213 __complete_init() {
214         opts="-h -v -d"
215         lopts="--help --verbose --keystore --distinguished-name --repo-keyalias"
216         __complete_options
217 }
218
219 _fdroid() {
220         local cmd cmds aliased
221         cmd=${COMP_WORDS[1]}
222         cmds=" build init install update publish checkupdates import
223  rewritemeta scanner verify stats server "
224         aliased=false
225
226         for c in $cmds; do eval "_fdroid_${c} () {
227                 local cur prev cmds opts lopts
228                 __fdroid_init ${c};
229         }"; done
230
231         [[ $cmds == *\ $cmd\ * ]] && _fdroid_${cmd} || {
232                 (($COMP_CWORD == 1)) && COMPREPLY=( $( compgen -W "${cmds}" -- $cmd ) )
233         }
234 }
235
236 _fd-commit() {
237         __package
238 }
239
240 complete -F _fdroid fdroid
241 complete -F _fd-commit fd-commit
242
243 return 0