Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add bash and zsh completion scripts for openqa-cli #6063

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,17 @@ install-generic:
ln -s ../postgresql.service "$(DESTDIR)"/usr/lib/systemd/system/openqa-scheduler.service.requires/postgresql.service
install -d -m 755 "$(DESTDIR)"/usr/lib/systemd/system/openqa-websockets.service.requires
ln -s ../postgresql.service "$(DESTDIR)"/usr/lib/systemd/system/openqa-websockets.service.requires/postgresql.service
install -D -m 644 contrib/completions/openqa-cli-completion.bash "$(DESTDIR)"/usr/share//bash-completion/completions/openqa-cli
install -D -m 644 contrib/completions/openqa-cli-completion.zsh "$(DESTDIR)"/usr/share/zsh/site-functions/_openqa-cli
if [ "$(SHELL)" = "/bin/bash" ] || [ "$(SHELL)" = "/usr/bin/bash" ]; then \
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't add anything to a user's bashrc/zshrc by default when doing make install.
And if they have bash-completion installed, it shouldn't be necessary anyway. Same for zsh.

echo "source $(DESTDIR)/usr/share/bash-completion/completions/openqa-cli" >> "$(HOME)/.bashrc"; \
elif [ "$(SHELL)" = "/bin/zsh" ] || [ "$(SHELL)" = "/usr/bin/zsh" ]; then \
echo "fpath+=($(DESTDIR)/usr/share/zsh/site-functions)" >> "$(HOME)/.zshrc"; \
echo "autoload -Uz compinit && compinit" >> "$(HOME)/.zshrc"; \
else \
echo "Unsupported shell: $(SHELL). Skipping completion setup."; \
fi

#
# install openQA apparmor profile
install -d -m 755 "$(DESTDIR)"/etc/apparmor.d
Expand Down
35 changes: 35 additions & 0 deletions contrib/completions/openqa-cli-completion.bash
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
_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 contrib/completions/openqa-cli-completion.zsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#compdef openqa-cli

_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 $monitor_options
;;
schedule)
_arguments '*:option:->options' $main_options $schedule_options
;;
*)
_values 'subcommand' api archive monitor schedule
;;
esac
fi
}

# Register the completion function for openqa-cli
compdef _openqa_cli_completions openqa-cli
23 changes: 23 additions & 0 deletions dist/rpm/openQA.spec
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,20 @@ Use this package to install munin scripts that allow to monitor some openQA
statistics.
%endif

%package client-bash-completion
Summary: Bash Completion for %{name}
Requires: bash-completion
Supplements: (%{name}-client and bash)

%description client-bash-completion
The official bash completion script for openqa-cli.

%package client-zsh-completion
Summary: Zsh Completion for %{name}
Supplements: (%{name}-client and zsh)

%description client-zsh-completion
The official zsh completion script for openqa-cli.

%prep
%setup -q
Expand Down Expand Up @@ -408,6 +422,10 @@ install -m 644 contrib/munin/config/minion.config %{buildroot}/%{_sysconfdir}/mu
install -m 755 contrib/munin/utils/munin-mail %{buildroot}/%{_datadir}/openqa/script/munin-mail
%endif

# completion
install -Dm 0644 contrib/completions/openqa-cli-completion.bash %{buildroot}%{_datadir}/bash-completion/completions/openqa-cli
install -Dm 0644 contrib/completions/openqa-cli-completion.zsh %{buildroot}%{_datadir}/zsh/site-functions/_openqa-cli

cd %{buildroot}
grep -rl %{_bindir}/env . | while read file; do
sed -e 's,%{_bindir}/env perl,%{_bindir}/perl,' -i $file
Expand Down Expand Up @@ -673,6 +691,11 @@ fi
%files devel
%endif

%files client-bash-completion
%{_datadir}/bash-completion/completions/openqa-cli
%files client-zsh-completion
%{_datadir}/zsh/site-functions/_openqa-cli

%files common
%dir %{_datadir}/openqa
%{_datadir}/openqa/lib
Expand Down
7 changes: 7 additions & 0 deletions docs/UsersGuide.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -963,6 +963,13 @@ 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` with openSUSE/SLE.
We distribute two packages `openQA-client-bash-completion` and
`openQA-client-zsh-completion` as part of openQA-client. In case the installed
system differs or source repo is used, you may still have auto-completion via
`make install`, which will install and source the completion script for one of
the above shells.

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
Loading