From 706904524a193de9faa77bfee4ac66825ebcca8d Mon Sep 17 00:00:00 2001 From: Ricardo Aravena Date: Fri, 8 Jun 2018 10:37:28 -0700 Subject: [PATCH] subsystem: cli Add kata command line bash completion Fixes #110 Signed-off-by: Ricardo Aravena --- Makefile | 8 +- data/completions/bash/kata-runtime | 138 +++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 data/completions/bash/kata-runtime diff --git a/Makefile b/Makefile index 1fc6155a93..c92877d519 100644 --- a/Makefile +++ b/Makefile @@ -78,6 +78,9 @@ GENERATED_FILES += $(COLLECT_SCRIPT) SCRIPTS += $(COLLECT_SCRIPT) SCRIPTS_DIR := $(BINDIR) +BASH_COMPLETIONS := data/completions/bash/kata-runtime +BASH_COMPLETIONSDIR := $(SHAREDIR)/bash-completion/completions + PKGDATADIR := $(SHAREDIR)/$(PROJECT_DIR) PKGLIBDIR := $(LOCALSTATEDIR)/lib/$(PROJECT_DIR) PKGRUNDIR := $(LOCALSTATEDIR)/run/$(PROJECT_DIR) @@ -389,13 +392,16 @@ check-go-static: coverage: $(QUIET_TEST).ci/go-test.sh html-coverage -install: default runtime install-scripts +install: default runtime install-scripts install-completions $(QUIET_INST)install -D $(TARGET) $(DESTTARGET) $(QUIET_INST)install -D $(CONFIG) $(DESTCONFIG) install-scripts: $(SCRIPTS) $(foreach f,$(SCRIPTS),$(call INSTALL_EXEC,$f,$(SCRIPTS_DIR))) +install-completions: + $(QUIET_INST)install --mode 0644 -D $(BASH_COMPLETIONS) $(BASH_COMPLETIONSDIR) + clean: $(QUIET_CLEAN)rm -f $(TARGET) $(CONFIG) $(GENERATED_GO_FILES) $(GENERATED_FILES) $(COLLECT_SCRIPT) diff --git a/data/completions/bash/kata-runtime b/data/completions/bash/kata-runtime new file mode 100644 index 0000000000..c293483d60 --- /dev/null +++ b/data/completions/bash/kata-runtime @@ -0,0 +1,138 @@ +#!/bin/bash +# +# Copyright (c) 2018 Intel Corporation +# +# SPDX-License-Identifier: Apache-2.0 +# + +#--------------------------------------------------------------------- +# Description: Bash tab completion script. +#--------------------------------------------------------------------- + +_kataruntime='kata-runtime' + +# Return a list of sub-commands +_kata_get_subcmds() +{ + "$_kataruntime" --generate-bash-completion +} + +# Return a list of options for the specified sub-command +# +# Limitation: Note that this only supports long-options. +_kata_get_subcmd_options() +{ + local subcmd="$1" + + "$_kataruntime" "$subcmd" --help |\ + egrep -- "^ *--[^ ]*[ ][^ ]*" |\ + awk '{print $1}' |\ + tr -d \, |\ + sort +} + +# Return a list of global options +_kata_get_global_options() +{ + _kata_get_subcmd_options "" +} + +# Return name of subcmd already seen, or "" +_kata_subcmd_seen() +{ + local subcmds=$(_kata_get_subcmds) + local cmd + + for cmd in $subcmds; do + local word + for word in ${COMP_WORDS[@]}; do + [ "$cmd" = "$word" ] && echo "$cmd" + done + done + + echo "" +} + +# Return 0 if the specified sub-command requires the name of an +# *existing* container, else 1. +_kata_subcmd_needs_existing_container() +{ + local subcmd="$1" + local cmd + + for cmd in \ + 'kata-check' \ + 'kata-env' \ + 'create' \ + 'help' \ + 'list' \ + 'version'; do + [ "$cmd" = "$subcmd" ] && return 1 + done + + return 0 +} + +# Returns a list of container names +_kata_get_containers() +{ + # Commands that manipulate containers need root privileges. + # If the user isn't running as root, don't attempt to obtain a list + # as it will result in an error. + [ $(id -u) -eq 0 ] || return + + "$_kataruntime" list --quiet +} + +_kata_bash_autocomplete() { + COMPREPLY=() + + local opts opt + + local cur="${COMP_WORDS[COMP_CWORD]}" + + for opt in \ + '-h' '--help' 'help' \ + '-v' '--version' 'version'; + do + # No further completions possible for these commands + [ "$cur" = "$opt" ] && return 0 + done + + local subcmd_seen=$(_kata_subcmd_seen) + + if [ -n "$subcmd_seen" ]; then + _kata_subcmd_needs_existing_container "$subcmd_seen" + local container_cmd=$? + + if [ -n "$cur" ]; then + # Complete with local options and maybe container names + opts=$(_kata_get_subcmd_options "$subcmd_seen") + [ $container_cmd -eq 0 ] && opts="$opts $(_kata_get_containers)" + elif [[ "${cur}" == -* ]]; then + # Complete with local options + opts=$(_kata_get_subcmd_options "$subcmd_seen") + else + # Potentially complete with container names + [ $container_cmd -eq 0 ] && opts="$(_kata_get_containers)" + fi + else + if [ -n "$cur" ]; then + # Complete with global options and subcmds + opts="$opts $(_kata_get_global_options)" + opts="$opts $(_kata_get_subcmds)" + elif [[ "${cur}" == -* ]]; then + # Complete with global options + opts=$(_kata_get_global_options) + else + # Complete with subcmds + opts=$(_kata_get_subcmds) + fi + fi + + [ -n "$opts" ] && COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + + return 0 +} + +complete -F _kata_bash_autocomplete "$_kataruntime"