diff mbox series

[bug#63860,v2] Add Bash completion file.

Message ID 20230603093659.14873-1-go.wigust@gmail.com
State New
Headers show
Series [bug#63860,v2] Add Bash completion file. | expand

Commit Message

Oleg Pykhalov June 3, 2023, 9:37 a.m. UTC
* etc/completion/bash/herd: New file.
* Makefile.am (dist_bashcompletion_DATA): New variable.
* configure.ac: Add --with-bash-completion-dir.
---
 Makefile.am              |   4 ++
 configure.ac             |   9 ++++
 etc/completion/bash/herd | 103 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 116 insertions(+)
 create mode 100644 etc/completion/bash/herd

Comments

Oleg Pykhalov June 3, 2023, 9:41 a.m. UTC | #1
Oleg Pykhalov <go.wigust@gmail.com> writes:

> * etc/completion/bash/herd: New file.
> * Makefile.am (dist_bashcompletion_DATA): New variable.
> * configure.ac: Add --with-bash-completion-dir.
> ---
>  Makefile.am              |   4 ++
>  configure.ac             |   9 ++++
>  etc/completion/bash/herd | 103 +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 116 insertions(+)
>  create mode 100644 etc/completion/bash/herd

v2 fixes warnings reported by shellcheck utility, which should be used
in the first place, apologies. Everything else works in the same way.

Regards,
Oleg.
Liliana Marie Prikler June 3, 2023, 6:20 p.m. UTC | #2
Am Samstag, dem 03.06.2023 um 12:37 +0300 schrieb Oleg Pykhalov:
> * etc/completion/bash/herd: New file.
> * Makefile.am (dist_bashcompletion_DATA): New variable.
> * configure.ac: Add --with-bash-completion-dir.
> ---
>  Makefile.am              |   4 ++
>  configure.ac             |   9 ++++
>  etc/completion/bash/herd | 103
> +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 116 insertions(+)
>  create mode 100644 etc/completion/bash/herd
> 
> diff --git a/Makefile.am b/Makefile.am
> index d82e75c..d7b5d36 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -2,6 +2,7 @@
>  # Copyright © 2002, 2003 Wolfgang Jährling <wolfgang@pro-linux.de>
>  # Copyright © 2013-2016, 2018-2020, 2022-2023 Ludovic Courtès
> <ludo@gnu.org>
>  # Copyright © 2018 Carlo Zancanaro <carlo@zancanaro.id.au>
> +# Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
>  #
>  # This file is part of the GNU Shepherd.
>  #
> @@ -135,6 +136,9 @@ doc/%.8: modules/shepherd/scripts/%.scm
> configure.ac
>  dist_man1_MANS = doc/shepherd.1 doc/herd.1
>  dist_man8_MANS = doc/halt.8 doc/reboot.8
>  
> +# Bash completion file.
> +dist_bashcompletion_DATA = etc/completion/bash/herd
> +
>  # Things not automatically included in the distribution.
>  EXTRA_DIST +=                                  \
>    build-aux/config.rpath                       \
> diff --git a/configure.ac b/configure.ac
> index 18455a0..8aaea92 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -172,6 +172,15 @@ esac
>  AC_MSG_RESULT([$build_crash_handler])
>  AM_CONDITIONAL([BUILD_CRASH_HANDLER], [test "x$build_crash_handler"
> = "xyes"])
>  
> +dnl Bash completion file.
> +
> +AC_ARG_WITH([bash-completion-dir],
> +  AC_HELP_STRING([--with-bash-completion-dir=DIR],
> +    [name of the Bash completion directory]),
> +  [bashcompletiondir="$withval"],
> +  [bashcompletiondir='${sysconfdir}/bash_completion.d'])
> +AC_SUBST([bashcompletiondir])
> +
>  dnl Manual pages.
>  AM_MISSING_PROG([HELP2MAN], [help2man])
>  
> diff --git a/etc/completion/bash/herd b/etc/completion/bash/herd
> new file mode 100644
> index 0000000..06afaae
> --- /dev/null
> +++ b/etc/completion/bash/herd
> @@ -0,0 +1,103 @@
> +# GNU Shepherd --- System service manager for GNU
> +# Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
> +#
> +# This file is part of GNU Shepherd.
> +#
> +# GNU Shepherd is free software; you can redistribute it and/or
> modify it
> +# under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> (at
> +# your option) any later version.
> +#
> +# GNU Shepherd 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 General Public License
> +# along with GNU Shepherd.  If not, see
> <http://www.gnu.org/licenses/>.
> +
> +# Bash completion for Shepherd commands.
> +
> +_herd_complete_subcommand()
> +{
> +    local command="${COMP_WORDS[1]}"
> +    case "$command" in
> +        discover)
> +            complitions="guix-daemon"
> +            mapfile -t COMPREPLY < <(compgen -W "$complitions" --
> "${COMP_WORDS[$COMP_CWORD]}")
> +            ;;
Is there a reason to call the variable "complitions" rather than
"completions" or using an immediate value?
> +        schedule)
> +            complitions="mcron"
> +            mapfile -t COMPREPLY < <(compgen -W "$complitions" --
> "${COMP_WORDS[$COMP_CWORD]}")
> +            ;;
> +        set-http-proxy)
> +            complitions="guix-daemon"
> +            mapfile -t COMPREPLY < <(compgen -W "$complitions" --
> "${COMP_WORDS[$COMP_CWORD]}")
> +            ;;
> +        *)
> +            local services
> +            services="$(herd status | grep '^ +\|^ -\| \*' | cut -d
> ' ' -f3)"
> +            mapfile -t COMPREPLY < <(compgen -W "$services" --
> "${COMP_WORDS[$COMP_CWORD]}")
> +            ;;
> +    esac
> +}
> +
> +_herd_complete_3()
> +{
> +    local command="${COMP_WORDS[2]}"
> +    case "$command" in
> +        guix-daemon)
> +            complitions="on off"
> +            mapfile -t COMPREPLY < <(compgen -W "$complitions" --
> "${COMP_WORDS[$COMP_CWORD]}")
> +            ;;
> +        *)
> +            ;;
> +    esac
> +}
> +
> +_herd_is_command ()
> +{
> +    local word
> +    local result="false"
> +    for word in "${COMP_WORDS[@]}"
> +    do
> +       if [ "$word" = "$1" ]
> +       then
> +           result=true
> +           break
> +       fi
> +    done
> +    $result
> +}
> +
> +_herd_complete()
> +{
> +    case $COMP_CWORD in
> +        1)
> +           if [ -z "$_herd_subcommands" ]
> +           then
> +               # Cache the list of subcommands to speed things up.
> +                _herd_subcommands_list=(
> +                    disable
> +                    discover
> +                    enable
> +                    schedule
> +                    set-http-proxy
> +                    start
> +                    status
> +                    stop
> +                )
> +               _herd_subcommands="${_herd_subcommands_list[*]}"
> +           fi
> +            mapfile -t COMPREPLY < <(compgen -W "$_herd_subcommands"
> -- "${COMP_WORDS[$COMP_CWORD]}")
> +            ;;
> +        *)
> +            case $COMP_CWORD in
> +               2) _herd_complete_subcommand;;
> +               3) _herd_complete_3;;
> +           esac
> +            ;;
> +    esac
> +}
> +
> +complete -F _herd_complete herd

