diff options
Diffstat (limited to 'completions/rpm')
-rw-r--r-- | completions/rpm | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/completions/rpm b/completions/rpm new file mode 100644 index 00000000..f07ba7de --- /dev/null +++ b/completions/rpm @@ -0,0 +1,299 @@ +# 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 +} + +# 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 |