add completion support for osc search
[opensuse:osc.git] / dist / osc.complete
1 #!/bin/bash
2 #
3 #  Helper script for completion, usage with tcsh:
4 #
5 #     complete osc 'p@*@`osc.complete`@'
6 #
7 #  usage with bash
8 #
9 #     complete -C osc.complete osc
10 #
11 #  Author: Werner Fink <werner@suse.de>
12 #
13
14 set -o noclobber
15 shopt -s extglob
16 typeset -i last
17 typeset -i count
18
19 test "/proc/$PPID/exe" -ef /bin/tcsh || COMMAND_LINE="$COMP_LINE"
20 cmdline=($COMMAND_LINE)
21 test "${cmdline[0]}" != "osc" && exit 1
22
23 let last=${#COMMAND_LINE}
24 let last--
25 let count=${#cmdline[@]}
26 let count--
27 test "${COMMAND_LINE:$last}" = " " && let count++
28 unset last
29
30 osccmds=(abortbuild add addremove ar aggregatepac api branch build buildconfig \
31     buildhistory buildhist buildinfo buildlog bl cat changedevelrequest changedevelreq \
32     cr checkout co commit checkin ci copypac delete del remove rm deleterequest \
33     deletereq dr diff di getbinaries help importsrcpkg info init jobhistory jobhist \
34     linkpac list ls log maintainer man meta mkpac platforms prjresults pr rdelete \
35     rdiff rebuild rebuildpac remotebuildlog rbl rbuildlog repairlink repos repourls \
36     request rq resolved results r search setlinkrev status st submitrequest sr \
37     submitreq update up updatepacmetafromspec metafromspec vc wipebinaries)
38 oscreq=(list log show accept decline delete revoke wipe)
39
40 oscprj=""
41 oscpkg=""
42 lnkprj=""
43 lnkpkg=""
44 test -s ${PWD}/.osc/_project && read -t 1 oscprj < ${PWD}/.osc/_project
45 test -s ${PWD}/.osc/_package && read -t 1 oscpkg < ${PWD}/.osc/_package
46 if test -s ${PWD}/.osc/_files ; then
47     lnkprj=$(command sed -rn '/<linkinfo/{s@.*[[:blank:]]project="([^"]+)".*@\1@p;}' < ${PWD}/.osc/_files)
48     lnkpkg=$(command sed -rn '/<linkinfo/{s@.*[[:blank:]]package="([^"]+)".*@\1@p;}' < ${PWD}/.osc/_files)
49 fi
50
51 if test -s ~/.osc.projects ; then
52     typeset -i ctime=$(command date -d "$(command stat -c '%z' ~/.osc.projects)" +'%s')
53     typeset -i   now=$(command date -d now +'%s')
54     ((now - ctime > 86400)) && command osc ls >| ~/.osc.projects
55 else
56     command osc ls >| ~/.osc.projects
57 fi
58
59 submit ()
60 {
61     local -i pos=$1
62     local -i off=$2
63     local target
64
65     if ((pos == 1)) ; then
66         if test -z "${cmdline[$((2+off))]}" -a -n "${oscprj}" ; then
67             builtin compgen -W "${oscprj}"
68         else
69             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[$((2+off))]}"
70         fi
71     fi
72     if ((pos == 2)) ; then
73         if test -z "${cmdline[$((3+off))]}" -a -n "${oscpkg}" ; then
74             builtin compgen -W "${oscpkg}"
75         else
76             builtin compgen -W "$(command osc ls "${cmdline[$((2+off))]}")" -- "${cmdline[$((3+off))]}"
77         fi
78     fi
79     if ((pos == 3)) ; then
80         if test -z "${cmdline[$((4+off))]}" -a -n "${lnkprj}" ; then
81             builtin compgen -W "${lnkprj}"
82         else
83             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[$((4+off))]}"
84         fi
85     fi
86     if ((pos == 4)) ; then
87         target="${lnkpkg}"
88         target="${target:+$target }$oscpkg"
89         if test -n "${target}" ; then
90             builtin compgen -W "${target}" -- "${cmdline[$((5+off))]}"
91         else
92             builtin compgen -W "$(command osc ls "${cmdline[$((4+off))]}")" -- "${cmdline[$((5+off))]}"
93         fi
94     fi
95 }
96
97 case "${cmdline[1]}" in
98 add|addremove|ar)
99     if ((count == 1)) ; then
100         builtin compgen -W 'add addremove ar' -- "${cmdline[1]}"
101     else
102         for x in $(builtin compgen -f -X '.osc' -- "${cmdline[2]}"); do
103             test -d $x && builtin echo $x/ || builtin echo $x
104         done
105     fi
106     ;;
107 branch)
108     if ((count == 1)) ; then
109         builtin compgen -W 'branch' -- "${cmdline[1]}"
110     fi
111     case "${cmdline[2]}" in
112     --nodevelproject)
113         if ((count == 3)) ; then
114             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[3]}"
115         fi
116         if ((count == 4)) ; then
117             builtin compgen -W "$(command osc ls "${cmdline[3]}")" -- "${cmdline[4]}"
118         fi
119         ;;
120     -*) builtin compgen -W '--nodevelproject' -- "${cmdline[3]}" ;;
121     *)
122         if ((count == 2)) ; then
123             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
124         fi
125         if ((count == 3)) ; then
126             builtin compgen -W "$(command osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
127         fi
128     esac
129     ;;
130 list|ls)
131     if ((count == 1)) ; then
132         builtin compgen -W 'list ls' -- "${cmdline[1]}"
133     fi
134     if ((count == 2)) ; then
135         builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
136     fi
137     if ((count == 3)) ; then
138         builtin compgen -W "$(command osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
139     fi
140     ;;
141 sr|submitreq|submitrequest)
142     if ((count == 1)) ; then
143         builtin compgen -W 'sr submitreq submitrequest' -- "${cmdline[1]}"
144     fi
145     case "${cmdline[2]}" in
146     --nodevelproject)
147             submit $((count - 2)) 1 ;;
148     -*) builtin compgen -W '--nodevelproject' -- "${cmdline[2]}" ;;
149     *)  submit $((count - 1)) 0 ;;
150     esac
151     ;;
152 rq|request)
153     if ((count == 1)) ; then
154         builtin compgen -W 'rq request' -- "${cmdline[1]}"
155     fi
156     case "${cmdline[2]}" in
157     accept|decline|wipe|revoke|log)
158         if ((count == 3)) ; then
159             builtin echo -n 'ID'
160         fi
161         ;;
162     show)
163         if ((count == 3)) ; then
164             builtin compgen -W '--diff' -- "${cmdline[3]}"
165         else    
166             builtin echo -n 'ID'
167         fi
168         ;;
169     list)
170         if ((count == 3)) ; then
171             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[3]}"
172         fi
173         if ((count == 4)) ; then
174             builtin compgen -W "$(command osc ls "${cmdline[3]}")" -- "${cmdline[4]}"
175         fi
176         ;;
177     *)
178         ((count == 2)) && builtin compgen -W "$(builtin echo ${oscreq[@]})" -- "${cmdline[2]}"
179     esac
180     ;;
181 copypac|linkpac)
182     if ((count == 1)) ; then
183         builtin compgen -W 'copypac linkpac' -- "${cmdline[1]}"
184     fi
185     case "${cmdline[2]}" in
186     *)
187         if ((count == 2)) ; then
188             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
189         fi
190         if ((count == 3)) ; then
191             builtin compgen -W "$(osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
192         fi
193         if ((count == 4)) ; then
194             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[4]}"
195         fi
196         if ((count == 5)) ; then
197             builtin compgen -W "$(command osc ls "${cmdline[4]}")" -- "${cmdline[5]}"
198         fi
199     esac
200     ;;
201 deleterequest|deletereq|dr)
202     if ((count == 1)) ; then
203         builtin compgen -W 'deleterequest deletereq dr' -- "${cmdline[1]}"
204     fi
205     case "${cmdline[2]}" in
206     *)
207         if ((count == 2)) ; then
208             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
209         fi
210         if ((count == 3)) ; then
211             builtin compgen -W "$(osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
212         fi
213     esac
214     ;;
215 changedevelrequest|changedevelreq|cr)
216     if ((count == 1)) ; then
217         builtin compgen -W 'changedevelrequest changedevelreq cr' -- "${cmdline[1]}"
218     fi
219     case "${cmdline[2]}" in
220     *)
221         if ((count == 2)) ; then
222             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
223         fi
224         if ((count == 3)) ; then
225             builtin compgen -W "$(osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
226         fi
227         if ((count == 4)) ; then
228             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[4]}"
229         fi
230         if ((count == 5)) ; then
231             builtin compgen -W "$(command osc ls "${cmdline[4]}")" -- "${cmdline[5]}"
232         fi
233     esac
234     ;;
235 rdiff)
236     if ((count == 1)) ; then
237         builtin compgen -W 'rdiff' -- "${cmdline[1]}"
238     fi
239     case "${cmdline[2]}" in
240     *)
241         if ((count == 2)) ; then
242             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
243         fi
244         if ((count == 3)) ; then
245             builtin compgen -W "$(osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
246         fi
247         if ((count == 4)) ; then
248             builtin compgen -W "$(command cat ~/.osc.projects)" -P --oldprj= -- "${cmdline[4]#*=}"
249         fi
250         if ((count == 5)) ; then
251             builtin compgen -W "$(command osc ls "${cmdline[4]}")" -P --oldpkg= -- "${cmdline[5]#*=}"
252         fi
253     esac
254     ;;
255 ci|commit|checkin)
256     if ((count == 1)) ; then
257         builtin compgen -W 'ci commit checkin' -- "${cmdline[1]}"
258     else
259         for x in $(builtin compgen -f -X '.osc' -- "${cmdline[2]}"); do
260             test -d $x && builtin echo $x/ || builtin echo $x
261         done
262     fi
263     ;;
264 co|checkout)
265     if ((count == 1)) ; then
266         builtin compgen -W 'co copypac checkout' -- "${cmdline[1]}"
267     else
268         if ((count == 2)) ; then
269             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
270         fi
271         if ((count == 3)) ; then
272             builtin compgen -W "$(command osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
273         fi
274     fi
275     ;;
276 maintainer)
277     if ((count == 1)) ; then
278         builtin compgen -W 'maintainer' -- "${cmdline[1]}"
279     else
280         if ((count == 2)) ; then
281             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
282         fi
283         if ((count == 3)) ; then
284             builtin compgen -W "$(command osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
285         fi
286     fi
287     ;;
288 up|update)
289     if ((count == 1)) ; then
290         builtin compgen -W 'up update' -- "${cmdline[1]}"
291     fi
292     if ((count == 2)) ; then
293         builtin  compgen -W '--expand-link --unexpand-link' -- "${cmdline[2]}"
294     fi
295     ;;
296 meta)
297     if ((count == 1)) ; then
298         builtin compgen -W 'meta metafromspec' -- "${cmdline[1]}"
299     fi
300     if ((count == 2)) ; then
301         builtin compgen -W 'prj pkg' -- "${cmdline[2]}"
302     fi
303     if ((count == 3)) ; then
304         builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[3]}"
305     fi
306     if ((count == 4)) && test "${cmdline[2]}" = pkg ; then
307         builtin compgen -W "$(command osc ls "${cmdline[3]}")" -- "${cmdline[4]}"
308     fi
309     if ((count == 5)) ; then
310         builtin compgen -W '--edit -e' -- "${cmdline[5]}"
311     fi
312     ;;
313 wipebinaries)
314     if ((count == 1)) ; then
315         builtin compgen -W 'wipebinaries' -- "${cmdline[1]}"
316     fi
317     if ((count == 2)) ; then
318         builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
319     fi
320     if ((count == 3)) ; then
321         builtin compgen -W "$(command osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
322     fi
323     if ((count == 4)) ; then
324         builtin compgen -W "--expansion --broken --build-failed --build-disabled" -- "${cmdline[4]}"
325     fi
326     ;;
327 help)
328     if ((count == 1)) ; then
329         builtin compgen -W 'help' -- "${cmdline[1]}"
330     fi
331     ((count == 2)) && builtin compgen -W "$(builtin echo ${osccmds[@]})" -- "${cmdline[2]}"
332     ;;
333 search)
334     if ((count == 1)) ; then
335         builtin compgen -W 'search' -- "${cmdline[1]}"
336     else
337         oscsearch="--help --csv -i --involved -v --verbose --description --title \
338                    --project --package -e --exact --repos-baseurl"
339         builtin compgen -W "${oscsearch}" -- "${cmdline[$count]}"
340     fi
341     ;;
342 *)
343     ((count == 1)) && builtin compgen -W "$(builtin echo ${osccmds[@]})" -- "${cmdline[1]}"
344 esac