c875723bef
This way it's clearer to users that an argument is expected. It's likely that this commit does not catch all such cases, but it should do it for most of the affected commands I have installed.
319 lines
10 KiB
Bash
319 lines
10 KiB
Bash
# bash completion for rpm
|
|
|
|
have rpm && {
|
|
# 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(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 --resign --addsign --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)
|
|
_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)
|
|
_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)
|
|
COMPREPLY=( $( compgen -W "$( $rpm --showrc | sed -ne \
|
|
's/^\s*compatible\s\s*build\s\s*archs\s*:\s*\(.*\)/\1/ p' )" \
|
|
-- "$cur" ) )
|
|
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
|
|
}
|
|
|
|
have gendiff &&
|
|
_gendiff()
|
|
{
|
|
local cur prev words cword
|
|
_init_completion -o @(diff|patch) || return
|
|
|
|
[[ $cword -eq 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
|