about summary refs log tree commit diff
path: root/Completion/Redhat/Command/_dnf
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Redhat/Command/_dnf')
-rw-r--r--Completion/Redhat/Command/_dnf149
1 files changed, 94 insertions, 55 deletions
diff --git a/Completion/Redhat/Command/_dnf b/Completion/Redhat/Command/_dnf
index a5edf8564..c41795adf 100644
--- a/Completion/Redhat/Command/_dnf
+++ b/Completion/Redhat/Command/_dnf
@@ -1,7 +1,11 @@
-#compdef dnf dnf-2 dnf-3
-#
-# based on dnf-4.2.18
-#
+#compdef dnf dnf-2 dnf-3 dnf4
+# based on dnf-4.21.1
+
+# avoid 'dnf --version' since it's rather slow for dnf4
+if [[ $service = dnf && $commands[dnf]:P = */dnf5 ]]; then
+  _dnf5 "$@" && return 0
+  return 1
+fi
 
 _dnf_helper() {
   # Get the pathname of the python executable from the 1st line of dnf-2/dnf-3.
@@ -68,25 +72,23 @@ _dnf_packages_or_rpms() {
   fi
 }
 
-_dnf_groups_caching_policy() {
-  # TODO: Are there any reliable ways to validate the cache?
-  local -a newer=( "$1"(Nmw-1) )    # rebuild if more than a week old
-  return $#newer
-}
-
 _dnf_groups() {
-  local package_groups update_policy expl
-  zstyle -s ":completion:${curcontext}:" cache-policy update_policy
-  if [[ -z "$update_policy" ]]; then
-    zstyle ":completion:${curcontext}:" cache-policy _dnf_groups_caching_policy
-  fi
-  if _cache_invalid dnf-groups || ! _retrieve_cache dnf-groups; then
-    # this can be very slow
-    package_groups=( ${${${(M)${(f)"$(_call_program package-groups \
-                     $service group list -v 2>/dev/null)"}:# *}#*\(}%\)*} )
-    _store_cache dnf-groups package_groups
-  fi
-  _wanted package-groups expl 'package group' compadd "$@" -a package_groups
+  # optional option: -T (available|installed)
+  local selected line groups section=none
+  zparseopts -D -E - T:=selected
+  selected=$selected[2]
+  [[ -z $selected ]] && selected=all
+  # XXX hidden groups are not included.
+  # --installed and --available can't be specified with --hidden
+  for line in ${(f)"$(_call_program package-groups
+                      $service group list --$selected -qCv 2>/dev/null)"}; do
+    # a line for each group is of the following form:
+    # '  description of the group (group-id)'
+    if [[ $line = \ ##(#b)(*)\(([-_[:alnum:]]#)\) ]]; then
+      groups+=( "${match[2]}:${match[1]}" )
+    fi
+  done
+  _describe -t groups "$selected group" groups
 }
 
 _dnf_repoquery() {
@@ -194,7 +196,7 @@ _dnf_repository_packages() {
   fi
 }
 
-_dnf() {
+_dnf4() {
   local cache_file="/var/cache/dnf/packages.db"
   local -a opts=(
     '(-6)-4[resolve to IPv4 addresses only]'
@@ -226,7 +228,7 @@ _dnf() {
     '*'{-x+,--exclude=}'[exclude specified packages]: : _sequence _dnf_packages -T all'
     '--forcearch=[force the use of the specified arch]:arch: '
     '(-)'{-h,--help}'[show the help message]'
-    '--installroot=[set install root]:directory:_files -/'
+    '--installroot=[set install root]:directory:_files -/ -g "/*"'
     '--newpackage[include newpackage relevant packages]'
     '--noautoremove[disable removal of dependencies that are no longer used]'
     '--nobest[do not limit transactions to best candidates]'
@@ -289,18 +291,21 @@ _dnf_command() {
   if (( CURRENT == 1 )); then
     _describe -t dnf-commands 'dnf command' dnf_cmds
   else
-    local curcontext=$curcontext cur=$words[CURRENT] cmd tmp expl ret=1
+    local cur=$words[CURRENT] cmd=$words[1] tmp expl ret=1
     # Deal with aliases (not comprehensive)
-    case $words[1] in
+    case $cmd in
       check-updgrade) cmd=check-update;;
       distrosync|dsync) cmd=distro-sync;;
       dg) cmd=downgrade;;
+      dsync) cmd=distro-sync;;
       erase|rm) cmd=remove;;
       groups|grp) cmd=group;;
       hist) cmd=history;;
       in) cmd=install;;
+      if) cmd=info;;
+      ls) cmd=list;;
       mc) cmd=makecache;;
-      prov|whatprovides) cmd=provides;;
+      prov|whatprovides|wp) cmd=provides;;
       rei) cmd=reinstall;;
       repoinfo) cmd=repolist;;
       rq) cmd=repoquery;;
@@ -308,9 +313,9 @@ _dnf_command() {
       sh) cmd=shell;;
       update|up) cmd=upgrade;;
       update-minimal|up-min) cmd=upgrade-minimal;;
-      *) cmd="${${dnf_cmds[(r)$words[1]:*]%%:*}}";;
+      upif) cmd=updateinfo;;
     esac
