Resolves: #1239337 - backport completion for dnf

This commit is contained in:
Kamil Dudka 2015-07-07 11:45:32 +02:00
parent 97afa7b098
commit 6f88cea129
2 changed files with 311 additions and 1 deletions

303
zsh-5.0.8-comp-dnf.patch Normal file
View File

@ -0,0 +1,303 @@
From 3cf039749f4fa39a2556c4c1e6a9b1960d620fb9 Mon Sep 17 00:00:00 2001
From: Oliver Kiddle <opk@zsh.org>
Date: Tue, 2 Jun 2015 00:49:09 +0200
Subject: [PATCH] =?UTF-8?q?Adrien=20Verg=C3=A9:=2035352:=20completion=20fo?=
=?UTF-8?q?r=20new=20Redhat=20package=20manager?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Upstream-commit: 72ecc2ef36b203175aad3f6dd4b76e474a82d8b6
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
Completion/Redhat/Command/_dnf | 278 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 278 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..297c95a
--- /dev/null
+++ b/Completion/Redhat/Command/_dnf
@@ -0,0 +1,278 @@
+#compdef dnf
+
+# Main dispatcher
+_dnf() {
+ _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]:config 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 2>/dev/null | 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+=($trepo)
+ elif [[ "$line" = "enabled=0" ]]; then
+ disabled_dnf_repos+=($trepo)
+ elif [[ "$line" != "main" ]]; then
+ trepo=$line
+ fi
+ done
+}
+
+(( $+functions[_dnf_disabled_repos_list] )) || _dnf_disabled_repos_list() {
+ local -a enabled_dnf_repos disabled_dnf_repos
+ __dnf_repos
+ _sequence compadd "$@" - -a disabled_dnf_repos
+}
+
+(( $+functions[_dnf_enabled_repos_list] )) || _dnf_enabled_repos_list() {
+ local -a enabled_dnf_repos disabled_dnf_repos
+ __dnf_repos
+ _sequence 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 "dnf 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 "dnf 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 "$@"
--
2.4.3

View File

@ -3,7 +3,7 @@
Summary: Powerful interactive shell
Name: zsh
Version: 5.0.8
Release: 3%{?dist}
Release: 4%{?dist}
License: MIT
URL: http://zsh.sourceforge.net/
Group: System Environment/Shells
@ -24,6 +24,9 @@ Patch2: zsh-test-C02-dev_fd-mock.patch
# backport completion-related upstream fixes (#1238544)
Patch3: zsh-5.0.8-comp-bz1238544.patch
# backport completion for dnf (#1239337)
Patch4: zsh-5.0.8-comp-dnf.patch
BuildRequires: coreutils sed ncurses-devel libcap-devel
BuildRequires: texinfo texi2html gawk hostname
Requires(post): info grep
@ -61,6 +64,7 @@ This package contains the Zsh manual in html format.
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
cp -p %SOURCE7 .
@ -178,6 +182,9 @@ fi
%doc Doc/*.html
%changelog
* Tue Jul 07 2015 Kamil Dudka <kdudka@redhat.com> - 5.0.8-4
- backport completion for dnf (#1239337)
* Thu Jul 02 2015 Kamil Dudka <kdudka@redhat.com> - 5.0.8-3
- backport completion-related upstream fixes (#1238544)