From ec32afd525eb34000c99522d27b4387def8a2673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Fri, 13 Mar 2026 15:22:45 +0100 Subject: [PATCH] shell-completion: add shell completions for systemd-hwdb Co-developed-by: Claude --- TODO | 1 - shell-completion/bash/meson.build | 1 + shell-completion/bash/systemd-hwdb | 76 ++++++++++++++++++++++++++++++ shell-completion/zsh/_systemd-hwdb | 40 ++++++++++++++++ shell-completion/zsh/meson.build | 1 + 5 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 shell-completion/bash/systemd-hwdb create mode 100644 shell-completion/zsh/_systemd-hwdb diff --git a/TODO b/TODO index a3a92824f6..22239961ef 100644 --- a/TODO +++ b/TODO @@ -23,7 +23,6 @@ External: * fedora: update policy to declare access mode and ownership of unit files to root:root 0644, and add an rpmlint check for it * missing shell completions: - - systemd-hwdb * zsh shell completions: - - should complete options, but currently does not diff --git a/shell-completion/bash/meson.build b/shell-completion/bash/meson.build index 178986e171..154910979e 100644 --- a/shell-completion/bash/meson.build +++ b/shell-completion/bash/meson.build @@ -46,6 +46,7 @@ foreach item : [ ['systemd-delta', ''], ['systemd-detect-virt', ''], ['systemd-dissect', 'HAVE_BLKID'], + ['systemd-hwdb', 'ENABLE_HWDB'], ['systemd-id128', ''], ['systemd-nspawn', 'ENABLE_NSPAWN'], ['systemd-path', ''], diff --git a/shell-completion/bash/systemd-hwdb b/shell-completion/bash/systemd-hwdb new file mode 100644 index 0000000000..a401bbf1c7 --- /dev/null +++ b/shell-completion/bash/systemd-hwdb @@ -0,0 +1,76 @@ +# shellcheck shell=bash +# systemd-hwdb(8) completion -*- shell-script -*- +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. +# +# systemd is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with systemd; If not, see . + +__contains_word() { + local w word=$1; shift + for w in "$@"; do + [[ $w = "$word" ]] && return + done +} + +_systemd_hwdb() { + local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} words cword + local i verb comps + + local -A OPTS=( + [STANDALONE]='-h --help --version -s --strict --usr' + [ARG]='-r --root' + ) + + local -A VERBS=( + [STANDALONE]='update' + [ARG]='query' + ) + + _init_completion || return + + if __contains_word "$prev" ${OPTS[ARG]}; then + case $prev in + --root|-r) + comps=$(compgen -A directory -- "$cur") + compopt -o dirnames + ;; + esac + COMPREPLY=( $(compgen -W '$comps' -- "$cur") ) + return 0 + fi + + for ((i=0; i < COMP_CWORD; i++)); do + if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} && + ! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then + verb=${COMP_WORDS[i]} + break + fi + done + + if [[ -z ${verb-} ]]; then + COMPREPLY=( $(compgen -W '${OPTS[*]} ${VERBS[*]}' -- "$cur") ) + return 0 + fi + + if [[ "$cur" = -* ]]; then + COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") ) + return 0 + fi + + COMPREPLY=( $(compgen -W '${comps-}' -- "$cur") ) + return 0 +} + +complete -F _systemd_hwdb systemd-hwdb diff --git a/shell-completion/zsh/_systemd-hwdb b/shell-completion/zsh/_systemd-hwdb new file mode 100644 index 0000000000..92238d63ad --- /dev/null +++ b/shell-completion/zsh/_systemd-hwdb @@ -0,0 +1,40 @@ +#compdef systemd-hwdb +# SPDX-License-Identifier: LGPL-2.1-or-later + +local context state state_descr line +typeset -A opt_args + +local -a opt_common=( + {-h,--help}'[show this help]' + '--version[show package version]' + {-s,--strict}'[when updating, return non-zero exit value on any parsing error]' + '--usr[generate in /usr/lib/udev instead of /etc/udev]' + {-r+,--root=}'[alternative root path in the filesystem]:path:_directories' +) + +local -a hwdb_commands=( + 'update:update the hwdb database' + 'query:query database and print result' +) + +local ret=1 +_arguments -s -A '-*' "$opt_common[@]" \ + ':command:->command' \ + '*:: :->option-or-argument' && ret=0 + +case $state in + command) + _describe -t command 'systemd-hwdb command' hwdb_commands && ret=0 + ;; + option-or-argument) + case $words[1] in + update) + _arguments -s "$opt_common[@]" && ret=0 + ;; + query) + _arguments -s "$opt_common[@]" ':modalias:' && ret=0 + ;; + esac + ;; +esac +return ret diff --git a/shell-completion/zsh/meson.build b/shell-completion/zsh/meson.build index eb5bb4b6a4..b1bff151e4 100644 --- a/shell-completion/zsh/meson.build +++ b/shell-completion/zsh/meson.build @@ -36,6 +36,7 @@ foreach item : [ ['_systemd', ''], ['_systemd-analyze', ''], ['_systemd-delta', ''], + ['_systemd-hwdb', 'ENABLE_HWDB'], ['_systemd-id128', ''], ['_systemd-inhibit', 'ENABLE_LOGIND'], ['_systemd-nspawn', ''],