From 2ba985fe5b8d3c61aa8c066c9cb14165a409e90b Mon Sep 17 00:00:00 2001 From: Paul Seyfert Date: Sun, 23 Oct 2016 01:42:46 +0200 Subject: 39920: extend yum completion adding the following yum commands: * update-to (just what update expands) * upgrade-to (just what update expands) * history (the actual tricky one) * help (printing the available commands) * load-transaction (_files) * load-ts (_files) * check (just what the man page suggested) * reinstall (just what erase does - suggest installed packages) * downgrade (just what erase does - suggest installed packages) * repolist (just what the man page suggested) * distribution-synchronization (just what erase does - suggest installed packages) * distro-sync (just what erase does - suggest installed packages) A few history commands don't get expanded. Taken from the man page of yum 3.2.29. Reindented file. --- Completion/Redhat/Command/_yum | 543 ++++++++++++++++++++++++++--------------- 1 file changed, 346 insertions(+), 197 deletions(-) (limited to 'Completion/Redhat/Command/_yum') diff --git a/Completion/Redhat/Command/_yum b/Completion/Redhat/Command/_yum index f4538060e..69a8de9a2 100644 --- a/Completion/Redhat/Command/_yum +++ b/Completion/Redhat/Command/_yum @@ -1,299 +1,448 @@ #compdef yum # Main dispatcher -_yum() -{ - local curcontext="$curcontext" state lstate line - - _arguments -s \ - '(- *)'{-h,--help}'[show the help message]' \ - '(-t --tolerant)'{-t,--tolerant}'[be tolerant of errors]' \ - '(-C --cacheonly)'{-C,--cacheonly}'[run entirely from cache]' \ - '(-c --config)'{-c,--config=}'[config file location]:Yum conf file:_files' \ - '(-R --randomwait)'{-R,--randomwait=}'[maximum command wait time (in minutes)]:max wait time' \ - '(-d --debuglevel)'{-d,--debuglevel=}'[debug level (0-10)]:debug level' \ - '(-e --errorlevel)'{-e,--errorlevel=}'[error level (0-10)]:error level' \ - '(-y --assumeyes)'{-y,--assumeyes}'[answer yes for all questions]' \ - '--installroot=[set install root]:install root:_files -/' \ - '*--enablerepo=[enable or or more repositories]:repos to enable:_yum_disabled_repos_list' \ - '*--disablerepo=[disable one or more repositories]:disable repos:_yum_enabled_repos_list' \ - {*-x,*--exclude=}'[exclude package(s) by name or glob]:exclude packages' \ - '--version[show yum version]' \ - '--obsoletes[enable obsoletes processing during updates]' \ - '--nogpgcheck[disable gpg signature checking]' \ - '--noplugins[disable yum plugins]' \ - '--disablepresto[disable Presto plugin and don''''t download any deltarpms]' \ - '*::yum command:_yum_command' -} - -(( $+functions[_yum_command] )) || _yum_command() +_yum() { + local curcontext="$curcontext" state lstate line + + _arguments -s \ + '(- *)'{-h,--help}'[show the help message]' \ + '(-t --tolerant)'{-t,--tolerant}'[be tolerant of errors]' \ + '(-C --cacheonly)'{-C,--cacheonly}'[run entirely from cache]' \ + '(-c --config)'{-c,--config=}'[config file location]:Yum conf file:_files' \ + '(-R --randomwait)'{-R,--randomwait=}'[maximum command wait time (in minutes)]:max wait time' \ + '(-d --debuglevel)'{-d,--debuglevel=}'[debug level (0-10)]:debug level' \ + '(-e --errorlevel)'{-e,--errorlevel=}'[error level (0-10)]:error level' \ + '(-y --assumeyes)'{-y,--assumeyes}'[answer yes for all questions]' \ + '--installroot=[set install root]:install root:_files -/' \ + '*--enablerepo=[enable or or more repositories]:repos to enable:_yum_disabled_repos_list' \ + '*--disablerepo=[disable one or more repositories]:disable repos:_yum_enabled_repos_list' \ + {*-x,*--exclude=}'[exclude package(s) by name or glob]:exclude packages' \ + '--version[show yum version]' \ + '--obsoletes[enable obsoletes processing during updates]' \ + '--nogpgcheck[disable gpg signature checking]' \ + '--noplugins[disable yum plugins]' \ + '--disablepresto[disable Presto plugin and don''''t download any deltarpms]' \ + '*::yum command:_yum_command' +} + +(( $+functions[_yum_command] )) || _yum_command() { - local -a _yum_cmds - _yum_cmds=( - "install:install the latest version of a package or group of packages" - "erase:remove an installed package (with its dependencies)" - "remove:remove an installed package (with its dependencies)" - "clean:clean local yum cache" - "deplist:gives a list of all dependencies for a package" - "check-update:check if any updates are available" - "info:get description of available packages" - "list:is used to list various information about packages" - "groupinfo:get info on package groups" - "groupinstall:install a package group or groups" - "groupremove:remove a package group or groups" - "grouplist:list package groups" - "groupupdate:update a package group or groups" - "localinstall:install packages with local rpm files" - "localupdate:update packages with local rpm files" - "makecache:makes a local yum cache" - "provides:find out which package provides some feature or file" - "whatprovides:find out which package provides some feature or file" - "resolvedep:list packages providing the specified dependencies" - "search:find any packages matching pattern" - "shell:enter the 'yum shell'" - "update:update one or more packages" - "upgrade:upgrade one or more packages" - ) - - if (( CURRENT == 1 )); then - _describe -t commands 'yum command' _yum_cmds || compadd "$@" - else - local curcontext="$curcontext" - - cmd="${${_yum_cmds[(r)$words[1]:*]%%:*}}" - # Deal with any aliases - case $cmd in - remove) cmd="erase";; - whatprovides) cmd="provides";; - upgrade) cmd="update";; - esac - - if (( $#cmd )); then - curcontext="${curcontext%:*:*}:yum-${cmd}:" - - local update_policy - zstyle -s ":completion:${curcontext}:" cache-policy update_policy - if [[ -z "$update_policy" ]]; then - zstyle ":completion:${curcontext}:" cache-policy _yum_caching_policy - fi - - _call_function ret _yum_$cmd || _message 'no more arguments' - else - _message "unknown yum command: $words[1]" - fi - return ret - fi + local -a _yum_cmds + _yum_cmds=( + "install:install the latest version of a package or group of packages" + "erase:remove an installed package (with its dependencies)" + "remove:remove an installed package (with its dependencies)" + "clean:clean local yum cache" + "deplist:gives a list of all dependencies for a package" + "check-update:check if any updates are available" + "info:get description of available packages" + "list:is used to list various information about packages" + "groupinfo:get info on package groups" + "groupinstall:install a package group or groups" + "groupremove:remove a package group or groups" + "grouplist:list package groups" + "groupupdate:update a package group or groups" + "localinstall:install packages with local rpm files" + "localupdate:update packages with local rpm files" + "makecache:makes a local yum cache" + "provides:find out which package provides some feature or file" + "whatprovides:find out which package provides some feature or file" + "resolvedep:list packages providing the specified dependencies" + "search:find any packages matching pattern" + "shell:enter the 'yum shell'" + "update:update one or more packages" + "upgrade:upgrade one or more packages" + "update-to:update one or more packages taking obsoletes into account" + "upgrade-to:upgrade one or more packages taking obsoletes into account" + "history:view past transactions" + "help:produce help for all or given command" + "load-transaction:load a saved transaction from a textfile" + "load-ts:load a saved transaction from a textfile" + "check:Check for problems in the rpmdb" + "reinstall:reinstall a package" + "downgrade:downgrade a package" + "repolist:display the configured software repositories" + "distribution-synchronization:synchronize installed packages to the latest available versions" + "distro-sync:synchronize installed packages to the latest available versions" + ) + + if (( CURRENT == 1 )); then + _describe -t commands 'yum command' _yum_cmds || compadd "$@" + else + local curcontext="$curcontext" + + cmd="${${_yum_cmds[(r)$words[1]:*]%%:*}}" + # Deal with any aliases + case $cmd in + remove) cmd="erase";; + whatprovides) cmd="provides";; + upgrade) cmd="update";; + upgrade-to) cmd="update";; + update-to) cmd="update";; + load-ts) cmd="load-transaction";; + distro-sync) cmd="distribution-synchronization";; + esac + + if (( $#cmd )); then + curcontext="${curcontext%:*:*}:yum-${cmd}:" + + local update_policy + zstyle -s ":completion:${curcontext}:" cache-policy update_policy + if [[ -z "$update_policy" ]]; then + zstyle ":completion:${curcontext}:" cache-policy _yum_caching_policy + fi + + if [ "$cmd" = "help" ]; then + if (( CURRENT == 2 )); then + local -a _yum_cmd_names + _yum_cmd_names=(${_yum_cmds%%:*}) + _describe -t commands 'commands' _yum_cmd_names + else + # help takes one argument + _message 'no more arguments' + fi + else + _call_function ret _yum_$cmd || _message 'no more arguments' + fi + else + _message "unknown yum command: $words[1]" + fi + return ret + fi +} + +# Expand next argument after 'yum check' +_yum_check() { + if (( CURRENT == 2 )); then + ##chkargs=("dependencies" "duplicates" "obsoletes" "provides" "all") # according to man page + ##chkargs=("dependencies" "duplicates" "all") # according to help + #chkargs=("dependencies" "duplicates" "provides" "all") # what works for me + local expl + _wanted arguments expl 'check argument' compadd dependencies \ + duplicates provides all + else + return 1 + fi +} + +# Expand next argument after 'yum repolist' +_yum_repolist() { + if (( CURRENT == 2 )); then + local expl + _wanted arguments expl 'repolist arguments' compadd all enabled disabled + else + return 1 + fi } +_yum_ids() { + # the last argument will be the first valid transaction ID to be suggested + # all other arguments are forwarded to compadd + # + # maxid is the last transaction ID known to yum + # minusone is the number of arguments provided to _yum_ids minus one + local maxid + local minusone + + maxid=$(yum history stats | grep Transactions | sed "s/.*: //") + + # `$#' is the number of arguments + ((minusone=$#-1)) + + # `$@' are the arguments + # `${(@)@[...]}' selects a subrange from $@ + # `${(@)@[1,$minusone]}' are all except the last argument + # `$@[$#]' is the last argument, e.g. the first suggestable ID + compadd "${(@)@[1,$minusone]}" {$@[$#]..$maxid} +} + +_yum_ranges() { + if compset -P '*..'; then + _yum_ids $@ ${(S)IPREFIX#..} + else + _yum_ids $@ -S '..' 1 + fi +} + +# Expand next argument after 'yum history' +_yum_history() { + local expl + if (( CURRENT == 2 )); then + _wanted arguments expl "yum history command" compadd info list \ + packages-list packages-info summary addon-info redo undo \ + roll-back new sync stats + elif (( CURRENT == 3 )); then + local -a ID_commands + local -a ID_range_commands + local -a package_commands + local -a alts + alts=() + #ID_commands=('summary' 'info' 'list' 'stats' 'addon-info') + ID_commands=('addon-info') + ID_range_commands=('summary' 'info' 'list' 'stats') + package_commands=('summary' 'info' 'list' 'stats' 'packages-list' 'packages-info') + #package_commands=('packages-list' 'packages-info') + # packages-list, packages-info : needs package name + # summary, info, list, stats : ID, ID range, package name + # addon-info : ID + # redo, undo, roll-back, sync : unknown + + [[ -n "${ID_commands[(r)$words[2]]}" ]] && alts+=('special:special ID:(last)') + [[ -n "${ID_commands[(r)$words[2]]}" ]] && alts+=('regular:ID:_yum_ids 1') + [[ -n "${ID_range_commands[(r)$words[2]]}" ]] && alts+=('regular:transaction range:_yum_ranges') + [[ -n "${ID_range_commands[(r)$words[2]]}" ]] && alts+=('special:all transactions:(all)') + [[ -n "${package_commands[(r)$words[2]]}" ]] && alts+=("package:package:_yum_act_on_installed_pkgs") + + if (( ${+alts[1]} )) ; then + _alternative "$alts[@]" + else + _default + fi + elif (( CURRENT == 4 )); then + if [ "$words[2]" = "addon-info" ]; then + _wanted arguments expl 'additional option' compadd saved_tx + fi + fi +} + + # Fills the all pkg cache _yum_all_pkgs() { - if ( [[ ${+_all_pkgs} -eq 0 ]] || _cache_invalid ALL ) && - ! _retrieve_cache ALL; - then - _all_pkgs=( $(yum -C list all | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) - _store_cache ALL _all_pkgs - fi + if ( [[ ${+_all_pkgs} -eq 0 ]] || _cache_invalid ALL ) && + ! _retrieve_cache ALL; +then + _all_pkgs=( $(yum -C list all | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) + _store_cache ALL _all_pkgs +fi } # Fills the installed pkg cache _yum_installed_pkgs() { - if ( [[ ${+_installed_pkgs} -eq 0 ]] || _cache_invalid INSTALLED ) && - ! _retrieve_cache INSTALLED; - then - _installed_pkgs=( $(yum -C list installed | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) - _store_cache INSTALLED _installed_pkgs - fi + if ( [[ ${+_installed_pkgs} -eq 0 ]] || _cache_invalid INSTALLED ) && + ! _retrieve_cache INSTALLED; +then + _installed_pkgs=( $(yum -C list installed | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) + _store_cache INSTALLED _installed_pkgs +fi } # Fills the available pkg cache _yum_available_pkgs() { - if ( [[ ${+_available_pkgs} -eq 0 ]] || _cache_invalid AVAILABLE ) && - ! _retrieve_cache AVAILABLE; - then - _available_pkgs=( $(yum -C list available | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) - _store_cache AVAILABLE _available_pkgs - fi + if ( [[ ${+_available_pkgs} -eq 0 ]] || _cache_invalid AVAILABLE ) && + ! _retrieve_cache AVAILABLE; +then + _available_pkgs=( $(yum -C list available | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) + _store_cache AVAILABLE _available_pkgs +fi } # Fills the upgrade pkg cache _yum_upgrade_pkgs() { - if ( [[ ${+_upgrade_pkgs} -eq 0 ]] || _cache_invalid UPGRADE ) && - ! _retrieve_cache UPGRADE; - then - _upgrade_pkgs=( $(yum -C list upgrade | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) - _store_cache UPGRADE _upgrade_pkgs - fi + if ( [[ ${+_upgrade_pkgs} -eq 0 ]] || _cache_invalid UPGRADE ) && + ! _retrieve_cache UPGRADE; +then + _upgrade_pkgs=( $(yum -C list upgrade | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) + _store_cache UPGRADE _upgrade_pkgs +fi } # Gets the list of defined repos yum_repos() { - local trepo - local -a tarray - tarray=( $(egrep -h '(^\[.*\]|^enabled.*=)' /etc/yum.repos.d/*.repo /etc/yum.conf | sed -e 's/ //g' | sed -e 's/\[//g' | sed -e 's/\].*$//g' 2>/dev/null) ) - local -i eindex=0 - local -i dindex=0 - for line in $tarray; do - if [[ "$line" = "enabled=1" ]]; then - enabled_yum_repos=($enabled_yum_repos $trepo) - elif [[ "$line" = "enabled=0" ]]; then - disabled_yum_repos=($disabled_yum_repos $trepo) - elif [[ "$line" != "main" ]]; then - trepo=$line - fi - done + local trepo + local -a tarray + tarray=( $(egrep -h '(^\[.*\]|^enabled.*=)' /etc/yum.repos.d/*.repo /etc/yum.conf | sed -e 's/ //g' | sed -e 's/\[//g' | sed -e 's/\].*$//g' 2>/dev/null) ) + local -i eindex=0 + local -i dindex=0 + for line in $tarray; do + if [[ "$line" = "enabled=1" ]]; then + enabled_yum_repos=($enabled_yum_repos $trepo) + elif [[ "$line" = "enabled=0" ]]; then + disabled_yum_repos=($disabled_yum_repos $trepo) + elif [[ "$line" != "main" ]]; then + trepo=$line + fi + done } (( $+functions[_yum_disabled_repos_list] )) || _yum_disabled_repos_list() { - compset -P '*,' - compset -S ',*' - yum_repos - compadd "$@" -a -- disabled_yum_repos + compset -P '*,' + compset -S ',*' + yum_repos + compadd "$@" -a -- disabled_yum_repos } (( $+functions[_yum_enabled_repos_list] )) || _yum_enabled_repos_list() { - compset -P '*,' - compset -S ',*' - yum_repos - compadd "$@" -a -- enabled_yum_repos + compset -P '*,' + compset -S ',*' + yum_repos + compadd "$@" -a -- enabled_yum_repos +} + +# Suggest installed packages +_yum_act_on_installed_pkgs() { + _yum_installed_pkgs + compadd "$@" -a -- _installed_pkgs +} + +# Completion function for distribution-synchronization|distro-sync +(( $+functions[_yum_distribution-synchronization] )) || _yum_distribution-synchronization() +{ + _yum_act_on_installed_pkgs "$@" } # Completion function for erase|remove (( $+functions[_yum_erase] )) || _yum_erase() { - _yum_installed_pkgs - compadd "$@" -a -- _installed_pkgs + _yum_act_on_installed_pkgs "$@" +} + +# Completion function for downgrade +(( $+functions[_yum_downgrade] )) || _yum_downgrade() +{ + _yum_act_on_installed_pkgs "$@" +} + +# Completion function for reinstall +(( $+functions[_yum_reinstall] )) || _yum_reinstall() +{ + _yum_act_on_installed_pkgs "$@" } # Completion function for install (( $+functions[_yum_install] )) || _yum_install() { - if ! [[ $PREFIX == */* ]]; then - _yum_available_pkgs - fi + if ! [[ $PREFIX == */* ]]; then + _yum_available_pkgs + fi - local ret=1 - _tags files packages - while _tags; do - if _requested files; then - compadd "$@" -a -- _available_pkgs - fi - if _requested packages; then - _call_function - _yum_localinstall - fi - (( ret )) || break - done - return ret + local ret=1 + _tags files packages + while _tags; do + if _requested files; then + compadd "$@" -a -- _available_pkgs + fi + if _requested packages; then + _call_function - _yum_localinstall + fi + (( ret )) || break + done + return ret +} + +# Completion function for load-transaction +(( $+functions[_yum_load-transaction] )) || _yum_load-transaction() +{ + _files } # Completion function for localinstall (( $+functions[_yum_localinstall] )) || _yum_localinstall() { - _files -/ -g '(#i)*.rpm(-.)' + _files -/ -g '(#i)*.rpm(-.)' } # Completion function for localupdate (( $+functions[_yum_localupdate] )) || _yum_localupdate() { - _files -/ -g '(#i)*.rpm(-.)' + _files -/ -g '(#i)*.rpm(-.)' } # Completion function for update/upgrade (( $+functions[_yum_update] )) || _yum_update() { - _yum_upgrade_pkgs - compadd "$@" -a -- _upgrade_pkgs + _yum_upgrade_pkgs + compadd "$@" -a -- _upgrade_pkgs } # Completion function for deplist (( $+functions[_yum_deplist] )) || _yum_deplist() { - _yum_available_pkgs - compadd "$@" -a -- _available_pkgs + _yum_available_pkgs + compadd "$@" -a -- _available_pkgs } _yum_all() { - _yum_all_pkgs - compadd "$@" -a -- _all_pkgs + _yum_all_pkgs + compadd "$@" -a -- _all_pkgs } _yum_list_or_info() { - local -a listlist - listlist=( - "all:all packages in repositories" - "available:packages available in repositories" - "updates:packages with updates available" - "installed:installed packages" - "extras:packages installed that are not available in any yum repository" - "obsoletes:packages installed that are obsoleted" - "recent:packages recently added to repositories" - ) - - if (( CURRENT == 2 )); then - _describe -t yum-list-subcmds "Yum info/list sub-commands" listlist || _yum_all - else - local subcmd - subcmd="${${listlist[(r)$words[2]:*]%%:*}}" - # offer packages selected by the subcommand - case $subcmd in - all) _yum_all;; - installed) _yum_erase;; - available) _yum_install;; - updates) _yum_update;; - esac - fi + local -a listlist + listlist=( + "all:all packages in repositories" + "available:packages available in repositories" + "updates:packages with updates available" + "installed:installed packages" + "extras:packages installed that are not available in any yum repository" + "obsoletes:packages installed that are obsoleted" + "recent:packages recently added to repositories" + ) + + if (( CURRENT == 2 )); then + _describe -t yum-list-subcmds "Yum info/list sub-commands" listlist || _yum_all + else + local subcmd + subcmd="${${listlist[(r)$words[2]:*]%%:*}}" + # offer packages selected by the subcommand + case $subcmd in + all) _yum_all;; + installed) _yum_erase;; + available) _yum_install;; + updates) _yum_update;; + esac + fi } # Completion function for list (( $+functions[_yum_list] )) || _yum_list() { - _yum_list_or_info + _yum_list_or_info } # Completion function for info (( $+functions[_yum_info] )) || _yum_info() { - _yum_list_or_info + _yum_list_or_info } # Completion function for provides|whatprovides (( $+functions[_yum_provides] )) || _yum_provides() { - _files + _files } # Completion function for resolvedep (( $+functions[_yum_resolvedep] )) || _yum_resolvedep() { - _files + _files } # Completion function for clean (( $+functions[_yum_clean] )) || _yum_clean() { - local -a cleanlist - cleanlist=( - "all:all cache" - "cache:all cache" - "dbcache:DB cache" - "headers:cache headers" - "packages:cache packages" - "metadata:cache meta-data" - ) - - if (( CURRENT == 2 )); then - _describe -t yum-clean-subcmds "Yum clean sub-commands" cleanlist - fi -} - -_yum_caching_policy() -{ + local -a cleanlist + cleanlist=( + "all:all cache" + "cache:all cache" + "dbcache:DB cache" + "headers:cache headers" + "packages:cache packages" + "metadata:cache meta-data" + ) + + if (( CURRENT == 2 )); then + _describe -t yum-clean-subcmds "Yum clean sub-commands" cleanlist + fi +} + +_yum_caching_policy() { local _yumrepomds local -a oldp -- cgit v1.2.3 From 8ec1a25994c82ee4d7e3819abe8606dafa069be7 Mon Sep 17 00:00:00 2001 From: Oliver Kiddle Date: Thu, 24 Nov 2016 15:58:17 +0100 Subject: 40004: fix cache mechanism, complete groups and other minor improvements --- ChangeLog | 3 + Completion/Redhat/Command/_yum | 285 ++++++++++++++++++++++------------------- 2 files changed, 156 insertions(+), 132 deletions(-) (limited to 'Completion/Redhat/Command/_yum') diff --git a/ChangeLog b/ChangeLog index 8a36017e9..d133b8da1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2016-11-24 Oliver Kiddle + * 40004 (tweaked): Completion/Redhat/Command/_yum: fix cache + mechanism, complete groups and other minor improvements + * unposted: Src/Zle/zle_params.c: fix to compile on Solaris where curses.h has a #define for reg to register diff --git a/Completion/Redhat/Command/_yum b/Completion/Redhat/Command/_yum index 69a8de9a2..4698a3159 100644 --- a/Completion/Redhat/Command/_yum +++ b/Completion/Redhat/Command/_yum @@ -9,19 +9,40 @@ _yum() { '(-t --tolerant)'{-t,--tolerant}'[be tolerant of errors]' \ '(-C --cacheonly)'{-C,--cacheonly}'[run entirely from cache]' \ '(-c --config)'{-c,--config=}'[config file location]:Yum conf file:_files' \ - '(-R --randomwait)'{-R,--randomwait=}'[maximum command wait time (in minutes)]:max wait time' \ + '(-R --randomwait)'{-R,--randomwait=}'[specify maximum command wait time]:max wait time (minutes)' \ '(-d --debuglevel)'{-d,--debuglevel=}'[debug level (0-10)]:debug level' \ + '--showduplicates[show duplicates, in repos, in list/search commands]' \ '(-e --errorlevel)'{-e,--errorlevel=}'[error level (0-10)]:error level' \ - '(-y --assumeyes)'{-y,--assumeyes}'[answer yes for all questions]' \ + '--rpmverbosity=[specify rpm debug level]:debug level' \ + '(-q --quiet -v --verbose)'{-q,--quiet}'[quiet operation]' \ + '(-q --quiet -v --verbose)'{-v,--verbose}'[verbose operation]' \ + '(-y --assumeyes --assumeno)'{-y,--assumeyes}'[answer yes to all questions]' \ + '(-y --assumeyes --assumeno)--assumeno[answer no to all questions]' \ + '(- *)--version[display version information]' \ '--installroot=[set install root]:install root:_files -/' \ - '*--enablerepo=[enable or or more repositories]:repos to enable:_yum_disabled_repos_list' \ - '*--disablerepo=[disable one or more repositories]:disable repos:_yum_enabled_repos_list' \ - {*-x,*--exclude=}'[exclude package(s) by name or glob]:exclude packages' \ - '--version[show yum version]' \ + '*--enablerepo=[enable or or more repositories]:repository:_sequence _yum_disabled_repos' \ + '*--disablerepo=[disable one or more repositories]:repository:_sequence _yum_enabled_repos' \ + \*{-x,--exclude=}'[exclude package by name or glob]:package:_yum_all_pkgs' \ + '--disableexcludes=[disable exclude]:exclude:(all main)' \ + '--disableincludes=[disable include]:include' \ '--obsoletes[enable obsoletes processing during updates]' \ - '--nogpgcheck[disable gpg signature checking]' \ '--noplugins[disable yum plugins]' \ - '--disablepresto[disable Presto plugin and don''''t download any deltarpms]' \ + '--nogpgcheck[disable gpg signature checking]' \ + '--disableplugin=[disable plugin]:plugin' \ + '--enableplugin=[enable plugin]:plugin' \ + '--skip-broken[skip packages with depsolving problems]' \ + '--color=[control whether color is used]:(always auto never)' \ + '--releasever=[set value of $releasever in yum config and repo files]:value' \ + "--downloadonly[don't update, just download]" \ + '--downloaddir=[specify alternate directory to store packages]:directort:_directories' \ + '--setopt=[set arbitrary config and repo options]:option' \ + '--bugfix[include bugfix relevant packages in updates]' \ + '--security[include security relevant packages in updates]' \ + '--advisory=[include packages needed to fix the given advisory]:advisory' \ + '--bzs=[include packages needed to fix the given BZ]:BZ' \ + '--cves=[include packages needed to fix the given CVE]:CVE' \ + '--sec-severity=[include security relevant packages matching specific severity]:severity' \ + {*-x,*--exclude=}'[exclude package(s) by name or glob]:exclude packages' \ '*::yum command:_yum_command' } @@ -58,7 +79,7 @@ _yum() { "help:produce help for all or given command" "load-transaction:load a saved transaction from a textfile" "load-ts:load a saved transaction from a textfile" - "check:Check for problems in the rpmdb" + "check:check for problems in the rpmdb" "reinstall:reinstall a package" "downgrade:downgrade a package" "repolist:display the configured software repositories" @@ -67,9 +88,9 @@ _yum() { ) if (( CURRENT == 1 )); then - _describe -t commands 'yum command' _yum_cmds || compadd "$@" + _describe -t commands 'yum command' _yum_cmds else - local curcontext="$curcontext" + local curcontext="$curcontext" ret=1 cmd="${${_yum_cmds[(r)$words[1]:*]%%:*}}" # Deal with any aliases @@ -94,45 +115,36 @@ _yum() { if [ "$cmd" = "help" ]; then if (( CURRENT == 2 )); then - local -a _yum_cmd_names - _yum_cmd_names=(${_yum_cmds%%:*}) - _describe -t commands 'commands' _yum_cmd_names + _describe -t commands 'yum commands' _yum_cmds && ret=0 else # help takes one argument _message 'no more arguments' fi - else - _call_function ret _yum_$cmd || _message 'no more arguments' + elif ! _call_function ret _yum-$cmd; then + _default && ret=0 fi else - _message "unknown yum command: $words[1]" + # fallback to default completion for unknown commands + _default && ret=0 fi return ret fi } # Expand next argument after 'yum check' -_yum_check() { - if (( CURRENT == 2 )); then +_yum-check() { ##chkargs=("dependencies" "duplicates" "obsoletes" "provides" "all") # according to man page ##chkargs=("dependencies" "duplicates" "all") # according to help #chkargs=("dependencies" "duplicates" "provides" "all") # what works for me - local expl - _wanted arguments expl 'check argument' compadd dependencies \ - duplicates provides all - else - return 1 - fi + _values -w 'check argument' dependencies duplicates provides all } # Expand next argument after 'yum repolist' -_yum_repolist() { - if (( CURRENT == 2 )); then - local expl - _wanted arguments expl 'repolist arguments' compadd all enabled disabled - else - return 1 - fi +_yum-repolist() { + _yum_get_repos + _alternative \ + 'filters:filter:(all enabled disabled)' \ + 'repositories:repository:compadd -a yum_enabled_repos yum_disabled_repos' } _yum_ids() { @@ -140,35 +152,32 @@ _yum_ids() { # all other arguments are forwarded to compadd # # maxid is the last transaction ID known to yum - # minusone is the number of arguments provided to _yum_ids minus one local maxid - local minusone - - maxid=$(yum history stats | grep Transactions | sed "s/.*: //") - # `$#' is the number of arguments - ((minusone=$#-1)) + maxid=${${(M)${(f)"$(_call_program transactions yum history stats)"}:#Transactions:*}##* } # `$@' are the arguments # `${(@)@[...]}' selects a subrange from $@ - # `${(@)@[1,$minusone]}' are all except the last argument + # `${(@)@[1,-2]}' are all except the last argument # `$@[$#]' is the last argument, e.g. the first suggestable ID - compadd "${(@)@[1,$minusone]}" {$@[$#]..$maxid} + compadd "${(@)@[1,-2]:/-J/-V}" -M "B:0=" {$@[$#]..$maxid} } _yum_ranges() { - if compset -P '*..'; then - _yum_ids $@ ${(S)IPREFIX#..} + if compset -P 1 '*..'; then + _yum_ids "$@" ${(S)IPREFIX#..} + elif compset -S '..*'; then + _yum_ids "$@" 1 else - _yum_ids $@ -S '..' 1 + _yum_ids "$@" -S '..' 1 fi } # Expand next argument after 'yum history' -_yum_history() { +_yum-history() { local expl if (( CURRENT == 2 )); then - _wanted arguments expl "yum history command" compadd info list \ + _wanted commands expl "yum history command" compadd info list \ packages-list packages-info summary addon-info redo undo \ roll-back new sync stats elif (( CURRENT == 3 )); then @@ -209,49 +218,45 @@ _yum_history() { # Fills the all pkg cache _yum_all_pkgs() { - if ( [[ ${+_all_pkgs} -eq 0 ]] || _cache_invalid ALL ) && - ! _retrieve_cache ALL; -then - _all_pkgs=( $(yum -C list all | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) - _store_cache ALL _all_pkgs -fi + (( $+_yum_all_pkgs[1] )) && return + if _cache_invalid yum-all-packages || ! _retrieve_cache yum-all-packages; then + _yum_all_pkgs=( ${(M)${${(f)"$(_call_program packages yum -C list all)"}// *}:#*.*} ) + _store_cache yum-all-packages _yum_all_pkgs + fi } # Fills the installed pkg cache _yum_installed_pkgs() { - if ( [[ ${+_installed_pkgs} -eq 0 ]] || _cache_invalid INSTALLED ) && - ! _retrieve_cache INSTALLED; -then - _installed_pkgs=( $(yum -C list installed | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) - _store_cache INSTALLED _installed_pkgs -fi + (( $+_yum_installed_pkgs[1] )) && return + if _cache_invalid yum-installed || ! _retrieve_cache yum-installed; then + _yum_installed_pkgs=( ${(M)${${(f)"$(_call_program packages yum -C list installed)"}// *}:#*.*} ) + _store_cache yum-installed _yum_installed_pkgs + fi } # Fills the available pkg cache _yum_available_pkgs() { - if ( [[ ${+_available_pkgs} -eq 0 ]] || _cache_invalid AVAILABLE ) && - ! _retrieve_cache AVAILABLE; -then - _available_pkgs=( $(yum -C list available | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) - _store_cache AVAILABLE _available_pkgs -fi + (( $+_yum_available_pkgs[1] )) && return + if _cache_invalid yum-available || ! _retrieve_cache yum-available; then + _yum_available_pkgs=( ${(M)${${(f)"$(_call_program packages yum -C list available)"}// *}:#*.*} ) + _store_cache yum-available _yum_available_pkgs + fi } # Fills the upgrade pkg cache _yum_upgrade_pkgs() { - if ( [[ ${+_upgrade_pkgs} -eq 0 ]] || _cache_invalid UPGRADE ) && - ! _retrieve_cache UPGRADE; -then - _upgrade_pkgs=( $(yum -C list upgrade | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) - _store_cache UPGRADE _upgrade_pkgs -fi + (( $+_yum_upgrade_pkgs[1] )) && return + if _cache_invalid yum-upgrade || ! _retrieve_cache yum-upgrade; then + _yum_upgrade_pkgs=( ${(M)${${(f)"$(_call_program packages yum -C list upgrade)"}// *}:#*.*} ) + _store_cache yum-upgrade _yum_upgrade_pkgs + fi } # Gets the list of defined repos -yum_repos() { +_yum_get_repos() { local trepo local -a tarray tarray=( $(egrep -h '(^\[.*\]|^enabled.*=)' /etc/yum.repos.d/*.repo /etc/yum.conf | sed -e 's/ //g' | sed -e 's/\[//g' | sed -e 's/\].*$//g' 2>/dev/null) ) @@ -259,63 +264,86 @@ yum_repos() { local -i dindex=0 for line in $tarray; do if [[ "$line" = "enabled=1" ]]; then - enabled_yum_repos=($enabled_yum_repos $trepo) + yum_enabled_repos=($enabled_yum_repos $trepo) elif [[ "$line" = "enabled=0" ]]; then - disabled_yum_repos=($disabled_yum_repos $trepo) + yum_disabled_repos=($yum_disabled_repos $trepo) elif [[ "$line" != "main" ]]; then trepo=$line fi done } -(( $+functions[_yum_disabled_repos_list] )) || _yum_disabled_repos_list() -{ - compset -P '*,' - compset -S ',*' - yum_repos - compadd "$@" -a -- disabled_yum_repos +_yum_disabled_repos() { + _yum_get_repos + compadd "$@" -a -- yum_disabled_repos } -(( $+functions[_yum_enabled_repos_list] )) || _yum_enabled_repos_list() -{ - compset -P '*,' - compset -S ',*' - yum_repos - compadd "$@" -a -- enabled_yum_repos +_yum_enabled_repos() { + _yum_get_repos + compadd "$@" -a -- yum_enabled_repos } # Suggest installed packages _yum_act_on_installed_pkgs() { + local expl _yum_installed_pkgs - compadd "$@" -a -- _installed_pkgs + _wanted packages expl 'package' compadd "$@" -a -- _yum_installed_pkgs } # Completion function for distribution-synchronization|distro-sync -(( $+functions[_yum_distribution-synchronization] )) || _yum_distribution-synchronization() +(( $+functions[_yum-distribution-synchronization] )) || _yum-distribution-synchronization() { _yum_act_on_installed_pkgs "$@" } # Completion function for erase|remove -(( $+functions[_yum_erase] )) || _yum_erase() +(( $+functions[_yum-erase] )) || _yum-erase() { _yum_act_on_installed_pkgs "$@" } # Completion function for downgrade -(( $+functions[_yum_downgrade] )) || _yum_downgrade() +(( $+functions[_yum-downgrade] )) || _yum-downgrade() { _yum_act_on_installed_pkgs "$@" } # Completion function for reinstall -(( $+functions[_yum_reinstall] )) || _yum_reinstall() +(( $+functions[_yum-reinstall] )) || _yum-reinstall() { _yum_act_on_installed_pkgs "$@" } +(( $+functions[_yum-groupinfo] )) || _yum-groupinfo() +{ + local expl + _wanted groups expl group compadd \ + ${${(M)${(f)"$(_call_program groups yum grouplist -C)"}:# *}# } +} + +(( $+functions[_yum-groupinstall] )) || _yum-groupinstall() +{ + local expl + _wanted groups expl group compadd \ + ${${(M)${(f)"$(_call_program groups yum grouplist -C)"}:# *}# } +} + +(( $+functions[_yum-groupremove] )) || _yum-groupremove() +{ + local expl + _wanted groups expl group compadd \ + ${${(M)${(f)"$(_call_program groups yum grouplist -C installed)"}:# *}# } +} + +(( $+functions[_yum-groupupdate] )) || _yum-groupupdate() +{ + local expl + _wanted groups expl group compadd \ + ${${(M)${(f)"$(_call_program groups yum grouplist -C installed)"}:# *}# } +} + # Completion function for install -(( $+functions[_yum_install] )) || _yum_install() +(( $+functions[_yum-install] )) || _yum-install() { if ! [[ $PREFIX == */* ]]; then _yum_available_pkgs @@ -325,7 +353,7 @@ _yum_act_on_installed_pkgs() { _tags files packages while _tags; do if _requested files; then - compadd "$@" -a -- _available_pkgs + compadd "$@" -a -- _yum_available_pkgs fi if _requested packages; then _call_function - _yum_localinstall @@ -336,42 +364,45 @@ _yum_act_on_installed_pkgs() { } # Completion function for load-transaction -(( $+functions[_yum_load-transaction] )) || _yum_load-transaction() +(( $+functions[_yum-load-transaction] )) || _yum-load-transaction() { _files } # Completion function for localinstall -(( $+functions[_yum_localinstall] )) || _yum_localinstall() +(( $+functions[_yum-localinstall] )) || _yum-localinstall() { _files -/ -g '(#i)*.rpm(-.)' } # Completion function for localupdate -(( $+functions[_yum_localupdate] )) || _yum_localupdate() +(( $+functions[_yum-localupdate] )) || _yum-localupdate() { _files -/ -g '(#i)*.rpm(-.)' } # Completion function for update/upgrade -(( $+functions[_yum_update] )) || _yum_update() +(( $+functions[_yum-update] )) || _yum-update() { + local expl _yum_upgrade_pkgs - compadd "$@" -a -- _upgrade_pkgs + _wanted packages expl package compadd "$@" -a _yum_upgrade_pkgs } # Completion function for deplist -(( $+functions[_yum_deplist] )) || _yum_deplist() +(( $+functions[_yum-deplist] )) || _yum-deplist() { + local expl _yum_available_pkgs - compadd "$@" -a -- _available_pkgs + _wanted packages expl package compadd "$@" -a _yum_available_pkgs } _yum_all() { _yum_all_pkgs - compadd "$@" -a -- _all_pkgs + compadd "$@" -a -- _yum_all_pkgs } + _yum_list_or_info() { local -a listlist @@ -386,60 +417,50 @@ _yum_list_or_info() ) if (( CURRENT == 2 )); then - _describe -t yum-list-subcmds "Yum info/list sub-commands" listlist || _yum_all + _describe -t filters "filter" listlist || _yum_all else - local subcmd - subcmd="${${listlist[(r)$words[2]:*]%%:*}}" # offer packages selected by the subcommand - case $subcmd in - all) _yum_all;; - installed) _yum_erase;; - available) _yum_install;; - updates) _yum_update;; + case $words[2] in + installed) _yum-erase;; + available) _yum-install;; + updates) _yum-update;; + *extras|obsoletes|recent) + _wanted packages expl package compadd \ + ${(M)${${(f)"$(_call_program packages yum -C list $words[2])"}// *}:#*.*} + ;; + *) _yum_all;; esac fi } # Completion function for list -(( $+functions[_yum_list] )) || _yum_list() +(( $+functions[_yum-list] )) || _yum-list() { _yum_list_or_info } # Completion function for info -(( $+functions[_yum_info] )) || _yum_info() +(( $+functions[_yum-info] )) || _yum-info() { _yum_list_or_info } # Completion function for provides|whatprovides -(( $+functions[_yum_provides] )) || _yum_provides() -{ - _files -} - -# Completion function for resolvedep -(( $+functions[_yum_resolvedep] )) || _yum_resolvedep() +(( $+functions[_yum-provides] )) || _yum-provides() { _files } # Completion function for clean -(( $+functions[_yum_clean] )) || _yum_clean() +(( $+functions[_yum-clean] )) || _yum-clean() { - local -a cleanlist - cleanlist=( - "all:all cache" - "cache:all cache" - "dbcache:DB cache" - "headers:cache headers" - "packages:cache packages" - "metadata:cache meta-data" - ) - - if (( CURRENT == 2 )); then - _describe -t yum-clean-subcmds "Yum clean sub-commands" cleanlist - fi + _values -w "Yum clean sub-commands" \ + "all[all cache]" \ + "cache[all cache]" \ + "dbcache[DB cache]" \ + "headers[cache headers]" \ + "packages[cache packages]" \ + "metadata[cache meta-data]" } _yum_caching_policy() { @@ -447,8 +468,8 @@ _yum_caching_policy() { local -a oldp # rebuild if cache is more than a week old - oldp=( "$1"(mw+1) ) - (( $#oldp )) && return 0 + oldp=( "$1"(mw-1) ) + (( $#oldp )) || return 0 _yumrepomds=( /var/cache/yum/**/repomd.xml ) -- cgit v1.2.3