mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 14:15:28 +00:00
cf66ee8ddc
The current setup uses a single script that is symlinked twice and that tries to configure bash completion for both virsh and virt-admin, even if only one of them is installed. This also forces us to have a -bash-completion RPM package that only contains the tiny shared file. Rework bash completion support so that two scripts are generated, each one tailored to a specific command. Since the shared script no longer exists after this change, the corresponding RPM package becomes empty. Signed-off-by: Andrea Bolognani <abologna@redhat.com> Reviewed-by: Neal Gompa <ngompa13@gmail.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
68 lines
2.0 KiB
Bash
68 lines
2.0 KiB
Bash
#
|
|
# @command@ completion support
|
|
#
|
|
|
|
_@command@_complete()
|
|
{
|
|
local words cword c=0 i=0 cur RO URI CMDLINE INPUT A
|
|
|
|
# Here, $COMP_WORDS is an array of words on the bash
|
|
# command line that user wants to complete. However, when
|
|
# parsing command line, the default set of word breaks is
|
|
# applied. This doesn't work for us as it mangles libvirt
|
|
# arguments, e.g. connection URI (with the default set it's
|
|
# split into multiple items within the array). Fortunately,
|
|
# there's a fixup function for the array.
|
|
_get_comp_words_by_ref -n "\"'><=;|&(:" -w words -i cword
|
|
COMP_WORDS=( "${words[@]}" )
|
|
COMP_CWORD=${cword}
|
|
cur=${COMP_WORDS[$COMP_CWORD]}
|
|
|
|
# See what URI is user trying to connect to and if they are
|
|
# connecting RO. Honour that.
|
|
while [ $c -le $COMP_CWORD ]; do
|
|
word="${COMP_WORDS[c]}"
|
|
case "$word" in
|
|
-r|--readonly) RO=1 ;;
|
|
-c|--connect) c=$((++c)); URI=${COMP_WORDS[c]} ;;
|
|
*) if [ $c -ne 0 ] && [ $i -eq 0 ]; then i=$c; break; fi ;;
|
|
esac
|
|
c=$((++c))
|
|
done
|
|
|
|
CMDLINE=( )
|
|
if [ -n "${RO}" ]; then
|
|
CMDLINE+=("-r")
|
|
fi
|
|
if [ -n "${URI}" ]; then
|
|
CMDLINE+=("-c" "${URI}")
|
|
fi
|
|
|
|
INPUT=( "${COMP_WORDS[@]:$i:$COMP_CWORD}" )
|
|
INPUT[-1]=${INPUT[-1]//\\:/:}
|
|
|
|
# Uncomment these lines for easy debug.
|
|
# echo;
|
|
# echo "RO=${flag_ro}";
|
|
# echo "URI=${URI}";
|
|
# echo "CMDLINE=${CMDLINE}";
|
|
# echo "INPUT[${#INPUT[@]}]=**${INPUT[@]}**";
|
|
# echo "cur=${cur}";
|
|
# echo;
|
|
# return 0;
|
|
|
|
# Small shortcut here. According to manpage:
|
|
# When the function is executed, the first argument ($1) is
|
|
# the name of the command whose arguments are being
|
|
# completed.
|
|
# Therefore, we might just run $1.
|
|
IFS=$'\n' A=($($1 ${CMDLINE[@]} complete -- "${INPUT[@]}" 2>/dev/null))
|
|
|
|
COMPREPLY=($(compgen -W "${A[*]%--}" -- ${cur}))
|
|
__ltrim_colon_completions "$cur"
|
|
return 0
|
|
} &&
|
|
complete -o default -o filenames -F _@command@_complete @command@
|
|
|
|
# vim: ft=sh:et:ts=4:sw=4:tw=80
|