Cheers
Oleg Pykhalov June 3, 2023, 7:28 p.m. UTC | #3
Liliana Marie Prikler <liliana.prikler@gmail.com> writes:

[…]

>> +{
>> +    local command="${COMP_WORDS[1]}"
>> +    case "$command" in
>> +        discover)
>> +            complitions="guix-daemon"
>> +            mapfile -t COMPREPLY < <(compgen -W "$complitions" --
>> "${COMP_WORDS[$COMP_CWORD]}")
>> +            ;;
> Is there a reason to call the variable "complitions" rather than
> "completions"

No reason, it's a typo probably from autocompletion of my editor. :-)

> or using an immediate value?

Do you mean to use the following?
--8<---------------cut here---------------start------------->8---
    case "$command" in
        discover)
            mapfile -t COMPREPLY < <(compgen -W guix-daemon -- "${COMP_WORDS[$COMP_CWORD]}")
            ;;
    ...
--8<---------------cut here---------------end--------------->8---

yes, this will work.


No strong opinion on that, both ways would work for me.


Regards,
Oleg.
Liliana Marie Prikler June 3, 2023, 9:42 p.m. UTC | #4
Am Samstag, dem 03.06.2023 um 22:28 +0300 schrieb Oleg Pykhalov:
> Liliana Marie Prikler <liliana.prikler@gmail.com> writes:
> 
> […]
> 
> > > +{
> > > +    local command="${COMP_WORDS[1]}"
> > > +    case "$command" in
> > > +        discover)
> > > +            complitions="guix-daemon"
> > > +            mapfile -t COMPREPLY < <(compgen -W "$complitions" -
> > > -
> > > "${COMP_WORDS[$COMP_CWORD]}")
> > > +            ;;
> > Is there a reason to call the variable "complitions" rather than
> > "completions"
> 
> No reason, it's a typo probably from autocompletion of my editor. :-)
> 
> > or using an immediate value?
> 
> Do you mean to use the following?
> --8<---------------cut here---------------start------------->8---
>     case "$command" in
>         discover)
>             mapfile -t COMPREPLY < <(compgen -W guix-daemon --
> "${COMP_WORDS[$COMP_CWORD]}")
>             ;;
>     ...
> --8<---------------cut here---------------end--------------->8---
> 
> yes, this will work.
I'd still quote "guix-daemon", but yeah.

Cheers
diff mbox series

Patch

