# 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