-    (( $#cmd )) && curcontext="${curcontext%:*:*}:dnf-${cmd}:"
+    local curcontext="${curcontext%:*:*}:dnf-${cmd}:"
 
     case $cmd in
       alias)
@@ -337,11 +342,9 @@ _dnf_command() {
         _describe -t options 'option' tmp && ret=0
         ;;
       check-update)
-        if [[ $cur = -* ]]; then
-          _wanted options expl 'option' compadd - --changelogs && ret=0
-        else
-          _dnf_packages -T installed && ret=0
-        fi
+        _arguments : \
+          '--changelogs[also print changelog delta of packages]' \
+          '*: :_dnf_packages -T installed' && ret=0
         ;;
       clean)
         tmp=(
@@ -368,23 +371,38 @@ _dnf_command() {
             "mark:mark a group for installation or removal"
           )
           _describe -t subcommands 'subcommand' tmp && ret=0
-        elif (( CURRENT == 3 )) && [[ $cur = -* ]]; then
-          if [[ $words[2] == install ]]; then
-            _wanted options expl 'option' compadd - --with-optional && ret=0
-          elif [[ $words[2] == list ]]; then
-            tmp=(
-              '--available:show only available groups'
-              '--installed:show only installed groups'
-              '--hidden:show also hidden groups'
-              '--ids:show also ID of groups'
-            )
-            _describe -t options 'option' tmp && ret=0
-          fi
-        elif (( CURRENT == 3 )) && [[ $words[2] == mark ]]; then
-          _wanted subcommands expl 'subcommand' \
-                  compadd - install remove && ret=0
         else
-          _dnf_groups && ret=0
+          case $words[2] in
+            summary)
+              _arguments : '--hidden' '2: :_dnf_groups' && ret=0
+              ;;
+            info)
+              _dnf_groups && ret=0
+              ;;
+            install)
+              _arguments : '--with-optional[also include optional packages]' \
+                            '*: :_dnf_groups -T available' && ret=0
+              ;;
+            list)
+              _arguments : \
+                '(--installed)--available[show only available groups]' \
+                '(--available)--installed[show only installed groups]' \
+                '--hidden[show also hidden groups]' \
+                {--ids,-v}'[show also ID of groups]' \
+                '*: :_dnf_groups' && ret=0
+              ;;
+            remove|upgrade)
+              _dnf_groups -T installed && ret=0
+              ;;
+            mark)
+              if (( CURRENT == 3 )); then
+                _wanted subcommands expl 'subcommand' \
+                        compadd - install remove && ret=0
+              else
+                _dnf_groups && ret=0
+              fi
+              ;;
+          esac
         fi
         ;;
       help)
@@ -399,13 +417,32 @@ _dnf_command() {
             "list:list transactions"
             "info:describe the given transactions"
             "redo:repeat the specified transaction"
+            "replay:replay transaction stored in the specified file"
             "rollback:undo all since the given transaction"
+            "store:store the specified transaction in file"
             "undo:undo transactions"
             "userinstalled:list all packages installed by users"
           )
           _describe -t subcommands 'subcommand' tmp && ret=0
-        elif [[ $words[2] != userinstalled ]]; then
-          _message 'transaction' && ret=0
+        else
+          case $words[2] in
+            list)
+              _arguments : '--reverse[output history in reverse order]' \
+                '*:transaction ID or ID..ID: ' && ret=0 ;;
+            info)
+              _message 'transaction ID or ID..ID' && ret=0 ;;
+            redo|rollback|undo)
+              _message 'transaction or package' && ret=0 ;;
+            replay)
+              _arguments : \
+                "--ignore-installed[don't check for installed packages being in the same state as recorded in transaction]" \
+                "--ignore-extras[don't check for extra packages pulled into the transaction on the target system]" \
+                '--skip-unavailable[skip packages that are in transaction but not in target system]' \
+                '2:transaction file:_files' && ret=0 ;;
+            store)
+              _arguments : {-o+,--output=}'[store in specified file]: :_files' \
+                          '2:transaction: ' && ret=0 ;;
+          esac
         fi
         ;;
       info|list)
@@ -413,7 +450,7 @@ _dnf_command() {
           if [[ $cur = -* ]]; then
             tmp=( --all --available --installed --extras
                   --obsoletes --upgrades --autoremove --recent )
-            _wanted options expl 'option' compadd -a tmp
+            _wanted options expl 'option' compadd -a tmp && ret=0
           else
             _dnf_packages -T all && ret=0
           fi
@@ -449,6 +486,7 @@ _dnf_command() {
           tmp=(
             'install:install a module profile including its packages'
             'update:update packages associated with an active module stream'
+            'switch-to:switch to a module stream and change versions of installed packages'
             'remove:remove installed module profiles and their packages'
             'enable:enable a module stream'
             'disable:disable a module with all its streams'
@@ -502,7 +540,7 @@ _dnf_command() {
         _dnf_repoquery && ret=0
         ;;
       repository-packages)
-        _dnf_repository_packages
+        _dnf_repository_packages && ret=0
         ;;
       search)
         if [[ $cur = -* ]]; then
@@ -531,6 +569,7 @@ _dnf_command() {
           '--list[display list of advisories]'
           '--info[display detailed information of advisories]'
           + '(availability)'
+          '-all[include advisories about any versions of installed packages]'
           '--available[limit to advisories about newer versions of installed packages]'
           '--installed[limit to advisories about equal or older versions of installed packages]'
           '--updates[limit to advisories about newer and available versions of installed packages]'
@@ -548,4 +587,4 @@ _dnf_command() {
   fi
 }
 
-_dnf "$@"
+_dnf4 "$@"