Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
[PATCH] completion: add dnf command (yum's successor)
- X-seq: zsh-workers 35352
- From: Adrien Vergé <adrienverge@xxxxxxxxx>
- To: zsh-workers@xxxxxxx
- Subject: [PATCH] completion: add dnf command (yum's successor)
- Date: Mon, 1 Jun 2015 10:10:44 +0200
- Cc: Adrien Vergé <adrienverge@xxxxxxxxx>
- 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==
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
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
Messages sorted by:
Reverse Date,
Date,
Thread,
Author