2e641b5c6f
Displayed completions are still wrong but now at least real ones containing spaces do work and unusual input does not cause grep errors. http://lists.alioth.debian.org/pipermail/bash-completion-devel/2009-May/001486.html
300 lines
7.7 KiB
Bash
300 lines
7.7 KiB
Bash
# -*- mode: shell-script; sh-basic-offset: 8; indent-tabs-mode: t -*-
|
|
# ex: ts=8 sw=8 noet filetype=sh
|
|
|
|
have rpm && {
|
|
# helper functions for rpm completion
|
|
#
|
|
_rpm_installed_packages()
|
|
{
|
|
local ver nodig="$1" nosig="$2"
|
|
|
|
if [ -r /var/log/rpmpkgs -a \
|
|
/var/log/rpmpkgs -nt /var/lib/rpm/Packages ]; then
|
|
# using RHL 7.2 or later - this is quicker than querying the DB
|
|
COMPREPLY=( $( sed -ne \
|
|
's|^\('$cur'[^[:space:]]*\)-[^[:space:]-]\+-[^[:space:]-]\+\.rpm$|\1|p' \
|
|
/var/log/rpmpkgs ) )
|
|
else
|
|
_rpm_nodigsig
|
|
COMPREPLY=( $( rpm -qa $nodig $nosig --qf='%{NAME} ' "$cur*" ) )
|
|
fi
|
|
}
|
|
|
|
_rpm_groups()
|
|
{
|
|
# TODO: shown completions are wrong but real ones work nevertheless
|
|
# http://lists.alioth.debian.org/pipermail/bash-completion-devel/2009-May/001486.html
|
|
local IFS=$'\n'
|
|
COMPREPLY=( $( compgen -W "$( rpm -qa $nodig $nosig --queryformat \
|
|
'%{group}\n' )" -- $cur ) )
|
|
}
|
|
|
|
_rpm_nodigsig()
|
|
{
|
|
if [ -z "$nodig" -a -z "$nosig" ]; then
|
|
local rpmver
|
|
|
|
rpmver=$(rpm --version)
|
|
rpmver=${rpmver##* }
|
|
|
|
if [[ "$rpmver" > "4.0.4" ]]; then
|
|
nodig="--nodigest"
|
|
fi
|
|
if [[ "$rpmver" > "4.0.99" ]]; then
|
|
nosig="--nosignature"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# rpm(8) completion
|
|
#
|
|
_rpm()
|
|
{
|
|
local cur prev nodig nosig
|
|
|
|
COMPREPLY=()
|
|
cur=`_get_cword`
|
|
prev=${COMP_WORDS[COMP_CWORD-1]}
|
|
nodig=""
|
|
nosig=""
|
|
_rpm_nodigsig
|
|
|
|
if [ $COMP_CWORD -eq 1 ]; then
|
|
# first parameter on line
|
|
case "$cur" in
|
|
-b*)
|
|
COMPREPLY=( $( compgen -W '-ba -bb -bc -bi -bl -bp -bs'\
|
|
-- $cur ) )
|
|
;;
|
|
-t*)
|
|
COMPREPLY=( $( compgen -W '-ta -tb -tc -ti -tl -tp -ts'\
|
|
-- $cur ) )
|
|
;;
|
|
--*)
|
|
COMPREPLY=( $( compgen -W '--help --version --initdb \
|
|
--checksig --recompile --rebuild --resign --addsign \
|
|
--rebuilddb --showrc --setperms --setugids --tarbuild \
|
|
--eval --install --upgrade --query --freshen --erase \
|
|
--verify --querytags --rmsource --rmspec --clean \
|
|
--import' -- $cur ) )
|
|
;;
|
|
*)
|
|
COMPREPLY=( $( compgen -W '-b -e -E -F -i -q -t -U -V' \
|
|
-- $cur ) )
|
|
;;
|
|
esac
|
|
|
|
return 0
|
|
fi
|
|
|
|
case "$prev" in
|
|
--@(@(db|exclude)path|prefix|relocate|root))
|
|
_filedir -d
|
|
return 0
|
|
;;
|
|
--eval|-E)
|
|
# get a list of macros
|
|
COMPREPLY=( $( rpm --showrc | sed -ne \
|
|
's/^-\?[0-9]\+[:=][[:space:]]\+\('${cur#%}'[^[:space:](]*\).*/\1/p' ) )
|
|
COMPREPLY=( "${COMPREPLY[@]/#/%}" )
|
|
return 0
|
|
;;
|
|
--pipe)
|
|
COMPREPLY=( $( compgen -c -- $cur ) )
|
|
return 0
|
|
;;
|
|
--rcfile)
|
|
_filedir
|
|
return 0
|
|
;;
|
|
--specfile)
|
|
# complete on .spec files
|
|
_filedir spec
|
|
return 0
|
|
;;
|
|
--whatprovides)
|
|
if [[ "$cur" == */* ]]; then
|
|
_filedir
|
|
else
|
|
# complete on capabilities
|
|
local IFS=$'\n'
|
|
COMPREPLY=( $( compgen -W "$( rpm -qa $nodig $nosig \
|
|
--queryformat='%{providename}\n' )" \
|
|
-- $cur ) )
|
|
fi
|
|
return 0
|
|
;;
|
|
--whatrequires)
|
|
if [[ "$cur" == */* ]]; then
|
|
_filedir
|
|
else
|
|
# complete on capabilities
|
|
local IFS=$'\n'
|
|
COMPREPLY=( $( compgen -W "$( rpm -qa $nodig $nosig \
|
|
--queryformat='%{requirename}\n' )" \
|
|
-- $cur ) )
|
|
fi
|
|
return 0
|
|
;;
|
|
--target)
|
|
COMPREPLY=( $( compgen -W "$( command rpm --showrc | sed -ne \
|
|
's/^\s*compatible\s\+build\s\+archs\s*:\s*\(.*\)/\1/ p' )" -- $cur ) )
|
|
return 0
|
|
;;
|
|
esac
|
|
|
|
case "${COMP_WORDS[1]}" in
|
|
-@([iFU]*|-install|-freshen|-upgrade))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '--percent --force --test \
|
|
--replacepkgs --replacefiles --root --excludedocs \
|
|
--includedocs --noscripts --rcfile --ignorearch \
|
|
--dbpath --prefix --ignoreos --nodeps --allfiles \
|
|
--ftpproxy --ftpport --justdb --httpproxy --httpport \
|
|
--noorder --relocate --badreloc --notriggers \
|
|
--excludepath --ignoresize --oldpackage --define \
|
|
--eval --pipe --queryformat --repackage --nosuggests \
|
|
--nodigest --nosignature' -- $cur ) )
|
|
else
|
|
_filedir 'rpm'
|
|
fi
|
|
;;
|
|
-@(e|-erase))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '--allmatches --noscripts \
|
|
--notriggers --nodeps --test --repackage' -- $cur ) )
|
|
else
|
|
_rpm_installed_packages "$nodig" "$nosig"
|
|
fi
|
|
;;
|
|
-@(q*|-query))
|
|
# check whether we're doing file completion
|
|
if [ "${COMP_LINE#* -*([^ -])f}" != "$COMP_LINE" ]; then
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '--scripts --root \
|
|
--rcfile --requires --ftpport --ftpproxy \
|
|
--httpproxy --httpport --provides --triggers \
|
|
--dump --changelog --dbpath \
|
|
--last --filesbypkg \
|
|
--info --list --state \
|
|
--docfiles --configfiles --queryformat \
|
|
--conflicts --obsoletes \
|
|
--nodigest --nosignature \
|
|
--suggests --enhances \
|
|
--triggerscripts' -- $cur ) )
|
|
else
|
|
_filedir
|
|
fi
|
|
elif [ "${COMP_LINE#* -*([^ -])g}" != "$COMP_LINE" ]; then
|
|
_rpm_groups
|
|
elif [ "${COMP_LINE#* -*([^ -])p}" != "$COMP_LINE" ]; then
|
|
# uninstalled package completion
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '--scripts --root \
|
|
--rcfile --whatprovides --whatrequires \
|
|
--requires --triggeredby --ftpport --ftpproxy \
|
|
--httpproxy --httpport --provides --triggers \
|
|
--dump --changelog --dbpath --filesbypkg \
|
|
--define --eval --pipe --showrc --info --list \
|
|
--state --docfiles --configfiles --queryformat\
|
|
--conflicts --obsoletes --nodigest \
|
|
--nosignature' -- $cur ) )
|
|
else
|
|
_filedir 'rpm'
|
|
fi
|
|
else
|
|
# installed package completion
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '--scripts --root \
|
|
--rcfile --whatprovides --whatrequires \
|
|
--requires --triggeredby --ftpport --ftpproxy \
|
|
--httpproxy --httpport --provides --triggers \
|
|
--dump --changelog --dbpath --specfile \
|
|
--querybynumber --last --filesbypkg --define \
|
|
--eval --pipe --showrc --info --list --state \
|
|
--docfiles --configfiles --queryformat \
|
|
--conflicts --obsoletes --pkgid --hdrid \
|
|
--fileid --tid --nodigest --nosignature \
|
|
--triggerscripts' -- $cur ) )
|
|
elif [ "${COMP_LINE#* -*([^ -])a}" == "$COMP_LINE" ]; then
|
|
_rpm_installed_packages "$nodig" "$nosig"
|
|
fi
|
|
fi
|
|
;;
|
|
-@(K*|-checksig))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '--nopgp --nogpg --nomd5 \
|
|
--nodigest --nosignature' -- $cur ) )
|
|
else
|
|
_filedir 'rpm'
|
|
fi
|
|
;;
|
|
-@([Vy]*|-verify))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '--root --rcfile --dbpath \
|
|
--nodeps --nogroup --nolinkto --nomode --nomtime \
|
|
--nordev --nouser --nofiles --noscripts --nomd5 \
|
|
--querytags --specfile --whatrequires --whatprovides \
|
|
--nodigest --nosignature' -- $cur ) )
|
|
# check whether we're doing file completion
|
|
elif [ "${COMP_LINE#* -*([^ -])f}" != "$COMP_LINE" ]; then
|
|
_filedir
|
|
elif [ "${COMP_LINE#* -*([^ -])g}" != "$COMP_LINE" ]; then
|
|
_rpm_groups
|
|
elif [ "${COMP_LINE#* -*([^ -])p}" != "$COMP_LINE" ]; then
|
|
_filedir 'rpm'
|
|
else
|
|
_rpm_installed_packages "$nodig" "$nosig"
|
|
fi
|
|
;;
|
|
-[bt]*)
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '--short-circuit --timecheck \
|
|
--clean --rmsource --rmspec --test --sign --buildroot \
|
|
--target --nobuild --nodeps --nodirtokens' -- $cur ) )
|
|
elif [[ ${COMP_WORDS[1]} == -b* ]]; then
|
|
_filedir 'spec'
|
|
else
|
|
_filedir '@(tgz|tar.@(gz|bz2|lzma))'
|
|
fi
|
|
;;
|
|
--re@(build|compile))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '--nodeps --rmsource \
|
|
--rmspec --sign --nodirtokens --target' -- $cur ) )
|
|
else
|
|
_filedir '?(no)src.rpm'
|
|
fi
|
|
;;
|
|
--tarbuild)
|
|
_filedir '@(tgz|tar.@(gz|bz2|lzma))'
|
|
;;
|
|
--@(re|add)sign)
|
|
_filedir 'rpm'
|
|
;;
|
|
--set@(perms|gids))
|
|
_rpm_installed_packages "$nodig" "$nosig"
|
|
;;
|
|
--@(clean|rms@(ource|pec)))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '--clean --rmsource \
|
|
--rmspec' -- $cur ) )
|
|
else
|
|
_filedir 'spec'
|
|
fi
|
|
;;
|
|
--@(import|dbpath|root))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '--import --dbpath --root' \
|
|
-- $cur ) )
|
|
else
|
|
_filedir
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
return 0
|
|
}
|
|
complete -F _rpm $filenames rpm rpmbuild
|
|
}
|