310 lines
10 KiB
Plaintext
310 lines
10 KiB
Plaintext
|
# bash completion for rpm
|
||
|
|
||
|
have rpm && {
|
||
|
# helper functions
|
||
|
|
||
|
_rpm_installed_packages()
|
||
|
{
|
||
|
local nodig="$1" nosig="$2"
|
||
|
|
||
|
if [[ -r /var/log/rpmpkgs && \
|
||
|
/var/log/rpmpkgs -nt /var/lib/rpm/Packages ]]; then
|
||
|
# using RHL 7.2 or later - this is quicker than querying the DB
|
||
|
COMPREPLY=( $( compgen -W "$( sed -ne \
|
||
|
's|^\([^[:space:]]\{1,\}\)-[^[:space:]-]\{1,\}-[^[:space:]-]\{1,\}\.rpm$|\1|p' \
|
||
|
/var/log/rpmpkgs )" -- "$cur" ) )
|
||
|
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()
|
||
|
{
|
||
|
local IFS=$'\n'
|
||
|
COMPREPLY=( $( compgen -W "$( rpm -qa $nodig $nosig --queryformat \
|
||
|
'%{group}\n' )" -- "$cur" ) )
|
||
|
}
|
||
|
|
||
|
_rpm_nodigsig()
|
||
|
{
|
||
|
if [[ -z "$nodig" && -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=()
|
||
|
_get_comp_words_by_ref cur prev
|
||
|
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
|
||
|
--dbpath|--excludepath|--prefix|--relocate|--root)
|
||
|
_filedir -d
|
||
|
return 0
|
||
|
;;
|
||
|
--eval|-E)
|
||
|
# get a list of macros
|
||
|
COMPREPLY=( $( compgen -W "$( rpm --showrc | sed -ne \
|
||
|
's/^-\{0,1\}[0-9]\{1,\}[:=][[:space:]]\{1,\}\([^[:space:](]\{3,\}\).*/%\1/p' )" \
|
||
|
-- "$cur" ) )
|
||
|
return 0
|
||
|
;;
|
||
|
--pipe)
|
||
|
_compopt_o_filenames
|
||
|
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\s*build\s\s*archs\s*:\s*\(.*\)/\1/ p' )" \
|
||
|
-- "$cur" ) )
|
||
|
return 0
|
||
|
;;
|
||
|
--define|-D|--fileid|--hdrid|--pkgid)
|
||
|
# 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 '[rs]pm'
|
||
|
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 --triggers --xml"
|
||
|
|
||
|
if [[ $COMP_LINE == *\ -@(*([^ -])f|-file )* ]]; then
|
||
|
# -qf completion
|
||
|
if [[ "$cur" == -* ]]; then
|
||
|
COMPREPLY=( $( compgen -W "$opts --dbpath --fscontext \
|
||
|
--last --root --state" -- "$cur" ) )
|
||
|
else
|
||
|
_filedir
|
||
|
fi
|
||
|
elif [[ $COMP_LINE == *\ -@(*([^ -])g|-group )* ]]; then
|
||
|
# -qg completion
|
||
|
_rpm_groups
|
||
|
elif [[ $COMP_LINE == *\ -@(*([^ -])p|-package )* ]]; then
|
||
|
# -qp; uninstalled package completion
|
||
|
if [[ "$cur" == -* ]]; then
|
||
|
COMPREPLY=( $( compgen -W "$opts --ftpport --ftpproxy \
|
||
|
--httpport --httpproxy --nomanifest" -- "$cur" ) )
|
||
|
else
|
||
|
_filedir '[rs]pm'
|
||
|
fi
|
||
|
else
|
||
|
# -q; installed package completion
|
||
|
if [[ "$cur" == -* ]]; then
|
||
|
COMPREPLY=( $( compgen -W "$opts --all --file --fileid
|
||
|
--dbpath --fscontext --ftswalk --group --hdrid --last
|
||
|
--package --pkgid --root --specfile --state
|
||
|
--triggeredby --whatprovides --whatrequires" \
|
||
|
-- "$cur" ) )
|
||
|
elif [[ $COMP_LINE != *\ -@(*([^ -])a|-all )* ]]; then
|
||
|
_rpm_installed_packages "$nodig" "$nosig"
|
||
|
fi
|
||
|
fi
|
||
|
;;
|
||
|
-K*|--checksig)
|
||
|
if [[ "$cur" == -* ]]; then
|
||
|
COMPREPLY=( $( compgen -W "$opts --nopgp --nogpg --nomd5" \
|
||
|
-- "$cur" ) )
|
||
|
else
|
||
|
_filedir '[rs]pm'
|
||
|
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|-file )* ]]; then
|
||
|
_filedir
|
||
|
elif [[ $COMP_LINE == *\ -@(*([^ -])g|-group )* ]]; then
|
||
|
_rpm_groups
|
||
|
elif [[ $COMP_LINE == *\ -@(*([^ -])p|-package )* ]]; then
|
||
|
_filedir '[rs]pm'
|
||
|
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
|
||
|
;;
|
||
|
--rebuild|--recompile)
|
||
|
if [[ "$cur" == -* ]]; then
|
||
|
COMPREPLY=( $( compgen -W "$opts --nodeps --rmsource \
|
||
|
--rmspec --sign --nodirtokens --target" -- "$cur" ) )
|
||
|
else
|
||
|
_filedir '@(?(no)src.r|s)pm'
|
||
|
fi
|
||
|
;;
|
||
|
--tarbuild)
|
||
|
_filedir '@(t?(ar.)@([gx]z|bz?(2))|tar?(.@(lzma|Z)))'
|
||
|
;;
|
||
|
--resign|--addsign)
|
||
|
_filedir '[rs]pm'
|
||
|
;;
|
||
|
--setperms|--setgids)
|
||
|
_rpm_installed_packages "$nodig" "$nosig"
|
||
|
;;
|
||
|
--clean|--rmsource|--rmspec)
|
||
|
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 rpm rpmbuild
|
||
|
}
|
||
|
|
||
|
have gendiff &&
|
||
|
_gendiff()
|
||
|
{
|
||
|
COMPREPLY=()
|
||
|
local cur cword
|
||
|
_get_comp_words_by_ref cur cword
|
||
|
[[ $cword != 1 ]] || _filedir -d
|
||
|
} &&
|
||
|
complete -F _gendiff gendiff
|
||
|
|
||
|
# 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
|