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