summaryrefslogtreecommitdiff
path: root/completions/rpm
diff options
context:
space:
mode:
Diffstat (limited to 'completions/rpm')
-rw-r--r--completions/rpm299
1 files changed, 299 insertions, 0 deletions
diff --git a/completions/rpm b/completions/rpm
new file mode 100644
index 00000000..f07ba7de
--- /dev/null
+++ b/completions/rpm
@@ -0,0 +1,299 @@
+# bash completion for rpm
+
+have rpm && {
+# helper functions
+
+_rpm_installed_packages()
+{
+ local nodig="$1" nosig="$2"
+
+ 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
+ _rpm_nodigsig
+ COMPREPLY=( $( rpm -qa $nodig $nosig --qf='%{NAME} ' "$cur*" ) )
+ fi
+}
+
+_rpm_groups()
+{
+ local IFS=$'\n'
+ COMPREPLY=( $( compgen -W "$( rpm -qa $nodig $nosig --queryformat \
+ '%{group}\n' )" -- "$cur" ) )
+}
+
+_rpm_nodigsig()
+{
+ if [[ -z "$nodig" && -z "$nosig" ]]; then
+ local rpmver
+
+ rpmver=$(rpm --version)
+ rpmver=${rpmver##* }
+
+ if [[ "$rpmver" > "4.0.4" ]]; then
+ nodig="--nodigest"
+ fi
+ if [[ "$rpmver" > "4.0.99" ]]; then
+ nosig="--nosignature"
+ fi
+ fi
+}
+
+# rpm(8) completion
+#
+_rpm()
+{
+ local cur prev opts nodig nosig
+
+ COMPREPLY=()
+ _get_comp_words_by_ref cur prev
+ nodig=""
+ nosig=""
+ _rpm_nodigsig
+
+ if [ $COMP_CWORD -eq 1 ]; then
+ # first parameter on line
+ case $cur in
+ -b*)
+ COMPREPLY=( $( compgen -W '-ba -bb -bc -bi -bl -bp -bs' \
+ -- "$cur" ) )
+ ;;
+ -t*)
+ COMPREPLY=( $( compgen -W '-ta -tb -tc -ti -tl -tp -ts' \
+ -- "$cur" ) )
+ ;;
+ --*)
+ COMPREPLY=( $( compgen -W '--help --version --initdb \
+ --checksig --recompile --rebuild --resign --addsign \
+ --rebuilddb --showrc --setperms --setugids --tarbuild \
+ --eval --install --upgrade --query --freshen --erase \
+ --verify --querytags --rmsource --rmspec --clean \
+ --import' -- "$cur" ) )
+ ;;
+ *)
+ COMPREPLY=( $( compgen -W '-b -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)
+ # get a list of macros
+ COMPREPLY=( $( compgen -W "$( rpm --showrc | sed -ne \
+ 's/^-\{0,1\}[0-9]\{1,\}[:=][[:space:]]\{1,\}\([^[:space:](]\{3,\}\).*/%\1/p' )" \
+ -- "$cur" ) )
+ 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 "$( rpm -qa $nodig $nosig \
+ --queryformat='%{providename}\n' )" -- "$cur" ) )
+ fi
+ return 0
+ ;;
+ --whatrequires)
+ if [[ "$cur" == */* ]]; then
+ _filedir
+ else
+ # complete on capabilities
+ local IFS=$'\n'
+ COMPREPLY=( $( compgen -W "$( rpm -qa $nodig $nosig \
+ --queryformat='%{requirename}\n' )" -- "$cur" ) )
+ fi
+ return 0
+ ;;
+ --target)
+ COMPREPLY=( $( compgen -W "$( command rpm --showrc | sed -ne \
+ 's/^\s*compatible\s\s*build\s\s*archs\s*:\s*\(.*\)/\1/ p' )" \
+ -- "$cur" ) )
+ return 0
+ ;;
+ --define|-D|--fileid|--hdrid|--pkgid)
+ # argument required but no completions available
+ return 0
+ ;;
+ esac
+
+ # options common to all modes
+ opts="--define --eval --macros --nodigest --nosignature --rcfile \
+ --quiet --pipe --verbose"
+
+ case ${COMP_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 "$nodig" "$nosig"
+ fi
+ ;;
+ -q*|--query)
+ # options common to all query types
+ opts="$opts --changelog --configfiles --conflicts --docfiles
+ --dump --enhances --filesbypkg --filecaps --fileclass
+ --filecolor --fileprovide --filerequire --filesbypkg --info
+ --list --obsoletes --pipe --provides --queryformat --rcfile
+ --requires --scripts --suggests --triggers --xml"
+
+ if [[ $COMP_LINE == *\ -@(*([^ -])f|-file )* ]]; then
+ # -qf completion
+ if [[ "$cur" == -* ]]; then
+ COMPREPLY=( $( compgen -W "$opts --dbpath --fscontext \
+ --last --root --state" -- "$cur" ) )
+ else
+ _filedir
+ fi
+ elif [[ $COMP_LINE == *\ -@(*([^ -])g|-group )* ]]; then
+ # -qg completion
+ _rpm_groups
+ elif [[ $COMP_LINE == *\ -@(*([^ -])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 [[ $COMP_LINE != *\ -@(*([^ -])a|-all )* ]]; then
+ _rpm_installed_packages "$nodig" "$nosig"
+ 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 [[ $COMP_LINE == *\ -@(*([^ -])f|-file )* ]]; then
+ _filedir
+ elif [[ $COMP_LINE == *\ -@(*([^ -])g|-group )* ]]; then
+ _rpm_groups
+ elif [[ $COMP_LINE == *\ -@(*([^ -])p|-package )* ]]; then
+ _filedir '[rs]pm'
+ else
+ _rpm_installed_packages "$nodig" "$nosig"
+ fi
+ ;;
+ -[bt]*)
+ if [[ "$cur" == -* ]]; then
+ COMPREPLY=( $( compgen -W "$opts --short-circuit --timecheck \
+ --clean --rmsource --rmspec --test --sign --buildroot \
+ --target --nobuild --nodeps --nodirtokens" -- "$cur" ) )
+ elif [[ ${COMP_WORDS[1]} == -b* ]]; then
+ _filedir spec
+ else
+ _filedir '@(t?(ar.)@([gx]z|bz?(2))|tar?(.@(lzma|Z)))'
+ fi
+ ;;
+ --rebuild|--recompile)
+ if [[ "$cur" == -* ]]; then
+ COMPREPLY=( $( compgen -W "$opts --nodeps --rmsource \
+ --rmspec --sign --nodirtokens --target" -- "$cur" ) )
+ else
+ _filedir '@(?(no)src.r|s)pm'
+ fi
+ ;;
+ --tarbuild)
+ _filedir '@(t?(ar.)@([gx]z|bz?(2))|tar?(.@(lzma|Z)))'
+ ;;
+ --resign|--addsign)
+ _filedir '[rs]pm'
+ ;;
+ --setperms|--setgids)
+ _rpm_installed_packages "$nodig" "$nosig"
+ ;;
+ --clean|--rmsource|--rmspec)
+ if [[ "$cur" == -* ]]; then
+ COMPREPLY=( $( compgen -W '--clean --rmsource --rmspec' \
+ -- "$cur" ) )
+ else
+ _filedir spec
+ fi
+ ;;
+ --import|--dbpath|--root)
+ if [[ "$cur" == -* ]]; then
+ COMPREPLY=( $( compgen -W '--import --dbpath --root' \
+ -- "$cur" ) )
+ else
+ _filedir
+ fi
+ ;;
+ esac
+
+ return 0
+}
+complete -F _rpm rpm rpmbuild
+}
+
+# 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