[pacman-dev] [PATCH] database/print options, fix dirs, other
Andres P
stderr at mail.com
Sun May 9 18:41:02 CEST 2010
* add -D --database options and --print (shining)
* fix dirs showing up when they shouldn't in completions
The 5 month old log of fixes still applies:
http://www.mail-archive.com/pacman-dev@archlinux.org/msg04121.html
This is now down to 106 lines. The original one (master) is 365 lines
long, yet this one retains all functionality.
---
contrib/bash_completion | 430
+++++++++--------------------------------------
1 files changed, 83 insertions(+), 347 deletions(-)
diff --git a/contrib/bash_completion b/contrib/bash_completion
index f0b5f9c..216c664 100644
--- a/contrib/bash_completion
+++ b/contrib/bash_completion
@@ -1,370 +1,106 @@
-# vim: set ft=sh ts=2 sw=2 et:
-# file: /etc/bash_completion.d/pacman
-
-# Bash completion for pacman
-# Original: Manolis Tzanidakis <mtzanidakis at freemail.gr>
-#
-# Distributed under the terms of the GNU General Public License, v2 or
later.
-#
-
-## initial functions
-
-rem_selected ()
-{
- # (Adapted from bash_completion by Ian Macdonald <ian at caliban.org>)
- # This removes any options from the list of completions that have
- # already been specified on the command line.
- COMPREPLY=($(\echo "${COMP_WORDS[@]}" | \
- (while read -d ' ' i; do
- [ "${i}" == "" ] && continue
- # flatten array with spaces on either side,
- # otherwise we cannot grep on word boundaries of
- # first and last word
- COMPREPLY=" ${COMPREPLY[@]} "
- # remove word from list of completions
- COMPREPLY=(${COMPREPLY/ ${i%% *} / })
+# This file is in the public domain.
+
+_arch_compgen() {
+ local i r
+ COMPREPLY=($(compgen -W '$list' -- $cur))
+ for ((i=1; i < ${#COMP_WORDS[@]}-1; i++)); do
+ for r in ${!COMPREPLY[@]}; do
+ if [[ ${COMP_WORDS[i]} == ${COMPREPLY[r]} ]]; then
+ unset 'COMPREPLY[r]'; break
+ fi
done
- \echo ${COMPREPLY[@]})))
- return 0
-}
-
-_available_repos ()
-{
- COMPREPLY=( $( compgen -W "$(\grep '\[' /etc/pacman.conf | \grep -v
-e 'options' -e '^#' | \tr -d '[]' )" -- $cur ) )
-}
-
-_installed_pkgs ()
-{
- local installed_pkgs
- installed_pkgs=$( \ls /var/lib/pacman/local/ )
- COMPREPLY=( $( compgen -W "$( for i in $installed_pkgs; do \echo
${i%-*-*}; done )" -- $cur ) )
-}
-
-_available_pkgs ()
-{
- #find balks easilly on a find /foo/*/* type dir, especially one like
- # /var/lib/pacman/*/*
- # This little change-up removes the find *and* only uses enabled
repos
- local available_pkgs
- local enabled_repos
- enabled_repos=$( \grep '\[' /etc/pacman.conf | \grep -v -e 'options'
-e '^#' | \tr -d '[]' )
- available_pkgs=$( for r in $enabled_repos; do \echo
/var/lib/pacman/sync/$r/*; done )
- COMPREPLY=( $( compgen -W "$( for i in $available_pkgs; do
j=${i##*/}; echo ${j%-*-*}; done )" -- $cur ) )
+ done
}
-_installed_groups ()
-{
- local installed_groups
- installed_groups=$( \find /var/lib/pacman/local -name desc -exec
\sed -ne '/%GROUPS%/,/^$/{//d; p}' {} \; | \sort -u )
- COMPREPLY=( $( compgen -W "$( for i in $installed_groups; do \echo
${i%-*-*}; done )" -- $cur ) )
+_arch_ptr2comp() {
+ local list= x y
+ for x; do
+ for y in '0 --' '1 -'; do
+ eval 'set -- ${'"$x"'[${y% *}]}'
+ list+=\ ${@/#/${y#* }}
+ done
+ done
+ _arch_compgen
}
-_available_groups ()
-{
- #find balks easilly on a find /foo/*/* type dir, especially one like
- # /var/lib/pacman/*/*
- # This little change-up removes the find *and* only uses enabled
repos
- local available_groups
- local enabled_repos
- enabled_repos=$( \grep '\[' /etc/pacman.conf | \grep -v -e 'options'
-e '^#' | tr -d '[]' )
- available_groups=$( for r in $enabled_repos; do \sed
'/%GROUPS%/,/^$/{//d; p}' /var/lib/pacman/sync/$r/*/desc | \sort -u;
done )
- COMPREPLY=( $( compgen -W "$( for i in $available_groups; do \echo
${i%-*-*}; done )" -- $cur ) )
+_arch_incomp() {
+ local regex="\s-(-${1#* }\s|${1% *})"; [[ $COMP_LINE =~ $regex ]]
}
-## makepkg completion
-
-_makepkg ()
-{
- local cur prev
+_makepkg() {
+ local cur opts prev
COMPREPLY=()
- cur=${COMP_WORDS[COMP_CWORD]}
+ cur=$(_get_cword)
prev=${COMP_WORDS[COMP_CWORD-1]}
-
- case "$prev" in
- -p)
- _filedir
- return 0
- ;;
- --help|--cleancache)
- COMPREPLY=''
- return 0
- ;;
- esac
-
- if [[ "$cur" == -* ]]; then
- COMPREPLY=( $( compgen -W '\
- -A --ignorearch \
- -b --builddeps \
- -c --clean \
- -C --cleancache \
- -d --nodeps \
- -e --noextract \
- -f --force \
- -g --geninteg \
- -h --help \
- -i --install \
- -L --log \
- -m --nocolor \
- -o --nobuild \
- -p \
- -r --rmdeps \
- -s --syncdeps \
- --asroot \
- --source \
- --noconfirm \
- --noprogressbar' -- $cur ) )
+ if [[ $cur == -* && $prev !=
@(--@(cleancache|config|help)|-@(C|h|p)) ]]; then
+ opts=('allsource asroot clean cleancache config force geninteg help
+ holdver ignorearch install log nobuild nocolor noconfirm
nodeps
+ noextract noprogressbar pkg repackage rmdeps skipinteg source
+ syncdeps' 'A C L R c d e f g h i m o p r s')
+ _arch_ptr2comp opts
fi
-
- rem_selected
+ true
}
-complete -o default -F _makepkg makepkg
-## pacman completion
-
-_instring ()
-{
- str="${1}"
- shift 1
- for c in "${@}"; do
- if [ $(\expr index "${str}" "${c}") -gt 0 ]; then
- return 0
+_pacman_pkg() {
+ local list=$(
+ if [[ $2 ]]; then
+ \pacman -$1 | \cut -d' ' -f1 | \sort -u
+ else
+ \pacman -$1
fi
- done
- return 1
+ )
+ _arch_compgen
}
-_pacman ()
-{
- local a arg toparse op mod cur
+_pacman() {
+ local common core cur prev query remove sync upgrade o
COMPREPLY=()
-
- # This argument parsing is done so we can check for flag existance
later
- # right now it's a tad crappy, but does the job
- for (( i=1; i < ${#COMP_WORDS[@]}-1; i++ )); do
- a=${COMP_WORDS[i]}
- arg="${a:0:2}"
- toparse="${a:2}"
-
- case "${arg}" in
- -@(U|R|S|Q|h|V))
- op="${arg/-}"
- mod="${mod}${a:2}"
- ;;
- --)
- arg="${a:2}"
- case "${arg}" in
- remove) op="R" ;;
- upgrade) op="U" ;;
- query) op="Q" ;;
- sync) op="S" ;;
- help) op="h" ;;
- version) op="V" ;;
- verbose) mod="${mod}v" ;;
- root) mod="${mod}r" ;;
- dbpath) mod="${mod}b" ;;
- nodeps) mod="${mod}d" ;;
- force) mod="${mod}f" ;;
- groups) mod="${mod}g" ;;
- info) mod="${mod}i" ;;
- list) mod="${mod}l" ;;
- print) mod="${mod}p" ;;
- search) mod="${mod}s" ;;
- sysupgrade) mod="${mod}u" ;;
- upgrades) mod="${mod}u" ;;
- downloadonly) mod="${mod}w" ;;
- refresh) mod="${mod}y" ;;
- changelog) mod="${mod}c" ;;
- deps) mod="${mod}d" ;;
- explicit) mod="${mod}e" ;;
- unrequired) mod="${mod}t" ;;
- foreign) mod="${mod}m" ;;
- owns) mod="${mod}o" ;;
- file) mod="${mod}p" ;;
- search) mod="${mod}s" ;;
- upgrades) mod="${mod}u" ;;
- cascade) mod="${mod}c" ;;
- check) mod="${mod}k" ;;
- dbonly) mod="${mod}k" ;;
- nosave) mod="${mod}n" ;;
- recursive) mod="${mod}s" ;;
- unneeded) mod="${mod}u" ;;
- esac ;;
- *) toparse="${a}" ;;
- esac
-
- arglen=$(( ${#toparse}-1 ))
- for c in $(\seq 0 "${arglen}"); do
- arg=${toparse:$c:1}
- [ "${arg}" != "-" ] && mod="${mod}${arg}"
- done
+ cur=$(_get_cword)
+ prev=${COMP_WORDS[COMP_CWORD-1]}
+ database=('asdeps asexplicit')
+ query=('changelog check deps explicit file foreign groups info
+ list owns quiet search unrequired upgrades' 'c e g i k l m o
p q s t u')
+ remove=('cascade dbonly nodeps nosave print recursive unneeded' 'c k
n p s u')
+ sync=('asdeps asexplicit clean downloadonly force groups ignore
+ ignoregroup info list needed nodeps print quiet refresh search
+ sysupgrade' 'c f g i l p q s u w y')
+ upgrade=('asdeps asexplicit force nodeps print' 'f p')
+ common=('arch cachedir config dbpath debug help logfile noconfirm
+ noprogressbar noscriptlet root verbose' 'b d h r v')
+ core=('database help query remove sync upgrade version' 'D Q R S U V
h')
+
+ for o in 'D database' 'Q query' 'R remove' 'S sync' 'U upgrade'; do
+ _arch_incomp "$o" && break
done
- cur=${COMP_WORDS[COMP_CWORD]}
-
- if [ $COMP_CWORD -eq 1 ] && [[ "$cur" == -* ]]; then
- COMPREPLY=( $( compgen -W '\
- -h --help \
- -Q --query \
- -R --remove \
- -S --sync \
- -U --upgrade \
- -V --version \
- ' -- $cur ) )
- rem_selected
- return 0
- fi
-
- if [[ "$cur" == -* ]]; then
- case "${op}" in
- U)
- COMPREPLY=( $( compgen -W '\
- --asdeps \
- --asexplicit \
- -d --nodeps \
- -f --force \
- -h --help \
- --config \
- --logfile \
- --noconfirm \
- --noprogressbar \
- --noscriptlet \
- -v --verbose \
- -r --root \
- -b --dbpath \
- -p --print \
- --print-format \
- --cachedir \
- ' -- $cur ) )
- return 0
- ;;
- R)
- COMPREPLY=( $( compgen -W '\
- -c --cascade \
- -d --nodeps \
- -h --help \
- -k --dbonly \
- -n --nosave \
- -s --recursive \
- -u --unneeded \
- --config \
- --logfile \
- --noconfirm \
- --noprogressbar \
- --noscriptlet \
- -v --verbose \
- -r --root \
- -b --dbpath \
- -p --print \
- --print-format \
- --cachedir \
- ' -- $cur ) )
- return 0
- ;;
- S)
- COMPREPLY=( $( compgen -W '\
- --asdeps \
- --asexplicit \
- -c --clean \
- -d --nodeps \
- -f --force \
- -g --groups \
- -h --help \
- -i --info \
- -l --list \
- -s --search \
- -u --sysupgrade \
- -w --downloadonly \
- -y --refresh \
- --needed \
- --ignore \
- --ignoregroup \
- --config \
- --logfile \
- --noconfirm \
- --noprogressbar \
- --noscriptlet \
- -v --verbose \
- -r --root \
- -b --dbpath \
- -p --print \
- --print-format \
- --cachedir \
- ' -- $cur ) )
- return 0
- ;;
- Q)
- COMPREPLY=( $( compgen -W '\
- -c --changelog \
- -d --deps \
- -e --explicit \
- -g --groups \
- -h --help \
- -i --info \
- -k --check \
- -l --list \
- -m --foreign \
- -o --owns \
- -p --file \
- -s --search \
- -t --unrequired \
- -u --upgrades \
- --config \
- --logfile \
- --noconfirm \
- --noprogressbar \
- --noscriptlet \
- -v --verbose \
- -r --root \
- -b --dbpath \
- --cachedir \
- ' -- $cur ) )
- return 0
- ;;
- esac
- rem_selected
+ if [[ $? != 0 ]]; then
+ _arch_ptr2comp core
+ elif [[ $prev != @(V|b|h|o|r) && $cur == -* &&
+ $prev !=
--@(cachedir|config|dbpath|file|help|logfile|owns|root|version) ]]
+ then
+ _arch_ptr2comp ${o#* } common
else
- case "${op}" in
- U)
- COMPREPLY=( $( compgen -d -- "$cur" ) \
- $( compgen -f -X '!*.pkg.tar.*' -- "$cur" ) )
- return 0
- ;;
- h|V)
- COMPREPLY=''
- return 0
- ;;
- Q)
- if _instring $mod g; then
- _installed_groups
- elif _instring $mod o; then
- COMPREPLY=( $( compgen -d -- "$cur" ) \
- $( compgen -f -- "$cur" ) )
- elif _instring $mod p; then
- COMPREPLY=( $( compgen -d -- "$cur" ) \
- $( compgen -f -X '!*.pkg.tar.*' -- "$cur" ) )
- elif _instring $mod u; then
- COMPREPLY=''
- return 0
- else
- _installed_pkgs
- fi
- return 0
- ;;
- R)
- _installed_pkgs
- return 0
- ;;
- S)
- if _instring $mod l; then
- _available_repos
- else
- _available_pkgs
- fi
- return 0
- ;;
+ case ${o% *} in
+ D|R)
+ _pacman_pkg Qq;;
+ Q)
+ _arch_incomp 'g groups' && _pacman_pkg Qg sort ||
+ _arch_incomp 'p file' && _filedir 'pkg.tar.*' ||
+ _arch_incomp 'o owns' || _arch_incomp 'u upgrades' ||
+ _pacman_pkg Qq;;
+ S)
+ _arch_incomp 'g groups' && _pacman_pkg Sg ||
+ _arch_incomp 'l list' && _pacman_pkg Sl sort ||
+ _pacman_pkg Slq;;
+ U)
+ _filedir 'pkg.tar.*';;
esac
fi
-
- rem_selected
+ true
}
+
+complete -o default -F _makepkg makepkg
complete -o filenames -F _pacman pacman
+
+# ex:et ts=2 sw=2 ft=sh
--
1.7.1
More information about the pacman-dev
mailing list