From 6d6890a28a3853125ec0d62de1d83b394e2e3cce Mon Sep 17 00:00:00 2001 From: Niels De Graef Date: Sun, 26 Jan 2025 14:55:52 +0100 Subject: [PATCH] Integrate external extended bash-completion script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The [bash-completion] git repository has had an extended version for dealing with bash-compleions of our `secret-tool` for a while now. We've agreed it makes sense to ship their version upstream, i.e. in this repo. I didn't author this, the real credits go to the authors mentioned below. [bash-completion]: https://github.com/scop/bash-completion Co-authored-by: Ville Skyttä Co-authored-by: Koichi Murase Fixes: https://gitlab.gnome.org/GNOME/libsecret/-/issues/103 --- bash-completion/secret-tool | 55 +++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/bash-completion/secret-tool b/bash-completion/secret-tool index 5e9ce69..e8aafd8 100644 --- a/bash-completion/secret-tool +++ b/bash-completion/secret-tool @@ -1,19 +1,50 @@ -# secret-tool(1) completion +# bash completion for secret-tool(1) -*- shell-script -*- -_secret-tool() +_comp_cmd_secret_tool() { - local cur prev word cword - _init_completion || return + local cur prev words cword was_split comp_args + _comp_initialize -s -- "$@" || return - if [[ $cur == -* ]]; then - local opts="--help --verbose -q --quiet" - COMPREPLY=( $(compgen -W "$opts" -- "$cur") ) - return - elif [[ $cword -eq 1 ]]; then - local commands='store lookup clear search' - COMPREPLY=( $(compgen -W "$commands" -- "$cur") ) + [[ $was_split ]] && return + + local -i i + local mode="" has_mode="" word + for i in ${!words[*]}; do + if [[ $i -gt 0 && ${words[i]} != -* ]]; then + ((i != cword)) && mode=${words[i]} has_mode=set + break + fi + done + if [[ ! $has_mode ]]; then + # generate modes + _comp_compgen_split -- "$("$1" nonexistent-mode 2>&1 | + while read -r first second third rest; do + if [[ $first == "${1##*/}" ]]; then + printf "%s\n" "$second" + elif [[ $first == usage: && $second == "${1##*/}" ]]; then + printf "%s\n" "$third" + fi + done)" + return fi + + case $mode in + store) + if [[ ${words[*]} != *\ --label[\ =]* ]]; then + _comp_compgen -- -W "--label=" + [[ ${COMPREPLY-} == *= ]] && compopt -o nospace + fi + ;; + search) + local -A opts=([--all]="" [--unlock]="") + for word in "${words[@]:2}"; do + [[ $word ]] && unset -v 'opts[$word]' + done + ((${#opts[@]})) && + _comp_compgen -- -W '"${!opts[@]}"' + ;; + esac } && -complete -F _secret-tool secret-tool + complete -F _comp_cmd_secret_tool secret-tool # ex: filetype=sh