Skip to content

Commit

Permalink
Add bash and zsh completion scripts for openqa-cli
Browse files Browse the repository at this point in the history
* Allow static completion of the openqa-cli
* Provide full cli options for each subcommand
* Group options for each subcommand
* Not help text in bash due to `compgen` function doesn't support descriptions

Signed-off-by: Ioannis Bonatakis <[email protected]>
  • Loading branch information
b10n1k committed Nov 21, 2024
1 parent 4f829f4 commit 298cf29
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 0 deletions.
8 changes: 8 additions & 0 deletions docs/UsersGuide.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -963,6 +963,14 @@ without needing to install openQA itself. Call `openqa-cli --help` for help.
The sub-commands provide further help, e.g. `openqa-cli api --help` contains
a lot of examples.

`openqa-cli` supports auto completion for `bash` and `zsh`.
If you use `bash` run or add the line below on your `.bashrc` profile.

[source,sh]
----
source openqa-cli-completion.bash
----

This section focuses on particular API use-cases. Checkout the
<<Client.asciidoc#client,openQA client>> section for further information about
the client itself, how authentication works and how plain `curl` can be used.
Expand Down
37 changes: 37 additions & 0 deletions openqa-cli-completion.bash
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/usr/bin/env bash

_openqa_cli_completions() {
local cur prev subcommands main_options api_options archive_options monitor_options schedule_options
cur="${COMP_WORDS[COMP_CWORD]}"
subcommands="api archive monitor schedule"
main_options="--apibase --apikey --apisecret --help --host --o3 --osd"
api_options="--json --retries --method --header --links --data-file --data --form --param-file"
archive_options="--asset-size-limit --name --with-thumbnails"
monitor_options="--name --poll-interval"
schedule_options="--monitor --name --poll-interval"

if [[ ${COMP_CWORD} -eq 1 ]]; then
COMPREPLY=($(compgen -W "$subcommands" -- "$cur"))
return 0
fi
case "${COMP_WORDS[1]}" in
api)
COMPREPLY=($(compgen -W "$main_options $api_options" -- "$cur"))
;;
archive)
COMPREPLY=($(compgen -W "$main_options $archive_options" -- "$cur"))
;;
monitor)
COMPREPLY=($(compgen -W "$main_options $monitor_options" -- "$cur"))
;;
schedule)
COMPREPLY=($(compgen -W "$main_options $schedule_options" -- "$cur"))
;;
*)
COMPREPLY=($(compgen -W "$subcommands" -- "$cur"))
;;
esac
}

# Register the completion function for openqa-cli
complete -F _openqa_cli_completions openqa-cli
78 changes: 78 additions & 0 deletions openqa-cli-completion.zsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#!/usr/bin/env zsh

_openqa_cli_completions() {
local curcontext="$curcontext" state line
typeset -A opt_args
local -a subcommands
local -a main_options
local -a output_options
local -a api_options
local -a archive_options
local -a monitor_options
local -a schedule_options
subcommands=("api" "archive" "monitor" "schedule")
main_options=(
'--apibase[Base URL for the API]'
'--apikey[API key for authentication]'
'--apisecret[API secret for authentication]'
'--help[Show help message]'
'--host[Target host, defaults to http://localhost]'
'--o3[Set target host to https://openqa.opensuse.org]'
'--osd[Set target host to http://openqa.suse.de]'
)
output_options=(
'--pretty[Pretty print JSON content]'
'--quiet[Do not print error messages to STDERR]'
'--verbose[Print HTTP response headers]'
)
api_options=(
'--json[Request content is JSON]'
'--retries[Retry up to the specified value on some error]'
'--method[HTTP method to use, defaults to GET]'
'--header[One or more additional HTTP headers]'
'--links[Print pagination links to STDERR]'
'--data-file[Load content to send with request from file]'
'--data[Content to send with request]'
'--form[Turn JSON object into form parameters]'
'--param-file[Load content of params from files instead of from command line arguments.]'
)
archive_options=(
'--asset-size-limit[Asset size limit in bytes]'
'--name[Name of this client, used by openQA to identify different clients via User-Agent header, defaults to "openqa-cli"]'
'--with-thumbnails[Download thumbnails as well]'
)
monitor_options=(
'--name[Name of this client, used by openQA to identify different clients via User-Agent header, defaults to "openqa-cli"]'
'--poll-interval[Specifies the poll interval in seconds]'
)
schedule_options=(
'--monitor[it until all jobs are done/cancelled and return non-zero exit code if at least on job has not passed/softfailed]'
'--name[Name of this client, used by openQA to identify different clients via User-Agent header, defaults to "openqa-cli"]'
'--poll-interval[Specifies the poll interval in seconds]'
)
# Complete with subcommands
if (( CURRENT == 2 )); then
_describe 'subcommand' subcommands
else
case "$words[2]" in
api)
_arguments '*:option:->options' $main_options $api_options
;;
archive)
_arguments '*:option:->options' $main_options $archive_options
;;
monitor)
_arguments '*:option:->options' $main_options $archive_options
;;
schedule)
_arguments '*:option:->options' $main_options $archive_options
;;
*)
_values 'subcommand' api archive monitor schedule
;;
esac
fi
}

# Register the completion function for openqa-cli
compdef _openqa_cli_completions openqa-cli

0 comments on commit 298cf29

Please sign in to comment.