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