import Werner Finks shell completion scripts
[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 aggregatepac branch build buildconfig \
31     buildhistory buildhist buildinfo buildlog bl cat checkout co commit \
32     checkin ci copypac delete del remove rm deletepac deleteprj diff di \
33     getbinaries help importsrcpkg info init jobhistory jobhist linkpac list \
34     log ls maintainer meta mkpac platforms prjresults pr rdiff rebuildpac \
35     remotebuildlog rbl repos repourls req resolved results results_meta rlog \
36     rprjresults rresults search status sr submitreq update up updatepacmetafromspec \
37     metafromspec wipebinaries)
38 oscreq=(create list log show accept decline delete revoke)
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[$((3+off))]}" -a -n "${oscprj}" ; then
67             builtin compgen -W "${oscprj}"
68         else
69             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[$((3+off))]}"
70         fi
71     fi
72     if ((pos == 2)) ; then
73         if test -z "${cmdline[$((4+off))]}" -a -n "${oscpkg}" ; then
74             builtin compgen -W "${oscpkg}"
75         else
76             builtin compgen -W "$(command osc ls "${cmdline[$((3+off))]}")" -- "${cmdline[$((4+off))]}"
77         fi
78     fi
79     if ((pos == 3)) ; then
80         if test -z "${cmdline[$((5+off))]}" -a -n "${lnkprj}" ; then
81             builtin compgen -W "${lnkprj}"
82         else
83             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[$((5+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[$((6+off))]}"
91         else
92             builtin compgen -W "$(command osc ls "${cmdline[$((5+off))]}")" -- "${cmdline[$((6+off))]}"
93         fi
94     fi
95 }
96
97 case "${cmdline[1]}" in
98 add|addremove)
99     if ((count == 1)) ; then
100         builtin compgen -W 'add addremove' -- "${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)
142     if ((count == 1)) ; then
143         builtin compgen -W 'sr submitreq' -- "${cmdline[1]}"
144     fi
145     case "${cmdline[2]}" in
146     create)
147         case "${cmdline[3]}" in
148         --nodevelproject)
149             submit $((count - 3)) 1 ;;
150         -*) builtin compgen -W '--nodevelproject' -- "${cmdline[3]}" ;;
151         *)  submit $((count - 2)) 0 ;;
152         esac
153         ;;
154     accept|decline|delete|revoke|log)
155         if ((count == 3)) ; then
156             builtin echo -n 'ID'
157         fi
158         ;;
159     show)
160         if ((count == 3)) ; then
161             builtin compgen -W '--diff' -- "${cmdline[3]}"
162         else    
163             builtin echo -n 'ID'
164         fi
165         ;;
166     list)
167         if ((count == 3)) ; then
168             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[3]}"
169         fi
170         if ((count == 4)) ; then
171             builtin compgen -W "$(command osc ls "${cmdline[3]}")" -- "${cmdline[4]}"
172         fi
173         ;;
174     *)
175         ((count == 2)) && builtin compgen -W "$(builtin echo ${oscreq[@]})" -- "${cmdline[2]}"
176     esac
177     ;;
178 copypac|linkpac)
179     if ((count == 1)) ; then
180         builtin compgen -W 'copypac linkpac' -- "${cmdline[1]}"
181     fi
182     case "${cmdline[2]}" in
183     *)
184         if ((count == 2)) ; then
185             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
186         fi
187         if ((count == 3)) ; then
188             builtin compgen -W "$(osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
189         fi
190         if ((count == 4)) ; then
191             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[4]}"
192         fi
193         if ((count == 5)) ; then
194             builtin compgen -W "$(command osc ls "${cmdline[4]}")" -- "${cmdline[5]}"
195         fi
196     esac
197     ;;
198 rdiff)
199     if ((count == 1)) ; then
200         builtin compgen -W 'rdiff' -- "${cmdline[1]}"
201     fi
202     case "${cmdline[2]}" in
203     *)
204         if ((count == 2)) ; then
205             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
206         fi
207         if ((count == 3)) ; then
208             builtin compgen -W "$(osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
209         fi
210         if ((count == 4)) ; then
211             builtin compgen -W "$(command cat ~/.osc.projects)" -P --oldprj= -- "${cmdline[4]#*=}"
212         fi
213         if ((count == 5)) ; then
214             builtin compgen -W "$(command osc ls "${cmdline[4]}")" -P --oldpkg= -- "${cmdline[5]#*=}"
215         fi
216     esac
217     ;;
218 ci|commit|checkin)
219     if ((count == 1)) ; then
220         builtin compgen -W 'ci commit checkin' -- "${cmdline[1]}"
221     else
222         for x in $(builtin compgen -f -X '.osc' -- "${cmdline[2]}"); do
223             test -d $x && builtin echo $x/ || builtin echo $x
224         done
225     fi
226     ;;
227 co|checkout)
228     if ((count == 1)) ; then
229         builtin compgen -W 'co checkout' -- "${cmdline[1]}"
230     fi
231     if ((count == 1)) ; then
232         builtin compgen -W 'co checkout' -- "${cmdline[1]}"
233     else
234         if ((count == 2)) ; then
235             builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
236         fi
237         if ((count == 3)) ; then
238             builtin compgen -W "$(command osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
239         fi
240     fi
241     ;;
242 up|update)
243     if ((count == 1)) ; then
244         builtin compgen -W 'up update' -- "${cmdline[1]}"
245     fi
246     if ((count == 2)) ; then
247         builtin  compgen -W '--expand-link --unexpand-link' -- "${cmdline[2]}"
248     fi
249     ;;
250 meta)
251     if ((count == 1)) ; then
252         builtin compgen -W 'meta metafromspec' -- "${cmdline[1]}"
253     fi
254     if ((count == 2)) ; then
255         builtin compgen -W 'prj pkg' -- "${cmdline[2]}"
256     fi
257     if ((count == 3)) ; then
258         builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[3]}"
259     fi
260     if ((count == 4)) && test "${cmdline[2]}" = pkg ; then
261         builtin compgen -W "$(command osc ls "${cmdline[3]}")" -- "${cmdline[4]}"
262     fi
263     if ((count == 5)) ; then
264         builtin compgen -W '--edit -e' -- "${cmdline[5]}"
265     fi
266     ;;
267 wipebinaries)
268     if ((count == 1)) ; then
269         builtin compgen -W 'wipebinaries' -- "${cmdline[1]}"
270     fi
271     if ((count == 2)) ; then
272         builtin compgen -W "$(command cat ~/.osc.projects)" -- "${cmdline[2]}"
273     fi
274     if ((count == 3)) ; then
275         builtin compgen -W "$(command osc ls "${cmdline[2]}")" -- "${cmdline[3]}"
276     fi
277     if ((count == 4)) ; then
278         builtin compgen -W "--expansion --broken --build-failed --build-disabled" -- "${cmdline[4]}"
279     fi
280     ;;
281 help)
282     if ((count == 1)) ; then
283         builtin compgen -W 'help' -- "${cmdline[1]}"
284     fi
285     ((count == 2)) && builtin compgen -W "$(builtin echo ${osccmds[@]})" -- "${cmdline[2]}"
286     ;;
287 *)
288     ((count == 1)) && builtin compgen -W "$(builtin echo ${osccmds[@]})" -- "${cmdline[1]}"
289 esac