#!/usr/bin/env bash # # qvm-reset - Wipe VM overlay and workspace registry # # This script resets the VM to a clean state by deleting the overlay.qcow2 # and workspaces.json files. This is useful when you want to start fresh # or if the VM state has become corrupted. # # IMPORTANT: This does NOT delete the base image (base.qcow2), so you won't # need to re-download or rebuild the NixOS image. # # Usage: qvm reset [-f|--force] # -f, --force Skip confirmation prompt # set -euo pipefail # Source common library readonly QVM_LIB_DIR="${QVM_LIB_DIR:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../lib" && pwd)}" source "${QVM_LIB_DIR}/common.sh" # Get path to qvm-stop script readonly QVM_BIN_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly QVM_STOP="${QVM_BIN_DIR}/qvm-stop" # # confirm_reset - Prompt user for confirmation # Returns: 0 if user confirms, exits script if user cancels # confirm_reset() { echo log_warn "This will delete:" if [[ -f "$QVM_OVERLAY" ]]; then echo " - $QVM_OVERLAY" fi if [[ -f "$QVM_WORKSPACES_FILE" ]]; then echo " - $QVM_WORKSPACES_FILE" fi if [[ ! -f "$QVM_OVERLAY" ]] && [[ ! -f "$QVM_WORKSPACES_FILE" ]]; then log_info "No files to delete (already clean)" exit 0 fi echo echo "The base image (base.qcow2) and cache directories will NOT be deleted." echo read -p "Continue with reset? [y/N] " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "Reset cancelled" exit 0 fi } # # main - Main reset orchestration # main() { local force=false # Parse arguments while [[ $# -gt 0 ]]; do case "$1" in -f|--force) force=true shift ;; *) die "Unknown option: $1" ;; esac done # Confirm unless --force is used if [[ "$force" != true ]]; then confirm_reset fi # Stop VM if running if is_vm_running; then log_info "VM is running, stopping it first..." "$QVM_STOP" fi # Delete overlay if it exists if [[ -f "$QVM_OVERLAY" ]]; then log_info "Deleting overlay: $QVM_OVERLAY" rm -f "$QVM_OVERLAY" else log_info "Overlay does not exist (nothing to delete)" fi # Delete workspaces registry if it exists if [[ -f "$QVM_WORKSPACES_FILE" ]]; then log_info "Deleting workspaces registry: $QVM_WORKSPACES_FILE" rm -f "$QVM_WORKSPACES_FILE" else log_info "Workspaces registry does not exist (nothing to delete)" fi # Print success message with next steps echo log_info "Reset complete!" echo echo "Next steps:" echo " - Run 'qvm start' to boot the VM with a fresh overlay" echo " - Your base image (base.qcow2) is still intact" echo " - Cache directories (cargo-home, pnpm-store, etc.) are preserved" echo } main "$@"