From 298cf296f123f272902ba80277f69e231358e270 Mon Sep 17 00:00:00 2001 From: Ioannis Bonatakis Date: Mon, 18 Nov 2024 11:12:17 +0100 Subject: [PATCH] Add bash and zsh completion scripts for openqa-cli * 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 --- docs/UsersGuide.asciidoc | 8 ++++ openqa-cli-completion.bash | 37 ++++++++++++++++++ openqa-cli-completion.zsh | 78 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 openqa-cli-completion.bash create mode 100644 openqa-cli-completion.zsh diff --git a/docs/UsersGuide.asciidoc b/docs/UsersGuide.asciidoc index 0b41a2b4706..50389e19a22 100644 --- a/docs/UsersGuide.asciidoc +++ b/docs/UsersGuide.asciidoc @@ -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 <> section for further information about the client itself, how authentication works and how plain `curl` can be used. diff --git a/openqa-cli-completion.bash b/openqa-cli-completion.bash new file mode 100644 index 00000000000..9b3bc32619e --- /dev/null +++ b/openqa-cli-completion.bash @@ -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 diff --git a/openqa-cli-completion.zsh b/openqa-cli-completion.zsh new file mode 100644 index 00000000000..287d0185b13 --- /dev/null +++ b/openqa-cli-completion.zsh @@ -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