Re-enable REMOVE_PKGS test in pactest suite
[pacman-ng.git] / contrib / bash_completion
blob65135cfdbd9fc84e53ef8b44a4b4ed16d07ebd3d
1 # vim: set ft=sh ts=2 sw=2 et:
2 # file: /etc/bash_completion.d/pacman
4 # Bash completion for pacman
5 # Original: Manolis Tzanidakis <mtzanidakis@freemail.gr>
7 # Distributed under the terms of the GNU General Public License, v2 or later.
10 ## initial functions
12 rem_selected ()
14   # (Adapted from bash_completion by Ian Macdonald <ian@caliban.org>)
15   # This removes any options from the list of completions that have
16   # already been specified on the command line.
17   COMPREPLY=($(echo "${COMP_WORDS[@]}" | \
18     (while read -d ' ' i; do
19       [ "${i}" == "" ] && continue
20       # flatten array with spaces on either side,
21       # otherwise we cannot grep on word boundaries of
22       # first and last word
23       COMPREPLY=" ${COMPREPLY[@]} "
24       # remove word from list of completions
25       COMPREPLY=(${COMPREPLY/ ${i%% *} / })
26     done
27     echo ${COMPREPLY[@]})))
28   return 0
31 _available_repos ()
33   COMPREPLY=( $( compgen -W "$(grep '\[' /etc/pacman.conf | grep -v -e 'options' -e '^#' | tr -d '[]' )" -- $cur ) )
36 _installed_pkgs ()
38   local installed_pkgs
39   installed_pkgs=$( ls /var/lib/pacman/local/ )
40   COMPREPLY=( $( compgen -W "$( for i in $installed_pkgs; do echo ${i%-*-*}; done )" -- $cur ) )
43 _available_pkgs ()
45   #find balks easilly on a find /foo/*/* type dir, especially one like
46   #   /var/lib/pacman/*/*
47   # This little change-up removes the find *and* only uses enabled repos
48   local available_pkgs
49   local enabled_repos
50   enabled_repos=$( grep '\[' /etc/pacman.conf | grep -v -e 'options' -e '^#' | tr -d '[]' )
51   available_pkgs=$( for r in $enabled_repos; do echo /var/lib/pacman/sync/$r/*; done )
52   COMPREPLY=( $( compgen -W "$( for i in $available_pkgs; do j=${i##*/}; echo ${j%-*-*}; done )" -- $cur ) )
55 _installed_groups ()
57   local installed_groups
58   installed_groups=$( find /var/lib/pacman/local -name desc -exec sed -ne '/%GROUPS%/,/^$/{//d; p}' {} \; | sort -u )
59   COMPREPLY=( $( compgen -W "$( for i in $installed_groups; do echo ${i%-*-*}; done )" -- $cur ) )
62 _available_groups ()
64   #find balks easilly on a find /foo/*/* type dir, especially one like
65   #   /var/lib/pacman/*/*
66   # This little change-up removes the find *and* only uses enabled repos
67   local available_groups
68   local enabled_repos
69   enabled_repos=$( grep '\[' /etc/pacman.conf | grep -v -e 'options' -e '^#' | tr -d '[]' )
70   available_groups=$( for r in $enabled_repos; do sed '/%GROUPS%/,/^$/{//d; p}' /var/lib/pacman/sync/$r/*/desc | sort -u; done )
71   COMPREPLY=( $( compgen -W "$( for i in $available_groups; do echo ${i%-*-*}; done )" -- $cur ) )
74 ## makepkg completion
76 _makepkg ()
78   local cur prev
79   COMPREPLY=()
80   cur=${COMP_WORDS[COMP_CWORD]}
81   prev=${COMP_WORDS[COMP_CWORD-1]}
83   case "$prev" in
84     -p)
85       _filedir
86       return 0
87     ;;
88     --help|--cleancache)
89       COMPREPLY=''
90       return 0
91     ;;
92   esac
94   if [[ "$cur" == -* ]]; then
95     COMPREPLY=( $( compgen -W '\
96       -A --ignorearch \
97       -b --builddeps \
98       -c --clean \
99       -C --cleancache \
100       -d --nodeps \
101       -e --noextract \
102       -f --force \
103       -g --geninteg \
104       -h --help \
105       -i --install \
106       -L --log \
107       -m --nocolor \
108       -o --nobuild \
109       -p \
110       -r --rmdeps \
111       -s --syncdeps \
112       --asroot \
113       --source \
114       --noconfirm \
115       --noprogressbar' -- $cur ) )
116   fi
118   rem_selected
120 complete -o default -F _makepkg makepkg
122 ## pacman completion
124 _instring ()
126   str="${1}"
127   shift 1
128   for c in "${@}"; do
129     if [ $(expr index "${str}" "${c}") -gt 0 ]; then
130       return 0
131     fi
132   done
133   return 1
136 _pacman ()
138   local a arg toparse op mod cur
139   COMPREPLY=()
141   # This argument parsing is done so we can check for flag existance later
142   #  right now it's a tad crappy, but does the job
143   for (( i=1; i < ${#COMP_WORDS[@]}-1; i++ )); do
144     a=${COMP_WORDS[i]}
145     arg="${a:0:2}"
146     toparse="${a:2}"
148     case "${arg}" in
149       -@(U|R|S|Q|h|V))
150         op="${arg/-}"
151         mod="${mod}${a:2}"
152         ;;
153       --)
154         arg="${a:2}"
155         case "${arg}" in
156           remove) op="R" ;;
157           upgrade) op="U" ;;
158           query) op="Q" ;;
159           sync) op="S" ;;
160           help) op="h" ;;
161           version) op="V" ;;
162           verbose) mod="${mod}v" ;;
163           root) mod="${mod}r" ;;
164           dbpath) mod="${mod}b" ;;
165           nodeps) mod="${mod}d" ;;
166           force) mod="${mod}f" ;;
167           groups) mod="${mod}g" ;;
168           info) mod="${mod}i" ;;
169           list) mod="${mod}l" ;;
170           print-uris) mod="${mod}p" ;;
171           search) mod="${mod}s" ;;
172           sysupgrade) mod="${mod}u" ;;
173           upgrades) mod="${mod}u" ;;
174           downloadonly) mod="${mod}w" ;;
175           refresh) mod="${mod}y" ;;
176           changelog) mod="${mod}c" ;;
177           deps) mod="${mod}d" ;;
178           explicit) mod="${mod}e" ;;
179           unrequired) mod="${mod}t" ;;
180           foreign) mod="${mod}m" ;;
181           owns) mod="${mod}o" ;;
182           file) mod="${mod}p" ;;
183           search) mod="${mod}s" ;;
184           upgrades) mod="${mod}u" ;;
185           cascade) mod="${mod}c" ;;
186           check) mod="${mod}k" ;;
187           dbonly) mod="${mod}k" ;;
188           nosave) mod="${mod}n" ;;
189           recursive) mod="${mod}s" ;;
190           unneeded) mod="${mod}u" ;;
191         esac ;;
192       *) toparse="${a}" ;;
193     esac
195     arglen=$(( ${#toparse}-1 ))
196     for c in $(seq 0 "${arglen}"); do
197       arg=${toparse:$c:1}
198       [ "${arg}" != "-" ] && mod="${mod}${arg}"
199     done
200   done
202   cur=${COMP_WORDS[COMP_CWORD]}
204   if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then
205     COMPREPLY=( $( compgen -W '\
206       -h --help \
207       -Q --query \
208       -R --remove \
209       -S --sync \
210       -U --upgrade \
211       -V --version \
212       ' -- $cur ) )
213     rem_selected
214     return 0
215   fi
217   if [[ "$cur" == -* ]]; then
218     case "${op}" in
219       U)
220         COMPREPLY=( $( compgen -W '\
221           --asdeps \
222           --asexplicit \
223           -d --nodeps \
224           -f --force \
225           -h --help \
226           --config \
227           --logfile \
228           --noconfirm \
229           --noprogressbar \
230           --noscriptlet \
231           -v --verbose \
232           -r --root \
233           -b --dbpath \
234           --cachedir \
235           ' -- $cur ) )
236         return 0
237         ;;
238       R)
239         COMPREPLY=( $( compgen -W '\
240           -c --cascade \
241           -d --nodeps \
242           -h --help \
243           -k --dbonly \
244           -n --nosave \
245           -s --recursive \
246           -u --unneeded \
247           --config \
248           --logfile \
249           --noconfirm \
250           --noprogressbar \
251           --noscriptlet \
252           -v --verbose \
253           -r --root \
254           -b --dbpath \
255           --cachedir \
256           ' -- $cur ) )
257         return 0
258         ;;
259       S)
260         COMPREPLY=( $( compgen -W '\
261           --asdeps \
262           --asexplicit \
263           -c --clean \
264           -d --nodeps \
265           -f --force \
266           -g --groups \
267           -h --help \
268           -i --info \
269           -l --list \
270           -p --print-uris \
271           -s --search \
272           -u --sysupgrade \
273           -w --downloadonly \
274           -y --refresh \
275           --needed \
276           --ignore \
277           --ignoregroup \
278           --config \
279           --logfile \
280           --noconfirm \
281           --noprogressbar \
282           --noscriptlet \
283           -v --verbose \
284           -r --root \
285           -b --dbpath \
286           --cachedir \
287           ' -- $cur ) )
288         return 0
289         ;;
290       Q)
291         COMPREPLY=( $( compgen -W '\
292           -c --changelog \
293           -d --deps \
294           -e --explicit \
295           -g --groups \
296           -h --help \
297           -i --info \
298           -k --check \
299           -l --list \
300           -m --foreign \
301           -o --owns \
302           -p --file \
303           -s --search \
304           -t --unrequired \
305           -u --upgrades \
306           --config \
307           --logfile \
308           --noconfirm \
309           --noprogressbar \
310           --noscriptlet \
311           -v --verbose \
312           -r --root \
313           -b --dbpath \
314           --cachedir \
315           ' -- $cur ) )
316         return 0
317         ;;
318     esac
319     rem_selected
320   else
321     case "${op}" in
322       U)
323         COMPREPLY=( $( compgen -d -- "$cur" ) \
324                     $( compgen -f -X '!*.pkg.tar.gz' -- "$cur" ) )
325         return 0
326         ;;
327       h|V)
328         COMPREPLY=''
329         return 0
330         ;;
331       Q)
332         if _instring $mod g; then
333           _installed_groups
334         elif _instring $mod o; then
335           COMPREPLY=( $( compgen -d -- "$cur" ) \
336                       $( compgen -f -- "$cur" ) )
337         elif _instring $mod p; then
338           COMPREPLY=( $( compgen -d -- "$cur" ) \
339                       $( compgen -f -X '!*.pkg.tar.gz' -- "$cur" ) )
340         elif _instring $mod u; then
341           COMPREPLY=''
342           return 0
343         else
344           _installed_pkgs
345         fi
346         return 0
347         ;;
348       R)
349         _installed_pkgs
350         return 0
351         ;;
352       S)
353         if _instring $mod l; then
354           _available_repos
355         else
356           _available_pkgs
357         fi
358         return 0
359         ;;
360     esac
361   fi
363   rem_selected
365 complete -o filenames -F _pacman pacman