qq2clone/qq2clone.completion

106 lines
3.4 KiB
Bash
Executable File

#!/bin/bash
#shellcheck disable=1090 disable=2012
[[ -e "${HOME:?}/.config/qq2clone" ]] || return 1
QQ2_DIR="$(<"${HOME}/.config/qq2clone")"
[[ "$QQ2_DIR" =~ ^[[:space:]]*([^[:space:]].*)$ ]] &&
QQ2_DIR="${BASH_REMATCH[1]}"
[[ "$QQ2_DIR" =~ ^(.*[^[:space:]])[[:space:]]*$ ]] &&
QQ2_DIR="${BASH_REMATCH[1]}"
[[ -e "${QQ2_DIR}/sqlite3" ]] || return 1
chmod +rw "${QQ2_DIR}/sqlite3" &>/dev/null || return 1
declare -a templates
declare line
while read -r line; do
templates=( "${templates[@]}" "$line" )
done < <("${QQ2_DIR}/sqlite3" --batch "${QQ2_DIR}/qq2clone.db" \
"select name from TEMPLATES")
_qq2clone ()
{
declare -a COMS FLAGS
COMS=( check clone config connect copy-template delete-template destroy \
edit exec import-template list list-templates modify-template restore \
resume rm rm-save save shred shred-save start suspend )
FLAGS=( connection no-spice use-spice help no-run quiet quieter run spicy \
storage template verbose virt-viewer )
local LAST_ARG THIS_ARG B4_LAST_ARG P set_coms
(( COMP_CWORD > 0 )) &&
LAST_ARG="${COMP_WORDS[$((COMP_CWORD - 1))]}"
(( COMP_CWORD > 1 )) &&
B4_LAST_ARG="${COMP_WORDS[$((COMP_CWORD - 2))]}"
THIS_ARG="${COMP_WORDS[$COMP_CWORD]}"
set_coms="connect|destroy|exec|resume|rm|rm\-save|save|shred|shred\-save|"
set_coms="${set_coms}start|suspend|restore"
declare -a suggestions
if [[ "$THIS_ARG" =~ ^\-\- ]]; then
suggestions=("${FLAGS[@]}")
P="--"
elif [[ "$LAST_ARG" =~ ^(\-|modify|delete|copy)\-template$ ]] ||
[[ "$LAST_ARG" == "template-snapshot" ]] ||
[[ "$LAST_ARG" == "-t" ]]; then
suggestions=( "${templates[@]}" )
elif [[ "$LAST_ARG" =~ ^(\-\-storage|\-s)$ ]]; then
read -ra suggestions < <(virsh pool-list --name | tr -d '\n')
elif [[ "$LAST_ARG" == "config" ]]; then
suggestions=( list edit info )
elif [[ "$LAST_ARG" =~ ^(${set_coms})$ ]]; then
suggestions=( all running saved off in-shutdown idle paused crashed )
suggestions=( "${suggestions[@]}" pmsuspended )
elif [[ "$LAST_ARG" == "list" ]] &&
[[ ! "$B4_LAST_ARG" == "config" ]]; then
suggestions=( all xml )
else
local curr_com word elem
for word in "${COMP_WORDS[@]}"; do
for elem in "${COMS[@]}"; do
[[ "$elem" == "$word" ]] && { curr_com="$word"; break 2; }
done
done
if [[ -n "$curr_com" ]]; then
if [[ "$curr_com" == "modify-template" ]] &&
[[ "${COMP_WORDS[$((COMP_CWORD - 2))]}" == "$curr_com" ]]; then
suggestions=( edit prepare-image commit-image discard-image \
destroy-image rename )
elif [[ "$curr_com" == config ]] &&
[[ "${COMP_WORDS[$((COMP_CWORD - 2))]}" == "$curr_com" ]] &&
[[ "$LAST_ARG" =~ ^(info|edit)$ ]]; then
local line
while read -r line; do
[[ "$line" =~ \
^[[:space:]]*([^[:space:]].*[^[:space:]])[[:space:]]*$ ]] &&
line="${BASH_REMATCH[1]}"
[[ "$line" =~ ^# ]] && continue
[[ "$line" =~ ^([^=]+).* ]] &&
suggestions=( "${suggestions[@]}" "${BASH_REMATCH[1]}" )
done <"${QQ2_DIR}/config"
suggestions=(NORUN QUIET USE_SPICE SPICY STORAGE S_TIMEOUT TEMPLATE \
TEMPLATE_DIR)
else
suggestions=( )
fi
else
suggestions=("${COMS[@]}")
fi
fi
local i
declare -a comp
for ((i=0;i<${#suggestions[@]};i++)); do
if [[ "${P}${suggestions["$i"]}" =~ ^"${THIS_ARG}" ]]; then
comp=( "${comp[@]}" "${suggestions["$i"]}" )
fi
done
(( ${#comp} > 0 )) &&
read -ra COMPREPLY < <(compgen -P "${P}" -W "${comp[*]}" | tr "\n" " ")
}
complete -F _qq2clone qq2clone