From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15248 invoked by alias); 1 Jun 2015 08:10:59 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 35352 Received: (qmail 2715 invoked from network); 1 Jun 2015 08:10:58 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=Otdz/xAO3Tm1Yv9Ft8bmYFlGf6YMgC2xNPuCkKRCSGc=; b=o7wcukXj86ebqB0X5AUQXiotoxje5vWVIJutqJjtoiBQWOJ5sReJXLK8LYMo18TTmL WghBvIgGbtPPP645UNr17xNEVye6X3GWkATl7MPXaynxTSwfgaRMwoSFFhgbQT6WSHZG ipFoKQ1RX4nFFc6nZqm7YNiQLRjleJOuXIcrPjPT4Z9zr2vilmtYA4Lb2bqheY8vB5/h JIS458cinG+aecUTQ3xw62G2tJVXy4jM8ihjm36uqDOJF8cuN34xTrSYrx9mqLD5RcBR D/suqkzDBtX8oMHpW38RhF+TpvCm16KmxMyc+IH4cus8J91uWCJ8T+a/atIDkKCbXD/m bmqg== X-Received: by 10.180.77.195 with SMTP id u3mr18478018wiw.30.1433146254420; Mon, 01 Jun 2015 01:10:54 -0700 (PDT) From: =?UTF-8?q?Adrien=20Verg=C3=A9?= To: zsh-workers@zsh.org Cc: =?UTF-8?q?Adrien=20Verg=C3=A9?= Subject: [PATCH] completion: add dnf command (yum's successor) Date: Mon, 1 Jun 2015 10:10:44 +0200 Message-Id: <1433146244-10764-1-git-send-email-adrienverge@gmail.com> X-Mailer: git-send-email 1.9.3 On Red Hat systems yum is to be replaced by the new dnf package manager. This has already started: dnf is the default on Fedora 22. Both commands are compatible and have the same subcommands, except for resolvedep and deplist (which are dropped in dnf). --- Completion/Redhat/Command/_dnf | 300 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 Completion/Redhat/Command/_dnf diff --git a/Completion/Redhat/Command/_dnf b/Completion/Redhat/Command/_dnf new file mode 100644 index 0000000..5284e53 --- /dev/null +++ b/Completion/Redhat/Command/_dnf @@ -0,0 +1,300 @@ +#compdef dnf + +# Main dispatcher +_dnf() +{ + 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:_dnf_disabled_repos_list' \ + '*--disablerepo=[disable one or more repositories]:disable repos:_dnf_enabled_repos_list' \ + {*-x,*--exclude=}'[exclude package(s) by name or glob]:exclude packages' \ + '--version[show dnf version]' \ + '--obsoletes[enable obsoletes processing during updates]' \ + '--nogpgcheck[disable gpg signature checking]' \ + '--noplugins[disable dnf plugins]' \ + '--disablepresto[disable Presto plugin and don''''t download any deltarpms]' \ + '*::dnf command:_dnf_command' +} + +(( $+functions[_dnf_command] )) || _dnf_command() +{ + local -a _dnf_cmds + _dnf_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 dnf cache" + "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 dnf cache" + "provides:find out which package provides some feature or file" + "whatprovides:find out which package provides some feature or file" + "search:find any packages matching pattern" + "shell:enter the 'dnf shell'" + "update:update one or more packages" + "upgrade:upgrade one or more packages" + ) + + if (( CURRENT == 1 )); then + _describe -t commands 'dnf command' _dnf_cmds || compadd "$@" + else + local curcontext="$curcontext" + + cmd="${${_dnf_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%:*:*}:dnf-${cmd}:" + + local update_policy + zstyle -s ":completion:${curcontext}:" cache-policy update_policy + if [[ -z "$update_policy" ]]; then + zstyle ":completion:${curcontext}:" cache-policy _dnf_caching_policy + fi + + _call_function ret _dnf_$cmd || _message 'no more arguments' + else + _message "unknown dnf command: $words[1]" + fi + return ret + fi +} + +# Fills the all pkg cache +_dnf_all_pkgs() +{ + if ( [[ ${+_all_pkgs} -eq 0 ]] || _cache_invalid ALL ) && + ! _retrieve_cache ALL; + then + _all_pkgs=( $(dnf -C list all | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) + _store_cache ALL _all_pkgs + fi +} + +# Fills the installed pkg cache +_dnf_installed_pkgs() +{ + if ( [[ ${+_installed_pkgs} -eq 0 ]] || _cache_invalid INSTALLED ) && + ! _retrieve_cache INSTALLED; + then + _installed_pkgs=( $(dnf -C list installed | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) + _store_cache INSTALLED _installed_pkgs + fi +} + +# Fills the available pkg cache +_dnf_available_pkgs() +{ + if ( [[ ${+_available_pkgs} -eq 0 ]] || _cache_invalid AVAILABLE ) && + ! _retrieve_cache AVAILABLE; + then + _available_pkgs=( $(dnf -C list available | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) + _store_cache AVAILABLE _available_pkgs + fi +} + +# Fills the upgrade pkg cache +_dnf_upgrade_pkgs() +{ + if ( [[ ${+_upgrade_pkgs} -eq 0 ]] || _cache_invalid UPGRADE ) && + ! _retrieve_cache UPGRADE; + then + _upgrade_pkgs=( $(dnf -C list upgrade | sed 's/\s.*//' | grep '\.' 2>/dev/null) ) + _store_cache UPGRADE _upgrade_pkgs + fi +} + +# Gets the list of defined repos +dnf_repos() { + local trepo + local -a tarray + tarray=( $(egrep -h '(^\[.*\]|^enabled.*=)' /etc/dnf.repos.d/*.repo /etc/dnf.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_dnf_repos=($enabled_dnf_repos $trepo) + elif [[ "$line" = "enabled=0" ]]; then + disabled_dnf_repos=($disabled_dnf_repos $trepo) + elif [[ "$line" != "main" ]]; then + trepo=$line + fi + done +} + +(( $+functions[_dnf_disabled_repos_list] )) || _dnf_disabled_repos_list() +{ + compset -P '*,' + compset -S ',*' + dnf_repos + compadd "$@" -a -- disabled_dnf_repos +} + +(( $+functions[_dnf_enabled_repos_list] )) || _dnf_enabled_repos_list() +{ + compset -P '*,' + compset -S ',*' + dnf_repos + compadd "$@" -a -- enabled_dnf_repos +} + +# Completion function for erase|remove +(( $+functions[_dnf_erase] )) || _dnf_erase() +{ + _dnf_installed_pkgs + compadd "$@" -a -- _installed_pkgs +} + +# Completion function for install +(( $+functions[_dnf_install] )) || _dnf_install() +{ + if ! [[ $PREFIX == */* ]]; then + _dnf_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 - _dnf_localinstall + fi + (( ret )) || break + done + return ret +} + +# Completion function for localinstall +(( $+functions[_dnf_localinstall] )) || _dnf_localinstall() +{ + _files -/ -g '(#i)*.rpm(-.)' +} + +# Completion function for localupdate +(( $+functions[_dnf_localupdate] )) || _dnf_localupdate() +{ + _files -/ -g '(#i)*.rpm(-.)' +} + +# Completion function for update/upgrade +(( $+functions[_dnf_update] )) || _dnf_update() +{ + _dnf_upgrade_pkgs + compadd "$@" -a -- _upgrade_pkgs +} + +_dnf_all() +{ + _dnf_all_pkgs + compadd "$@" -a -- _all_pkgs +} +_dnf_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 dnf repository" + "obsoletes:packages installed that are obsoleted" + "recent:packages recently added to repositories" + ) + + if (( CURRENT == 2 )); then + _describe -t dnf-list-subcmds "Yum info/list sub-commands" listlist || _dnf_all + else + local subcmd + subcmd="${${listlist[(r)$words[2]:*]%%:*}}" + # offer packages selected by the subcommand + case $subcmd in + all) _dnf_all;; + installed) _dnf_erase;; + available) _dnf_install;; + updates) _dnf_update;; + esac + fi +} + +# Completion function for list +(( $+functions[_dnf_list] )) || _dnf_list() +{ + _dnf_list_or_info +} + +# Completion function for info +(( $+functions[_dnf_info] )) || _dnf_info() +{ + _dnf_list_or_info +} + +# Completion function for provides|whatprovides +(( $+functions[_dnf_provides] )) || _dnf_provides() +{ + _files +} + +# Completion function for clean +(( $+functions[_dnf_clean] )) || _dnf_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 dnf-clean-subcmds "Yum clean sub-commands" cleanlist + fi +} + +_dnf_caching_policy() +{ + local _dnfrepomds + local -a oldp + + # rebuild if cache is more than a week old + oldp=( "$1"(mw+1) ) + (( $#oldp )) && return 0 + + _dnfrepomds=( /var/cache/dnf/**/repomd.xml ) + + if (( $#_dnfrepomds )); then + for repo in $_dnfrepomds; do + [[ "$repo" -nt "$1" ]] && return 0 + done + fi + + return 1 +} + +_dnf "$@" -- 1.9.3