| # bash completion for rpm -*- shell-script -*- |
| |
| # helper functions |
| |
| _rpm_installed_packages() |
| { |
| 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 |
| COMPREPLY=( $( ${1:-rpm} -qa --nodigest --nosignature \ |
| --queryformat='%{NAME} ' "$cur*" 2>/dev/null ) ) |
| fi |
| } |
| |
| _rpm_groups() |
| { |
| local IFS=$'\n' |
| COMPREPLY=( $( compgen -W "$( ${1:-rpm} -qa --nodigest --nosignature \ |
| --queryformat='%{GROUP}\n' 2>/dev/null )" -- "$cur" ) ) |
| } |
| |
| _rpm_macros() |
| { |
| # get a list of macros |
| COMPREPLY=( $( compgen -W "$( ${1:-rpm} --showrc | sed -ne \ |
| 's/^-\{0,1\}[0-9]\{1,\}[:=][[:space:]]\{1,\}\([^[:space:](]\{3,\}\).*/%\1/p' )" \ |
| -- "$cur" ) ) |
| } |
| |
| _rpm_buildarchs() |
| { |
| COMPREPLY=( $( compgen -W "$( ${1:-rpm} --showrc | sed -ne \ |
| 's/^\s*compatible\s\s*build\s\s*archs\s*:\s*\(.*\)/\1/ p' )" \ |
| -- "$cur" ) ) |
| } |
| |
| # rpm(8) completion |
| # |
| _rpm() |
| { |
| local cur prev words cword split |
| _init_completion -s || return |
| |
| if [[ $cword -eq 1 ]]; then |
| # first parameter on line |
| case $cur in |
| --*) |
| COMPREPLY=( $( compgen -W '--help --version --initdb |
| --checksig --addsign --delsign --rebuilddb --showrc |
| --setperms --setugids --eval --install --upgrade --query |
| --freshen --erase --verify --querytags --import' \ |
| -- "$cur" ) ) |
| ;; |
| *) |
| COMPREPLY=( $( compgen -W '-e -E -F -i -q -t -U -V' \ |
| -- "$cur" ) ) |
| ;; |
| esac |
| return 0 |
| fi |
| |
| case $prev in |
| --dbpath|--excludepath|--prefix|--relocate|--root|-r) |
| _filedir -d |
| return 0 |
| ;; |
| --eval|-E) |
| _rpm_macros $1 |
| 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 "$( $1 -qa --nodigest --nosignature \ |
| --queryformat='%{PROVIDENAME}\n' 2>/dev/null )" \ |
| -- "$cur" ) ) |
| fi |
| return 0 |
| ;; |
| --whatrequires) |
| if [[ "$cur" == */* ]]; then |
| _filedir |
| else |
| # complete on capabilities |
| local IFS=$'\n' |
| COMPREPLY=( $( compgen -W "$( $1 -qa --nodigest --nosignature \ |
| --queryformat='%{REQUIRENAME}\n' 2>/dev/null )" \ |
| -- "$cur" ) ) |
| fi |
| return 0 |
| ;; |
| --define|-D|--fileid|--hdrid|--pkgid) |
| # argument required but no completions available |
| return 0 |
| ;; |
| esac |
| |
| $split && return 0 |
| |
| # options common to all modes |
| local opts="--define= --eval= --macros= --nodigest --nosignature --rcfile= |
| --quiet --pipe --verbose" |
| |
| case ${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 $1 |
| fi |
| ;; |
| -q*|--query) |
| # options common to all query types |
| opts+=" --changelog --configfiles --conflicts --docfiles --dump |
| --enhances --filesbypkg --filecaps --fileclass --filecolor |
| --fileprovide --filerequire --filesbypkg --info --list |
| --obsoletes --pipe --provides --queryformat= --requires |
| --scripts --suggests --triggers --xml" |
| |
| if [[ ${words[@]} == *\ -@(*([^ -])f|-file )* ]]; then |
| # -qf completion |
| if [[ "$cur" == -* ]]; then |
| COMPREPLY=( $( compgen -W "$opts --dbpath --fscontext |
| --last --root --state" -- "$cur" ) ) |
| else |
| _filedir |
| fi |
| elif [[ ${words[@]} == *\ -@(*([^ -])g|-group )* ]]; then |
| # -qg completion |
| _rpm_groups $1 |
| elif [[ ${words[@]} == *\ -@(*([^ -])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 [[ ${words[@]} != *\ -@(*([^ -])a|-all )* ]]; then |
| _rpm_installed_packages $1 |
| 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 [[ ${words[@]} == *\ -@(*([^ -])f|-file )* ]]; then |
| _filedir |
| elif [[ ${words[@]} == *\ -@(*([^ -])g|-group )* ]]; then |
| _rpm_groups $1 |
| elif [[ ${words[@]} == *\ -@(*([^ -])p|-package )* ]]; then |
| _filedir '[rs]pm' |
| else |
| _rpm_installed_packages $1 |
| fi |
| ;; |
| --resign|--addsign|--delsign) |
| _filedir '[rs]pm' |
| ;; |
| --setperms|--setgids) |
| _rpm_installed_packages $1 |
| ;; |
| --import|--dbpath|--root) |
| if [[ "$cur" == -* ]]; then |
| COMPREPLY=( $( compgen -W '--import --dbpath --root=' \ |
| -- "$cur" ) ) |
| else |
| _filedir |
| fi |
| ;; |
| esac |
| [[ $COMPREPLY == *= ]] && compopt -o nospace |
| |
| return 0 |
| } && |
| complete -F _rpm rpm |
| |
| _rpmbuild() |
| { |
| local cur prev words cword split |
| _init_completion -s || return |
| |
| local rpm="${1%build*}" |
| [[ $rpm == $1 ]] || ! type $rpm &>/dev/null && rpm= |
| |
| case $prev in |
| --buildroot|--root|-r|--dbpath) |
| _filedir -d |
| return 0 |
| ;; |
| --target) |
| _rpm_buildarchs |
| return 0 |
| ;; |
| --eval|-E) |
| _rpm_macros $rpm |
| return 0 |
| ;; |
| --macros|--rcfile) |
| _filedir |
| return 0 |
| ;; |
| --buildpolicy) |
| local cfgdir=$( $rpm --eval '%{_rpmconfigdir}' 2>/dev/null ) |
| if [[ $cfgdir ]]; then |
| COMPREPLY=( $( compgen -W "$( command ls $cfgdir 2>/dev/null \ |
| | sed -ne 's/^brp-//p' )" -- "$cur" ) ) |
| fi |
| ;; |
| --define|-D|--with|--without) |
| return 0 |
| ;; |
| esac |
| |
| $split && return 0 |
| |
| if [[ $cur == -* ]]; then |
| COMPREPLY=( $( compgen -W "$( _parse_help "$1" )" -- "$cur" ) ) |
| [[ $COMPREPLY == *= ]] && compopt -o nospace |
| return 0 |
| fi |
| |
| # Figure out file extensions to complete |
| local word ext |
| for word in ${words[@]}; do |
| case $word in |
| -b?) |
| ext=spec |
| break |
| ;; |
| -t?|--tarbuild) |
| ext='@(t?(ar.)@([gx]z|bz?(2))|tar?(.@(lzma|Z)))' |
| break |
| ;; |
| --rebuild|--recompile) |
| ext='@(?(no)src.r|s)pm' |
| break |
| ;; |
| esac |
| done |
| [[ -n $ext ]] && _filedir $ext |
| } && |
| complete -F _rpmbuild rpmbuild rpmbuild-md5 |
| |
| # ex: ts=4 sw=4 et filetype=sh |