mirror of
https://github.com/moparisthebest/pacman
synced 2024-12-23 00:08:50 -05:00
80f7c1707c
* Undeclared local vars with common enough names to warrant breakage * Performance issues with _pacman trying to replicate /usr/bin/pacman with find and other slow tools. * Performance issues with expanding an array (with sometimes hundreds of items) over three times. * Expanding said array to remove already completed entries had the side effect of braking filenames with spaces and or \n. * add -D --database options and --print * fix dirs showing up when they shouldn't in completions * completions regarding database entries shouldn't trigger filename completion. This is now down to 106 lines. The original one (master) is 365 lines long, yet this one retains all functionality. The work is documented in FS#16630. Signed-off-by: Andres P <stderr@mail.com> Signed-off-by: Xavier Chantry <chantry.xavier@gmail.com> Signed-off-by: Dan McGee <dan@archlinux.org>
109 lines
3.0 KiB
Bash
109 lines
3.0 KiB
Bash
# This file is in the public domain.
|
|
|
|
_arch_compgen() {
|
|
local i r
|
|
COMPREPLY=($(compgen -W '$*' -- "$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
|
|
done
|
|
}
|
|
|
|
_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 $list
|
|
}
|
|
|
|
_arch_incomp() {
|
|
local r="\s-(-${1#* }\s|\w*${1% *})"; [[ $COMP_LINE =~ $r ]]
|
|
}
|
|
|
|
_makepkg() {
|
|
local cur opts prev
|
|
COMPREPLY=()
|
|
cur=$(_get_cword)
|
|
prev=${COMP_WORDS[COMP_CWORD-1]}
|
|
if [[ $cur = -* && ! $prev =~ ^-(-(cleancache|config|help)$|\w*[Chp]) ]]; 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
|
|
true
|
|
}
|
|
|
|
_pacman_pkg() {
|
|
_arch_compgen "$(
|
|
if [[ $2 ]]; then
|
|
\pacman -$1 | \cut -d' ' -f1 | \sort -u
|
|
else
|
|
\pacman -$1
|
|
fi
|
|
)"
|
|
}
|
|
|
|
_pacman_file() {
|
|
compopt -o filenames; _filedir 'pkg.tar.*'
|
|
}
|
|
|
|
_pacman() {
|
|
local common core cur database prev query remove sync upgrade o
|
|
COMPREPLY=()
|
|
cur=$(_get_cword)
|
|
prev=${COMP_WORDS[COMP_CWORD-1]}
|
|
database=('asdeps asexplicit')
|
|
query=('changelog check deps explicit file foreign groups info list owns
|
|
search unrequired upgrades' 'c e g i k l m o p 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 refresh search sysupgrade'
|
|
'c f g i l p s u w y')
|
|
upgrade=('asdeps asexplicit force nodeps print' 'f p')
|
|
common=('arch cachedir config dbpath debug help logfile noconfirm
|
|
noprogressbar noscriptlet quiet root verbose' 'b d h q 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
|
|
|
|
if [[ $? != 0 ]]; then
|
|
_arch_ptr2comp core
|
|
elif ! [[ $prev =~ ^-\w*[Vbhr] ||
|
|
$prev = --@(cachedir|config|dbpath|help|logfile|root|version) ]]
|
|
then
|
|
[[ $cur = -* ]] && _arch_ptr2comp ${o#* } common ||
|
|
case ${o% *} in
|
|
D|R)
|
|
_pacman_pkg Qq;;
|
|
Q)
|
|
{ _arch_incomp 'g groups' && _pacman_pkg Qg sort; } ||
|
|
{ _arch_incomp 'p file' && _pacman_file; } ||
|
|
_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)
|
|
_pacman_file;;
|
|
esac
|
|
fi
|
|
true
|
|
}
|
|
|
|
complete -F _makepkg -o default makepkg
|
|
complete -F _pacman -o default pacman
|
|
|
|
# ex:et ts=2 sw=2 ft=sh
|