You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
303 lines
9.8 KiB
303 lines
9.8 KiB
# 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
|
|
|