diff options
Diffstat (limited to 'completions/rpm')
-rw-r--r-- | completions/rpm | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/completions/rpm b/completions/rpm new file mode 100644 index 0000000..8299a37 --- /dev/null +++ b/completions/rpm @@ -0,0 +1,302 @@ +# 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 "$(command 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 | command sed -ne \ + 's/^-\{0,1\}[0-9]\{1,\}[:=][[:space:]]\{1,\}\([^[:space:](]\{3,\}\).*/%\1/p')" \ + -- "$cur")) +} + +_rpm_buildarchs() +{ + COMPREPLY=($(compgen -W "$(${1:-rpm} --showrc | command 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 == 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 + fi + + case $prev in + --dbpath | --excludepath | --prefix | --relocate | --root | -!(-*)r) + _filedir -d + return + ;; + --eval | -!(-*)E) + _rpm_macros $1 + return + ;; + --pipe) + compopt -o filenames + COMPREPLY=($(compgen -c -- "$cur")) + return + ;; + --rcfile) + _filedir + return + ;; + --specfile) + # complete on .spec files + _filedir spec + return + ;; + --whatenhances | --whatprovides | --whatrecommends | --whatrequires | \ + --whatsuggests | --whatsupplements) + if [[ $cur == */* ]]; then + _filedir + else + # complete on capabilities + local IFS=$'\n' fmt + case $prev in + *enhances) fmt="%{ENHANCENAME}" ;; + *provides) fmt="%{PROVIDENAME}" ;; + *recommends) fmt="%{RECOMMENDNAME}" ;; + *requires) fmt="%{REQUIRENAME}" ;; + *suggests) fmt="%{SUGGESTNAME}" ;; + *supplements) fmt="%{SUPPLEMENTNAME}" ;; + esac + COMPREPLY=($(compgen -W "$($1 -qa --nodigest --nosignature \ + --queryformat=\"$fmt\\n\" 2>/dev/null | + command grep -vF '(none)')" -- "$cur")) + fi + return + ;; + --define | --fileid | --hdrid | --pkgid | -!(-*)D) + # argument required but no completions available + return + ;; + esac + + $split && return + + # 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 --recommends + --supplements --filetriggers --licensefiles" + + 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 --whatenhances --whatprovides + --whatrecommends --whatrequires --whatsuggests + --whatsupplements" \ + -- "$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 + --whatenhances --whatprovides --whatrecommends + --whatrequires --whatsuggests --whatsupplements" \ + -- "$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 +} && + 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 | --dbpath | -!(-*)r) + _filedir -d + return + ;; + --target) + _rpm_buildarchs $rpm + return + ;; + --eval | -!(-*)E) + _rpm_macros $rpm + return + ;; + --macros | --rcfile) + _filedir + return + ;; + --buildpolicy) + local cfgdir=$($rpm --eval '%{_rpmconfigdir}' 2>/dev/null) + if [[ $cfgdir ]]; then + COMPREPLY=($(compgen -W "$(command ls $cfgdir 2>/dev/null | + command sed -ne 's/^brp-//p')" -- "$cur")) + fi + ;; + --define | --with | --without | -!(-*)D) + return + ;; + esac + + $split && return + + if [[ $cur == -* ]]; then + COMPREPLY=($(compgen -W "$(_parse_help "$1")" -- "$cur")) + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + return + fi + + # Figure out file extensions to complete + local word ext + for word in "${words[@]}"; do + case $word in + -b? | --clean | --nobuild) + 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: filetype=sh |