With the plethora of new command-line options, it is starting to get
difficult to remember them all. This commit introduces shell completions
for bash and zsh for the convenience of the user.
Instead of writing the completion files by hand (a tedious task), the
files are generated automatically from a Python spec using shtab [1].
To ease the integration into the main Makefile (automake), the generated
completions are stored in git as well. This has the advantage that 'make
install' will install the completion files. A CI job ensures that the
generated files are in sync with the spec (i.e. python files).
[1]
https://github.com/iterative/shtab
.github/workflows/main.yaml | 9 ++
.gitignore | 4 +
Makefile.am | 6 +
share/completion/.gitignore | 2 +
share/completion/Makefile | 38 +++++
share/completion/bg_printenv/cli.py | 31 ++++
share/completion/bg_printenv/common.py | 1 +
share/completion/bg_setenv/cli.py | 47 ++++++
share/completion/bg_setenv/common.py | 1 +
share/completion/common.py | 23 +++
.../generated/bash/bg_printenv.bash | 139 +++++++++++++++++
.../completion/generated/bash/bg_setenv.bash | 142 ++++++++++++++++++
share/completion/generated/zsh/_bg_printenv | 37 +++++
share/completion/generated/zsh/_bg_setenv | 43 ++++++
14 files changed, 523 insertions(+)
create mode 100644 share/completion/.gitignore
create mode 100644 share/completion/Makefile
create mode 100644 share/completion/bg_printenv/cli.py
create mode 120000 share/completion/bg_printenv/common.py
create mode 100644 share/completion/bg_setenv/cli.py
create mode 120000 share/completion/bg_setenv/common.py
create mode 100644 share/completion/common.py
create mode 100644 share/completion/generated/bash/bg_printenv.bash
create mode 100644 share/completion/generated/bash/bg_setenv.bash
create mode 100644 share/completion/generated/zsh/_bg_printenv
create mode 100644 share/completion/generated/zsh/_bg_setenv
diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml
index 10b2a2d..78f6ce4 100644
--- a/.github/workflows/main.yaml
+++ b/.github/workflows/main.yaml
@@ -160,3 +160,12 @@ jobs:
# files are provided. Compare 'cppcheck --help'.
cppcheck -f -q --error-exitcode=2 $enable $suppress $ignore \
$cpp_conf $includes .
+
+ - name: Generate shell completions
+ if: ${{ matrix.target == 'amd64' }}
+ run: |
+ sudo apt-get install -y --no-install-recommends make python3 pip git
+ sudo pip install shtab
+ rm -rf share/completion/generated
+ make -C share/completion
+ git diff --exit-code share/completion
diff --git a/.gitignore b/.gitignore
index 1943fe0..f472f03 100644
--- a/.gitignore
+++ b/.gitignore
@@ -92,3 +92,7 @@ test_ebgenv_api
test_ebgenv_api_internal
test_probe_config_file
test_probe_config_partitions
+
+### Python ###
+__pycache__
+*.pyc
diff --git a/Makefile.am b/Makefile.am
index 8081839..9351488 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -218,6 +218,12 @@ efibootguard_DATA = $(efi_loadername)
CLEANFILES += $(efi_objects) $(efi_solib) $(efi_loadername)
EXTRA_DIST += $(efi_sources)
+bashcompletiondir = ${datarootdir}/efibootguard/completion/bash
+bashcompletion_DATA = share/completion/generated/bash/bg_setenv.bash share/completion/generated/bash/bg_printenv.bash
+
+zshcompletiondir = ${datarootdir}/efibootguard/completion/zsh
+zshcompletion_DATA = share/completion/generated/zsh/_bg_setenv share/completion/generated/zsh/_bg_printenv
+
$(top_builddir)/%.o: $(top_srcdir)/%.c
@$(MKDIR_P) $(shell dirname $@)/
$(AM_V_CC)$(GNUEFI_CC) $(efi_cppflags) $(efi_cflags) -c $< -o $@
diff --git a/share/completion/.gitignore b/share/completion/.gitignore
new file mode 100644
index 0000000..b731cd1
--- /dev/null
+++ b/share/completion/.gitignore
@@ -0,0 +1,2 @@
+!bg_printenv
+!bg_setenv
diff --git a/share/completion/Makefile b/share/completion/Makefile
new file mode 100644
index 0000000..21105bb
--- /dev/null
+++ b/share/completion/Makefile
@@ -0,0 +1,38 @@
+# Copyright (c) Siemens AG, 2021
+#
+# Authors:
+# Michael Adler <
michae...@siemens.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2. See
+# the COPYING file in the top-level directory.
+#
+# SPDX-License-Identifier: GPL-2.0
+PYTHON ?= python3
+
+all: bash-completion zsh-completion
+
+bash-completion: generated/bash/bg_setenv.bash generated/bash/bg_printenv.bash
+
+zsh-completion: generated/zsh/_bg_setenv generated/zsh/_bg_printenv
+
+generated/bash/bg_setenv.bash: bg_setenv/cli.py
+ @echo "Generating $@"
+ @mkdir -p $(@D)
+ @$(PYTHON) -m shtab --shell=bash -u "bg_setenv.cli.bg_setenv" >$@
+
+generated/bash/bg_printenv.bash: bg_printenv/cli.py
+ @echo "Generating $@"
+ @mkdir -p $(@D)
+ @-$(PYTHON) -m shtab --shell=bash -u "bg_printenv.cli.bg_printenv" >$@
+
+generated/zsh/_bg_setenv: bg_setenv/cli.py
+ @echo "Generating $@"
+ @mkdir -p $(@D)
+ @-$(PYTHON) -m shtab --shell=zsh -u "bg_setenv.cli.bg_setenv" >$@
+
+generated/zsh/_bg_printenv: bg_printenv/cli.py
+ @echo "Generating $@"
+ @mkdir -p $(@D)
+ @-$(PYTHON) -m shtab --shell=zsh -u "bg_printenv.cli.bg_printenv" >$@
+
+.PHONY: all bash-completion zsh-completion
diff --git a/share/completion/bg_printenv/cli.py b/share/completion/bg_printenv/cli.py
new file mode 100644
index 0000000..570faf9
--- /dev/null
+++ b/share/completion/bg_printenv/cli.py
@@ -0,0 +1,31 @@
+#
+# Copyright (c) Siemens AG, 2021
+#
+# Authors:
+# Michael Adler <
michae...@siemens.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2. See
+# the COPYING file in the top-level directory.
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import argparse
+
+from .common import add_common_opts
+
+
+def bg_printenv():
+ parser = argparse.ArgumentParser(prog="bg_printenv", add_help=False)
+ add_common_opts(parser)
+ parser.add_argument("-c", "--current", action="store_true", help="Only print values from the current environment")
+ parser.add_argument(
+ "-o",
+ "--output",
+ choices=["in_progress", "revision", "kernel", "kernelargs", "watchdog_timeout", "ustate", "user"],
+ help="Comma-separated list of fields which are printed",
+ )
+ parser.add_argument("-r", "--raw", action="store_true", help="Raw output mode")
+ parser.add_argument("--usage", action="store_true", help="Give a short usage message")
+ return parser
+
+
diff --git a/share/completion/bg_printenv/common.py b/share/completion/bg_printenv/common.py
new file mode 120000
index 0000000..a11703e
--- /dev/null
+++ b/share/completion/bg_printenv/common.py
@@ -0,0 +1 @@
+../common.py
\ No newline at end of file
diff --git a/share/completion/bg_setenv/cli.py b/share/completion/bg_setenv/cli.py
new file mode 100644
index 0000000..9698882
--- /dev/null
+++ b/share/completion/bg_setenv/cli.py
@@ -0,0 +1,47 @@
+#
+# Copyright (c) Siemens AG, 2021
+#
+# Authors:
+# Michael Adler <
michae...@siemens.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2. See
+# the COPYING file in the top-level directory.
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import argparse
+
+from .common import add_common_opts
+
+
+def bg_setenv():
+ parser = argparse.ArgumentParser(prog="bg_setenv", add_help=False)
+ add_common_opts(parser)
+ parser.add_argument("-P", "--preserve", action="store_true", help="Preserve existing entries")
+ parser.add_argument("-k", "--kernel", metavar="KERNEL", help="Set kernel to load")
+ parser.add_argument("-a", "--args", metavar="KERNEL_ARGS", help="Set kernel arguments")
+ parser.add_argument("-r", "--revision", metavar="REVISION", help="Set revision value")
+ parser.add_argument(
+ "-s",
+ "--ustate",
+ choices=["OK", "INSTALLED", "TESTING", "FAILED", "UNKNOWN"],
+ metavar="USTATE",
+ help="Set update status for environment",
+ )
+ parser.add_argument("-w", "--watchdog", metavar="WATCHDOG_TIMEOUT", help="Watchdog timeout in seconds")
+ parser.add_argument("-c", "--confirm", action="store_true", help="Confirm working environment")
+ parser.add_argument("-u", "--update", action="store_true", help="Automatically update oldest revision")
+ parser.add_argument(
+ "-x",
+ "--uservar",
+ metavar="KEY=VAL",
+ help="Set user-defined string variable. For setting multiple variables, use this option multiple times.",
+ )
+ parser.add_argument(
+ "-i",
+ "--in_progress",
+ metavar="IN_PROGRESS",
+ choices=["0", "1"],
+ help="Set in_progress variable to simulate a running update process.",
+ )
+ return parser
diff --git a/share/completion/bg_setenv/common.py b/share/completion/bg_setenv/common.py
new file mode 120000
index 0000000..a11703e
--- /dev/null
+++ b/share/completion/bg_setenv/common.py
@@ -0,0 +1 @@
+../common.py
\ No newline at end of file
diff --git a/share/completion/common.py b/share/completion/common.py
new file mode 100644
index 0000000..8134aef
--- /dev/null
+++ b/share/completion/common.py
@@ -0,0 +1,23 @@
+#
+# Copyright (c) Siemens AG, 2021
+#
+# Authors:
+# Michael Adler <
michae...@siemens.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2. See
+# the COPYING file in the top-level directory.
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import shtab
+
+
+def add_common_opts(parser):
+ parser.add_argument(
+ "-f", "--filepath", metavar="ENVFILE", help="Environment to use. Expects a file name, usually called BGENV.DAT."
+ ).complete = shtab.FILE
+ parser.add_argument("-p", "--part", metavar="ENV_PART", type=int, help="Set environment partition to update")
+ parser.add_argument("-v", "--verbose", action="store_true", help="Be verbose")
+ parser.add_argument("-V", "--version", action="store_true", help="Print version")
+ # there is a bug in shtab which currently prohibits "-?"
+ parser.add_argument("--help", action="store_true", help="Show help")
diff --git a/share/completion/generated/bash/bg_printenv.bash b/share/completion/generated/bash/bg_printenv.bash
new file mode 100644
index 0000000..3c6dd6c
--- /dev/null
+++ b/share/completion/generated/bash/bg_printenv.bash
@@ -0,0 +1,139 @@
+#!/usr/bin/env bash
+# AUTOMATCALLY GENERATED by `shtab`
+
+
+
+_shtab_bg_printenv_option_strings=('-f' '--filepath' '-p' '--part' '-v' '--verbose' '-V' '--version' '--help' '-c' '--current' '-o' '--output' '-r' '--raw' '--usage')
+
+_shtab_bg_printenv__f_COMPGEN=_shtab_compgen_files
+_shtab_bg_printenv___filepath_COMPGEN=_shtab_compgen_files
+
+_shtab_bg_printenv__o_choices='in_progress revision kernel kernelargs watchdog_timeout ustate user'
+_shtab_bg_printenv___output_choices='in_progress revision kernel kernelargs watchdog_timeout ustate user'
+
+_shtab_bg_printenv__v_nargs=0
+_shtab_bg_printenv___verbose_nargs=0
+_shtab_bg_printenv__V_nargs=0
+_shtab_bg_printenv___version_nargs=0
+_shtab_bg_printenv___help_nargs=0
+_shtab_bg_printenv__c_nargs=0
+_shtab_bg_printenv___current_nargs=0
+_shtab_bg_printenv__r_nargs=0
+_shtab_bg_printenv___raw_nargs=0
+_shtab_bg_printenv___usage_nargs=0
+
+
+# $1=COMP_WORDS[1]
+_shtab_compgen_files() {
+ compgen -f -- $1 # files
+}
+
+# $1=COMP_WORDS[1]
+_shtab_compgen_dirs() {
+ compgen -d -- $1 # recurse into subdirs
+}
+
+# $1=COMP_WORDS[1]
+_shtab_replace_nonword() {
+ echo "${1//[^[:word:]]/_}"
+}
+
+# set default values (called for the initial parser & any subparsers)
+_set_parser_defaults() {
+ local subparsers_var="${prefix}_subparsers[@]"
+ sub_parsers=${!subparsers_var}
+
+ local current_option_strings_var="${prefix}_option_strings[@]"
+ current_option_strings=${!current_option_strings_var}
+
+ completed_positional_actions=0
+
+ _set_new_action "pos_${completed_positional_actions}" true
+}
+
+# $1=action identifier
+# $2=positional action (bool)
+# set all identifiers for an action's parameters
+_set_new_action() {
+ current_action="${prefix}_$(_shtab_replace_nonword $1)"
+
+ local current_action_compgen_var=${current_action}_COMPGEN
+ current_action_compgen="${!current_action_compgen_var}"
+
+ local current_action_choices_var="${current_action}_choices"
+ current_action_choices="${!current_action_choices_var}"
+
+ local current_action_nargs_var="${current_action}_nargs"
+ if [ -n "${!current_action_nargs_var}" ]; then
+ current_action_nargs="${!current_action_nargs_var}"
+ else
+ current_action_nargs=1
+ fi
+
+ current_action_args_start_index=$(( $word_index + 1 ))
+
+ current_action_is_positional=$2
+}
+
+# Notes:
+# `COMPREPLY`: what will be rendered after completion is triggered
+# `completing_word`: currently typed word to generate completions for
+# `${!var}`: evaluates the content of `var` and expand its content as a variable
+# hello="world"
+# x="hello"
+# ${!x} -> ${hello} -> "world"
+_shtab_bg_printenv() {
+ local completing_word="${COMP_WORDS[COMP_CWORD]}"
+ COMPREPLY=()
+
+ prefix=_shtab_bg_printenv
+ word_index=0
+ _set_parser_defaults
+ word_index=1
+
+ # determine what arguments are appropriate for the current state
+ # of the arg parser
+ while [ $word_index -ne $COMP_CWORD ]; do
+ local this_word="${COMP_WORDS[$word_index]}"
+
+ if [[ -n $sub_parsers && " ${sub_parsers[@]} " =~ " ${this_word} " ]]; then
+ # valid subcommand: add it to the prefix & reset the current action
+ prefix="${prefix}_$(_shtab_replace_nonword $this_word)"
+ _set_parser_defaults
+ fi
+
+ if [[ " ${current_option_strings[@]} " =~ " ${this_word} " ]]; then
+ # a new action should be acquired (due to recognised option string or
+ # no more input expected from current action);
+ # the next positional action can fill in here
+ _set_new_action $this_word false
+ fi
+
+ if [[ "$current_action_nargs" != "*" ]] && \
+ [[ "$current_action_nargs" != "+" ]] && \
+ [[ "$current_action_nargs" != *"..." ]] && \
+ (( $word_index + 1 - $current_action_args_start_index >= \
+ $current_action_nargs )); then
+ $current_action_is_positional && let "completed_positional_actions += 1"
+ _set_new_action "pos_${completed_positional_actions}" true
+ fi
+
+ let "word_index+=1"
+ done
+
+ # Generate the completions
+
+ if [[ "${completing_word}" == -* ]]; then
+ # optional argument started: use option strings
+ COMPREPLY=( $(compgen -W "${current_option_strings[*]}" -- "${completing_word}") )
+ else
+ # use choices & compgen
+ COMPREPLY=( $(compgen -W "${current_action_choices}" -- "${completing_word}"; \
+ [ -n "${current_action_compgen}" ] \
+ && "${current_action_compgen}" "${completing_word}") )
+ fi
+
+ return 0
+}
+
+complete -o filenames -F _shtab_bg_printenv bg_printenv
diff --git a/share/completion/generated/bash/bg_setenv.bash b/share/completion/generated/bash/bg_setenv.bash
new file mode 100644
index 0000000..66a7332
--- /dev/null
+++ b/share/completion/generated/bash/bg_setenv.bash
@@ -0,0 +1,142 @@
+#!/usr/bin/env bash
+# AUTOMATCALLY GENERATED by `shtab`
+
+
+
+_shtab_bg_setenv_option_strings=('-f' '--filepath' '-p' '--part' '-v' '--verbose' '-V' '--version' '--help' '-P' '--preserve' '-k' '--kernel' '-a' '--args' '-r' '--revision' '-s' '--ustate' '-w' '--watchdog' '-c' '--confirm' '-u' '--update' '-x' '--uservar' '-i' '--in_progress')
+
+_shtab_bg_setenv__f_COMPGEN=_shtab_compgen_files
+_shtab_bg_setenv___filepath_COMPGEN=_shtab_compgen_files
+
+_shtab_bg_setenv__s_choices='OK INSTALLED TESTING FAILED UNKNOWN'
+_shtab_bg_setenv___ustate_choices='OK INSTALLED TESTING FAILED UNKNOWN'
+_shtab_bg_setenv__i_choices='0 1'
+_shtab_bg_setenv___in_progress_choices='0 1'
+
+_shtab_bg_setenv__v_nargs=0
+_shtab_bg_setenv___verbose_nargs=0
+_shtab_bg_setenv__V_nargs=0
+_shtab_bg_setenv___version_nargs=0
+_shtab_bg_setenv___help_nargs=0
+_shtab_bg_setenv__P_nargs=0
+_shtab_bg_setenv___preserve_nargs=0
+_shtab_bg_setenv__c_nargs=0
+_shtab_bg_setenv___confirm_nargs=0
+_shtab_bg_setenv__u_nargs=0
+_shtab_bg_setenv___update_nargs=0
+
+
+# $1=COMP_WORDS[1]
+_shtab_compgen_files() {
+ compgen -f -- $1 # files
+}
+
+# $1=COMP_WORDS[1]
+_shtab_compgen_dirs() {
+ compgen -d -- $1 # recurse into subdirs
+}
+
+# $1=COMP_WORDS[1]
+_shtab_replace_nonword() {
+ echo "${1//[^[:word:]]/_}"
+}
+
+# set default values (called for the initial parser & any subparsers)
+_set_parser_defaults() {
+ local subparsers_var="${prefix}_subparsers[@]"
+ sub_parsers=${!subparsers_var}
+
+ local current_option_strings_var="${prefix}_option_strings[@]"
+ current_option_strings=${!current_option_strings_var}
+
+ completed_positional_actions=0
+
+ _set_new_action "pos_${completed_positional_actions}" true
+}
+
+# $1=action identifier
+# $2=positional action (bool)
+# set all identifiers for an action's parameters
+_set_new_action() {
+ current_action="${prefix}_$(_shtab_replace_nonword $1)"
+
+ local current_action_compgen_var=${current_action}_COMPGEN
+ current_action_compgen="${!current_action_compgen_var}"
+
+ local current_action_choices_var="${current_action}_choices"
+ current_action_choices="${!current_action_choices_var}"
+
+ local current_action_nargs_var="${current_action}_nargs"
+ if [ -n "${!current_action_nargs_var}" ]; then
+ current_action_nargs="${!current_action_nargs_var}"
+ else
+ current_action_nargs=1
+ fi
+
+ current_action_args_start_index=$(( $word_index + 1 ))
+
+ current_action_is_positional=$2
+}
+
+# Notes:
+# `COMPREPLY`: what will be rendered after completion is triggered
+# `completing_word`: currently typed word to generate completions for
+# `${!var}`: evaluates the content of `var` and expand its content as a variable
+# hello="world"
+# x="hello"
+# ${!x} -> ${hello} -> "world"
+_shtab_bg_setenv() {
+ local completing_word="${COMP_WORDS[COMP_CWORD]}"
+ COMPREPLY=()
+
+ prefix=_shtab_bg_setenv
+ word_index=0
+ _set_parser_defaults
+ word_index=1
+
+ # determine what arguments are appropriate for the current state
+ # of the arg parser
+ while [ $word_index -ne $COMP_CWORD ]; do
+ local this_word="${COMP_WORDS[$word_index]}"
+
+ if [[ -n $sub_parsers && " ${sub_parsers[@]} " =~ " ${this_word} " ]]; then
+ # valid subcommand: add it to the prefix & reset the current action
+ prefix="${prefix}_$(_shtab_replace_nonword $this_word)"
+ _set_parser_defaults
+ fi
+
+ if [[ " ${current_option_strings[@]} " =~ " ${this_word} " ]]; then
+ # a new action should be acquired (due to recognised option string or
+ # no more input expected from current action);
+ # the next positional action can fill in here
+ _set_new_action $this_word false
+ fi
+
+ if [[ "$current_action_nargs" != "*" ]] && \
+ [[ "$current_action_nargs" != "+" ]] && \
+ [[ "$current_action_nargs" != *"..." ]] && \
+ (( $word_index + 1 - $current_action_args_start_index >= \
+ $current_action_nargs )); then
+ $current_action_is_positional && let "completed_positional_actions += 1"
+ _set_new_action "pos_${completed_positional_actions}" true
+ fi
+
+ let "word_index+=1"
+ done
+
+ # Generate the completions
+
+ if [[ "${completing_word}" == -* ]]; then
+ # optional argument started: use option strings
+ COMPREPLY=( $(compgen -W "${current_option_strings[*]}" -- "${completing_word}") )
+ else
+ # use choices & compgen
+ COMPREPLY=( $(compgen -W "${current_action_choices}" -- "${completing_word}"; \
+ [ -n "${current_action_compgen}" ] \
+ && "${current_action_compgen}" "${completing_word}") )
+ fi
+
+ return 0
+}
+
+complete -o filenames -F _shtab_bg_setenv bg_setenv
diff --git a/share/completion/generated/zsh/_bg_printenv b/share/completion/generated/zsh/_bg_printenv
new file mode 100644
index 0000000..9545483
--- /dev/null
+++ b/share/completion/generated/zsh/_bg_printenv
@@ -0,0 +1,37 @@
+#compdef bg_printenv
+
+# AUTOMATCALLY GENERATED by `shtab`
+
+_shtab_bg_printenv_options_=(
+ {-f,--filepath}"[Environment to use. Expects a file name, usually called BGENV.DAT.]:filepath:_files"
+ {-p,--part}"[Set environment partition to update]:part:"
+ {-v,--verbose}"[Be verbose]"
+ {-V,--version}"[Print version]"
+ "--help[Show help]"
+ {-c,--current}"[Only print values from the current environment]"
+ {-o,--output}"[Comma-separated list of fields which are printed]:output:(in_progress revision kernel kernelargs watchdog_timeout ustate user)"
+ {-r,--raw}"[Raw output mode]"
+ "--usage[Give a short usage message]"
+)
+
+_shtab_bg_printenv_commands_() {
+ local _commands=(
+
+ )
+
+ _describe 'bg_printenv commands' _commands
+}
+
+
+typeset -A opt_args
+local context state line curcontext="$curcontext"
+
+_arguments \
+ $_shtab_bg_printenv_options_ \
+ \
+ ': :_shtab_bg_printenv_commands_' \
+ '*::args:->args'
+
+case $words[1] in
+
+esac
diff --git a/share/completion/generated/zsh/_bg_setenv b/share/completion/generated/zsh/_bg_setenv
new file mode 100644
index 0000000..1f3af92
--- /dev/null
+++ b/share/completion/generated/zsh/_bg_setenv
@@ -0,0 +1,43 @@
+#compdef bg_setenv
+
+# AUTOMATCALLY GENERATED by `shtab`
+
+_shtab_bg_setenv_options_=(
+ {-f,--filepath}"[Environment to use. Expects a file name, usually called BGENV.DAT.]:filepath:_files"
+ {-p,--part}"[Set environment partition to update]:part:"
+ {-v,--verbose}"[Be verbose]"
+ {-V,--version}"[Print version]"
+ "--help[Show help]"
+ {-P,--preserve}"[Preserve existing entries]"
+ {-k,--kernel}"[Set kernel to load]:kernel:"
+ {-a,--args}"[Set kernel arguments]:args:"
+ {-r,--revision}"[Set revision value]:revision:"
+ {-s,--ustate}"[Set update status for environment]:ustate:(OK INSTALLED TESTING FAILED UNKNOWN)"
+ {-w,--watchdog}"[Watchdog timeout in seconds]:watchdog:"
+ {-c,--confirm}"[Confirm working environment]"
+ {-u,--update}"[Automatically update oldest revision]"
+ {-x,--uservar}"[Set user-defined string variable. For setting multiple variables, use this option multiple times.]:uservar:"
+ {-i,--in_progress}"[Set in_progress variable to simulate a running update process.]:in_progress:(0 1)"
+)
+
+_shtab_bg_setenv_commands_() {
+ local _commands=(
+
+ )
+
+ _describe 'bg_setenv commands' _commands
+}
+
+
+typeset -A opt_args
+local context state line curcontext="$curcontext"
+
+_arguments \
+ $_shtab_bg_setenv_options_ \
+ \
+ ': :_shtab_bg_setenv_commands_' \
+ '*::args:->args'
+
+case $words[1] in
+
+esac
--
2.33.1