885e6dd6b6
Definitions are still present though, tentatively scheduled for removal as of 2.0.
301 lines
10 KiB
Bash
301 lines
10 KiB
Bash
# bash completion for rpm
|
|
|
|
have rpm && {
|
|
# helper functions
|
|
|
|
_rpm_installed_packages()
|
|
{
|
|
local 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 ) )
|
|
elif type rpmqpack &>/dev/null ; then
|
|
# SUSE's rpmqpack is faster than rpm -qa
|
|
COMPREPLY=( $( compgen -W '$( rpmqpack )' -- "$cur" ) )
|
|
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 opts 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
|
|
;;
|
|
--define|-D)
|
|
# argument required but no completions available
|
|
return 0
|
|
;;
|
|
esac
|
|
|
|
# options common to all modes
|
|
opts="--define --eval --macros --nodigest --nosignature --rcfile \
|
|
--quiet --pipe --verbose"
|
|
|
|
case "${COMP_WORDS[1]}" in
|
|
-@([iFU]*|-install|-freshen|-upgrade))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W "$opts --percent --force \
|
|
--test --replacepkgs --replacefiles --root \
|
|
--excludedocs --includedocs --noscripts --ignorearch \
|
|
--dbpath --prefix --ignoreos --nodeps --allfiles \
|
|
--ftpproxy --ftpport --justdb --httpproxy --httpport \
|
|
--noorder --relocate --badreloc --notriggers \
|
|
--excludepath --ignoresize --oldpackage \
|
|
--queryformat --repackage --nosuggests" -- "$cur" ) )
|
|
else
|
|
_filedir 'rpm'
|
|
fi
|
|
;;
|
|
-@(e|-erase))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W "$opts --allmatches \
|
|
--noscripts --notriggers --nodeps --test --repackage" \
|
|
-- "$cur" ) )
|
|
else
|
|
_rpm_installed_packages "$nodig" "$nosig"
|
|
fi
|
|
;;
|
|
-@(q*|-query))
|
|
# options common to all query types
|
|
opts="$opts --changelog --configfiles --conflicts --docfiles
|
|
--dump --enhances --filesbypkg --filecaps --fileclass
|
|
--filecolor --fileprovide --filerequire --filesbypkg
|
|
--info --list --obsoletes --pipe --provides
|
|
--queryformat --rcfile --requires --scripts --suggests
|
|
--triggeredby --triggers --whatprovides --whatrequires --xml"
|
|
|
|
if [ "${COMP_LINE#* -*([^ -])f}" != "$COMP_LINE" ]; then
|
|
# -qf completion
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W "$opts --dbpath --fscontext \
|
|
--last --root --state" -- "$cur" ) )
|
|
else
|
|
_filedir
|
|
fi
|
|
elif [ "${COMP_LINE#* -*([^ -])g}" != "$COMP_LINE" ]; then
|
|
# -qg completion
|
|
_rpm_groups
|
|
elif [ "${COMP_LINE#* -*([^ -])p}" != "$COMP_LINE" ]; then
|
|
# -qp; uninstalled package completion
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W "$opts --ftpport --ftpproxy \
|
|
--httpport --httpproxy" -- "$cur" ) )
|
|
else
|
|
_filedir 'rpm'
|
|
fi
|
|
else
|
|
# -q; installed package completion
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W "$opts --dbpath --fscontext \
|
|
--last --root --state" -- "$cur" ) )
|
|
elif [ "${COMP_LINE#* -*([^ -])a}" == "$COMP_LINE" ]; then
|
|
_rpm_installed_packages "$nodig" "$nosig"
|
|
fi
|
|
fi
|
|
;;
|
|
-@(K*|-checksig))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W "$opts --nopgp --nogpg --nomd5" \
|
|
-- "$cur" ) )
|
|
else
|
|
_filedir 'rpm'
|
|
fi
|
|
;;
|
|
-@([Vy]*|-verify))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W "$opts --root --dbpath --nodeps \
|
|
--nogroup --nolinkto --nomode --nomtime --nordev --nouser \
|
|
--nofiles --noscripts --nomd5 --querytags --specfile \
|
|
--whatrequires --whatprovides" -- "$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 "$opts --short-circuit --timecheck \
|
|
--clean --rmsource --rmspec --test --sign --buildroot \
|
|
--target --nobuild --nodeps --nodirtokens" -- "$cur" ) )
|
|
elif [[ ${COMP_WORDS[1]} == -b* ]]; then
|
|
_filedir 'spec'
|
|
else
|
|
_filedir '@(t?(ar.)@([gx]z|bz?(2))|tar.@(lzma|Z))'
|
|
fi
|
|
;;
|
|
--re@(build|compile))
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W "$opts --nodeps --rmsource \
|
|
--rmspec --sign --nodirtokens --target" -- "$cur" ) )
|
|
else
|
|
_filedir '?(no)src.rpm'
|
|
fi
|
|
;;
|
|
--tarbuild)
|
|
_filedir '@(t?(ar.)@([gx]z|bz?(2))|tar.@(lzma|Z))'
|
|
;;
|
|
--@(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 -o filenames rpm rpmbuild
|
|
}
|
|
|
|
# Local variables:
|
|
# mode: shell-script
|
|
# sh-basic-offset: 4
|
|
# sh-indent-comment: t
|
|
# indent-tabs-mode: nil
|
|
# End:
|
|
# ex: ts=4 sw=4 et filetype=sh
|