#!/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