diff --git a/Makefile.am b/Makefile.am
index d82e75c..d7b5d36 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2,6 +2,7 @@ 
 # Copyright © 2002, 2003 Wolfgang Jährling <wolfgang@pro-linux.de>
 # Copyright © 2013-2016, 2018-2020, 2022-2023 Ludovic Courtès <ludo@gnu.org>
 # Copyright © 2018 Carlo Zancanaro <carlo@zancanaro.id.au>
+# Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
 #
 # This file is part of the GNU Shepherd.
 #
@@ -135,6 +136,9 @@  doc/%.8: modules/shepherd/scripts/%.scm configure.ac
 dist_man1_MANS = doc/shepherd.1 doc/herd.1
 dist_man8_MANS = doc/halt.8 doc/reboot.8
 
+# Bash completion file.
+dist_bashcompletion_DATA = etc/completion/bash/herd
+
 # Things not automatically included in the distribution.
 EXTRA_DIST +=					\
   build-aux/config.rpath			\
diff --git a/configure.ac b/configure.ac
index 18455a0..8aaea92 100644
--- a/configure.ac
+++ b/configure.ac
@@ -172,6 +172,15 @@  esac
 AC_MSG_RESULT([$build_crash_handler])
 AM_CONDITIONAL([BUILD_CRASH_HANDLER], [test "x$build_crash_handler" = "xyes"])
 
+dnl Bash completion file.
+
+AC_ARG_WITH([bash-completion-dir],
+  AC_HELP_STRING([--with-bash-completion-dir=DIR],
+    [name of the Bash completion directory]),
+  [bashcompletiondir="$withval"],
+  [bashcompletiondir='${sysconfdir}/bash_completion.d'])
+AC_SUBST([bashcompletiondir])
+
 dnl Manual pages.
 AM_MISSING_PROG([HELP2MAN], [help2man])
 
diff --git a/etc/completion/bash/herd b/etc/completion/bash/herd
new file mode 100644
index 0000000..06afaae
--- /dev/null
+++ b/etc/completion/bash/herd
@@ -0,0 +1,103 @@ 
+# GNU Shepherd --- System service manager for GNU
+# Copyright © 2023 Oleg Pykhalov <go.wigust@gmail.com>
+#
+# This file is part of GNU Shepherd.
+#
+# GNU Shepherd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or (at
+# your option) any later version.
+#
+# GNU Shepherd 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 General Public License
+# along with GNU Shepherd.  If not, see <http://www.gnu.org/licenses/>.
+
+# Bash completion for Shepherd commands.
+
+_herd_complete_subcommand()
+{
+    local command="${COMP_WORDS[1]}"
+    case "$command" in
+        discover)
+            complitions="guix-daemon"
+            mapfile -t COMPREPLY < <(compgen -W "$complitions" -- "${COMP_WORDS[$COMP_CWORD]}")
+            ;;
+        schedule)
+            complitions="mcron"
+            mapfile -t COMPREPLY < <(compgen -W "$complitions" -- "${COMP_WORDS[$COMP_CWORD]}")
+            ;;
+        set-http-proxy)
+            complitions="guix-daemon"
+            mapfile -t COMPREPLY < <(compgen -W "$complitions" -- "${COMP_WORDS[$COMP_CWORD]}")
+            ;;
+        *)
+            local services
+            services="$(herd status | grep '^ +\|^ -\| \*' | cut -d ' ' -f3)"
+            mapfile -t COMPREPLY < <(compgen -W "$services" -- "${COMP_WORDS[$COMP_CWORD]}")
+            ;;
+    esac
+}
+
+_herd_complete_3()
+{
+    local command="${COMP_WORDS[2]}"
+    case "$command" in
+        guix-daemon)
+            complitions="on off"
+            mapfile -t COMPREPLY < <(compgen -W "$complitions" -- "${COMP_WORDS[$COMP_CWORD]}")
+            ;;
+        *)
+            ;;
+    esac
+}
+
+_herd_is_command ()
+{
+    local word
+    local result="false"
+    for word in "${COMP_WORDS[@]}"
+    do
+	if [ "$word" = "$1" ]
+	then
+	    result=true
+	    break
+	fi
+    done
+    $result
+}
+
+_herd_complete()
+{
+    case $COMP_CWORD in
+        1)
+	    if [ -z "$_herd_subcommands" ]
+	    then
+		# Cache the list of subcommands to speed things up.
+                _herd_subcommands_list=(
+                    disable
+                    discover
+                    enable
+                    schedule
+                    set-http-proxy
+                    start
+                    status
+                    stop
+                )
+		_herd_subcommands="${_herd_subcommands_list[*]}"
+	    fi
+            mapfile -t COMPREPLY < <(compgen -W "$_herd_subcommands" -- "${COMP_WORDS[$COMP_CWORD]}")
+            ;;
+        *)
+            case $COMP_CWORD in
+		2) _herd_complete_subcommand;;
+		3) _herd_complete_3;;
+	    esac
+            ;;
+    esac
+}
+
+complete -F _herd_complete herd