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