chiark / gitweb /
complete packages from within the metadata dir too
[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_cwd() {
27         if [[ "${PWD##*/}" == metadata ]]; then
28                 subdir=
29         else
30                 [ -d metadata ] && subdir="metadata/" || return 1
31         fi
32 }
33
34 __fdroid_init() {
35         COMPREPLY=()
36         cur="${COMP_WORDS[COMP_CWORD]}"
37         prev="${COMP_WORDS[COMP_CWORD-1]}"
38
39         (( $# >= 1 )) && __complete_${1}
40 }
41
42 __package() {
43         files=( ${subdir}*.txt )
44         files=( ${files[@]#${subdir}} )
45         files=${files[@]%.txt}
46         COMPREPLY=( $( compgen -W "$files" -- $cur ) )
47 }
48
49 __vercode() {
50         local s p_found p
51         s=${#COMP_WORDS[*]}
52         p_found=false
53
54         $aliased && p=${COMP_WORDS[1]} || {
55                 for (( i=1; i <= s; i++ )); do
56                         $p_found && { p=${COMP_WORDS[$i]}; break;}
57                         [[ ${COMP_WORDS[$i]} == -p ]] || [[ ${COMP_WORDS[$i]} == --package ]] &&\
58                                 p_found=true
59                 done
60                 $p_found || return 0
61         }
62
63         COMPREPLY=( $( compgen -W "$( while read line; do
64                 if [[ "$line" == "Build Version:"* ]]
65                 then
66                         line="${line#*,}"
67                         printf "${line%%,*} "
68                 elif [[ "$line" == "Build:"* ]]
69                 then
70                         line="${line#*,}"
71                         printf "${line%%,*} "
72                 fi
73                 done < "${subdir}${p}.txt" )" -- $cur ) )
74 }
75
76 __complete_options() {
77         case "${cur}" in
78                 --*)
79                         COMPREPLY=( $( compgen -W "${lopts}" -- $cur ) )
80                         return 0;;
81                 *)
82                         COMPREPLY=( $( compgen -W "${opts} ${lopts}" -- $cur ) )
83                         return 0;;
84         esac
85 }
86
87 __complete_build() {
88         opts="-h -v -p -c -l -s -t -f"
89         lopts="--help --verbose --package --vercode --latest --server --resetserver
90  --on-server --force --install --all"
91         case "${prev}" in
92                 -p|--package)
93                         __package
94                         return 0;;
95                 -c|--vercode)
96                         __vercode
97                         return 0;;
98         esac
99         __complete_options
100 }
101
102 __complete_update() {
103         opts="-h -c -v -q -b -i -I -e -w"
104         lopts="--help --createmeta --verbose --quiet --buildreport --interactive
105  --icons --editor --wiki --pretty --clean"
106         case "${prev}" in
107                 -e|--editor)
108                         _filedir
109                         return 0;;
110         esac
111         __complete_options
112 }
113
114 __complete_publish() {
115         opts="-h -v -p"
116         lopts="--help --verbose --package"
117         case "${prev}" in
118                 -p|--package)
119                         __package
120                         return 0;;
121         esac
122         __complete_options
123 }
124
125 __complete_checkupdates() {
126         opts="-h -v -p"
127         lopts="--help --verbose --package --auto --autoonly --commit --gplay"
128         case "${prev}" in
129                 -p|--package)
130                         __package
131                         return 0;;
132         esac
133         __complete_options
134 }
135
136 __complete_import() {
137         opts="-h -u -s -r"
138         lopts="--help --url --subdir --repo"
139         case "${prev}" in
140                 -u|--url|-r|--repo) return 0;;
141                 -s|--subdir)
142                         _filedir
143                         return 0;;
144         esac
145         __complete_options
146 }
147
148 __complete_rewritemeta() {
149         opts="-h -v -p"
150         lopts="--help --verbose --package"
151         case "${prev}" in
152                 -p|--package)
153                         __package
154                         return 0;;
155         esac
156         __complete_options
157 }
158
159 __complete_scanner() {
160         opts="-h -v -p"
161         lopts="--help --verbose --package --nosvn"
162         case "${prev}" in
163                 -p|--package)
164                         __package
165                         return 0;;
166         esac
167         __complete_options
168 }
169
170 __complete_verify() {
171         opts="-h -v -p"
172         lopts="--help --verbose --package"
173         case "${prev}" in
174                 -p|--package)
175                         __package
176                         return 0;;
177         esac
178         __complete_options
179 }
180
181 __complete_stats() {
182         opts="-h -v -d"
183         lopts="--help --verbose --download"
184         __complete_options
185 }
186
187 __complete_server() {
188         opts="-h -v"
189         lopts="--help --verbose update"
190         __complete_options
191 }
192
193 __complete_init() {
194         opts="-h -v -d"
195         lopts="--help --verbose --keystore --distinguished-name --repo-keyalias"
196         __complete_options
197 }
198
199 _fdroid() {
200         local cmd cmds aliased
201         cmd=${COMP_WORDS[1]}
202         cmds=" build init update publish checkupdates import rewritemeta scanner verify stats server "
203         aliased=false
204         __fdroid_cwd || return 0
205
206         for c in $cmds; do eval "_fdroid_${c} () {
207                 local cur prev cmds opts lopts
208                 __fdroid_init ${c};
209         }"; done
210
211         [[ $cmds == *\ $cmd\ * ]] && _fdroid_${cmd} || {
212                 (($COMP_CWORD == 1)) && COMPREPLY=( $( compgen -W "${cmds}" -- $cmd ) )
213         }
214 }
215
216 _fdroid_build_project() {
217         local cur prev cmds opts lopts aliased
218         __fdroid_init
219         aliased=true
220         (( $COMP_CWORD == 1 )) && prev="-p"
221
222         __complete_build
223 }
224
225 _fdroid_checkupdates_project() {
226         local cur prev cmds opts lopts aliased
227         __fdroid_init
228         aliased=true
229         (( $COMP_CWORD == 1 )) && prev="-p"
230
231         __complete_checkupdates
232 }
233
234 _fd-commit() {
235         __fdroid_cwd || return 0
236         __package
237 }
238
239 complete -F _fdroid fdroid
240 complete -F _fd-commit fd-commit
241
242 return 0