diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 17:03:56 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 17:03:56 +0000 |
commit | 18da3ffcd7f3c8a0c5f790c801b5813503c2273d (patch) | |
tree | 84caf98dc5cef3d123c56ba12e35fd67026e0693 /shell-completion/bash | |
parent | Initial commit. (diff) | |
download | kmod-18da3ffcd7f3c8a0c5f790c801b5813503c2273d.tar.xz kmod-18da3ffcd7f3c8a0c5f790c801b5813503c2273d.zip |
Adding upstream version 31+20240202.upstream/31+20240202
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'shell-completion/bash')
-rw-r--r-- | shell-completion/bash/kmod | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/shell-completion/bash/kmod b/shell-completion/bash/kmod new file mode 100644 index 0000000..f530836 --- /dev/null +++ b/shell-completion/bash/kmod @@ -0,0 +1,103 @@ +# kmod completion -*- shell-script -*- +# +# This file is part of kmod. +# +# Copyright 2010 Ran Benita +# Copyright (C) 2013 Intel Corporation. All rights reserved. +# +# This program 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. +# +# This program 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 this program; if not, see <http://www.gnu.org/licenses/>. + +__contains_word () { + local word=$1; shift + for w in "$@"; do [[ "$w" = "$word" ]] && return 0; done + return 1 +} + +__is_opt () { + local prevprev=${COMP_WORDS[COMP_CWORD-2]} + local short="$1" long="$2" + + if [[ "$prev" = "$short" || "$prev" = "$long" ]]; then + declare -g cur=${cur#=} + return 0 + elif [[ "$prev" = "=" && "$prevprev" = "$long" ]]; then + return 0 + fi + + return 1 +} + +_kmod_static_nodes () { + local OPTS='-o -f -h --help' + local OPTS_EQUAL='--output --format' + local GROUP_FORMAT='human tmpfiles devname' + + if __is_opt '-o' '--output'; then + compopt -o filenames + COMPREPLY=( $(compgen -f -- "$cur") ) + return 0 + elif __is_opt '-f' '--format'; then + COMPREPLY=( $(compgen -W "$GROUP_FORMAT" -- "$cur" ) ) + return 0 + fi + + local cur=${COMP_WORDS[COMP_CWORD]} + + compopt -o nospace + COMPREPLY=( $(compgen -W "$OPTS" -- "$cur") ) + COMPREPLY+=( $(compgen -W "$OPTS_EQUAL" -S= -- "$cur") ) +} + +_kmod() { + local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} + local VERBS=(help list static-nodes) + local OPTS='-h --help -V --version' + local verb + + # standalone options, no other option or action allowed + for ((i=0; $i < $COMP_CWORD; i++)); do + if __contains_word "${COMP_WORDS[i]}" ${OPTS}; then + return 0 + fi + done + + # find the action + for ((i=0; $i <= $COMP_CWORD; i++)); do + if __contains_word "${COMP_WORDS[i]}" "${VERBS[@]}"; then + verb=${COMP_WORDS[i]} + break + fi + done + + if [[ -z $verb ]]; then + COMPREPLY=( $(compgen -W '${OPTS[*]} ${VERBS[*]}' -- "$cur") ) + return 0 + fi + + local func=${verb//-/_} + + if declare -F _kmod_${func} > /dev/null; then + _kmod_${func} + fi + + # allow the space if there's only one completion and it doesn't end with + # '=' + if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} != *"=" ]] ; then + compopt +o nospace + fi + + return 0 +} + +complete -F _kmod kmod |