#compdef dnf dnf-2 dnf-3 _dnf_helper() { compadd $($python_exec $helper "$@" -d 0 -q -C 2>/dev/null) } _dnf_query_db() { sqlite3 -batch -init /dev/null "$cache_file" "$1" } _dnf_disabled_repos() { _dnf_helper repolist disabled "" } _dnf_enabled_repos() { _dnf_helper repolist enabled "" } _dnf_available_packages() { if [ -r $cache_file ]; then compadd $(_dnf_query_db "select pkg from available WHERE pkg LIKE \"$1%\"") else _dnf_helper install "$1" fi } _dnf_installed_packages() { if [ -r $cache_file ]; then compadd $(_dnf_query_db "select pkg from installed WHERE pkg LIKE \"$1%\"") else _dnf_helper remove "$1" fi } _dnf_local_packages() { _files -/ -g '(#i)*.rpm(-.)' } _dnf() { if [[ "$(readlink /usr/bin/dnf)" == "dnf-2" ]]; then local python_exec="/usr/bin/python2" else local python_exec="/usr/bin/python3" fi local helper=$(${python_exec} -c "import dnf.cli; print('{}/completion_helper.py'.format(dnf.cli.__path__[0]))") local cache_file="/var/cache/dnf/packages.db" _arguments -s \ '(- *)'{-h,--help}'[show the help message]' \ '--version[show dnf version]' \ '(-v --verbose)'{-v,--verbose}'[set verbose, show debug messages]' \ '(-q --quiet)'{-q,--quiet}'[show just the relevant content]' \ '--allowerasing[allow erasing of installed packages]' \ '(-y --assumeyes)'{-y,--assumeyes}'[answer yes for all questions]' \ '(-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' \ '--releasever=[configure DNF for another release]:release' \ '--refresh[set metadata as expired before running the command]' \ '--nogpgcheck[skip checking GPG signatures on package]' \ '--installroot=[set install root]:install root:_files -/' \ '*--enablerepo=[enable one or more repositories]:repos to enable:_dnf_disabled_repos' \ '*--disablerepo=[disable one or more repositories]:disable repos:_dnf_enabled_repos' \ '*::dnf command:_dnf_command' } _dnf_command() { local -a _dnf_cmds _dnf_cmds=( "autoremove:automatically remove no longer required packages" "check-update:check for available package upgrades" "clean:remove cached data" "distro-sync:synchronize installed packages to the latest available versions" "downgrade:downgrade a package" "erase:deprecated alias for remove" "group:display, or use, the groups information" "help:display a helpful usage message" "history:display, or use, the transaction history" "info:display details about a package or group of packages" "install:install a package or packages on your system" "list:list a package or groups of packages" "makecache:generate the metadata cache" "mark:mark or unmark installed packages as installed by user" "provides:find what package provides the given value" "reinstall:reinstall a package" "remove:remove a package or packages from your system" "repolist:display the configured software repositories" "repository-packages:run commands on top of all packages in given repository" "search:search package details for the given string" "update:deprecated alias for upgrade" "updateinfo:display advisories about packages" "upgrade:upgrade a package or packages on your system" "upgrade-to:upgrade a package on your system to the specified version" ) if (( CURRENT == 1 )); then _describe -t commands 'dnf command' _dnf_cmds || compadd "$@" else local command="${${_dnf_cmds[(r)$words[1]:*]%%:*}}" # Deal with any aliases case $command in erase) command="remove";; whatprovides) command="provides";; update) command="upgrade";; esac _is_path() { [[ "$1" == *\/* ]] || [[ "$1" == \~* ]] } local cur=$words[CURRENT] local prev="" [[ $CURRENT > 2 ]] && prev=$words[$((CURRENT - 1))] case $command in install|upgrade|reinstall|info|check-update|distro-sync) if ! _is_path "$cur"; then _dnf_available_packages "$cur" else _dnf_local_packages fi ;; remove|downgrade) if ! _is_path "$cur"; then _dnf_installed_packages "$cur" elif [[ "$command" == downgrade ]]; then _dnf_local_packages fi ;; list|clean) _dnf_helper $command "$prev" "$cur" ;; group) local -a _dnf_group_cmds _dnf_group_cmds=( "summary:display groups overview" "info:display package lists of a group" "install:install packages from a group" "list:list all matching groups" "remove:mark the group removed" "upgrade:upgrades the group and its packages" "mark:mark a group for installation or removal" ) if (( CURRENT == 2 )); then _describe -t commands 'dnf group command' _dnf_group_cmds fi ;; help) if (( CURRENT == 2 )); then _dnf_helper '_cmds' '' fi ;; history) local -a _dnf_history_cmds _dnf_history_cmds=( "list:list transactions" "info:describe the given transactions" "redo:repeat the specified transaction" "rollback:undo all since the given transaction" "undo:undo transactions" "userinstalled:list names of all packages installed by a user" ) if (( CURRENT == 2 )); then _describe -t commands 'dnf history command' _dnf_history_cmds else _dnf_helper $command "$prev" "$cur" fi ;; makecache) if (( CURRENT == 2 )); then _values 'make cache' 'timer' fi ;; mark) if (( CURRENT == 2 )); then _values 'mark' 'install' 'remove' else _dnf_installed_packages "$cur" fi ;; provides) _files ;; repolist) if (( CURRENT == 2 )); then _values 'repolist' 'enabled' 'disabled' 'all' fi ;; search) if (( CURRENT == 2 )); then _values 'search' 'all' fi ;; esac fi } _dnf "$@"