Ville Skyttä c875723bef Include trailing equals sign in options that take arguments that way.
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.
2011-05-02 11:45:55 +03:00

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