Files
davidandClaude Opus 5.5 9e4b78bb88 Use QEMU's standard VGA instead of virtio-vga
On Arch, -vga virtio needs qemu-hw-display-virtio-vga and also
qemu-hw-display-virtio-gpu, which that package doesn't depend on; with only
the first, QEMU segfaults at start without a message. The smoketest's VMs
are headless (or VNC), so -vga std, which qemu-base has, is enough. This
reverts 2207208's extra package and checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 20:13:13 -07:00

114 lines
3.1 KiB
Bash

#!/bin/bash
#
# Purpose : coredesktop-dev doctor: check this machine is set up to work on
# CoreDesktop. Read-only.
doctor_usage() {
cat << EOF
Usage: coredesktop-dev doctor
Checks the tools are installed, the working copy is set up, and the deployed
copy (~/.local/share/coredesktop) can still update. Exits 1 if anything needs
fixing.
EOF
}
PROBLEMS=0
ok() {
echo "ok $1"
}
problem() {
echo "PROBLEM $1"
shift
local line
for line in "$@"; do
echo " $line"
done
PROBLEMS=1
}
note() {
echo "note $1"
}
cmd_doctor() {
case "${1:-}" in
-h | --help) doctor_usage; return 0 ;;
"") ;;
*) doctor_usage >&2; return 1 ;;
esac
local tool missing=()
for tool in shellcheck bats tea qemu-system-x86_64 qemu-img xorriso; do
command -v "$tool" &> /dev/null || missing+=("$tool")
done
if (( ${#missing[@]} == 0 )); then
ok "shellcheck, bats, tea, QEMU and xorriso are installed"
else
problem "not installed: ${missing[*]}" "fix: bash $(sibling_dir)/update.sh"
fi
if [ -r /dev/kvm ] && [ -w /dev/kvm ]; then
ok "KVM is available for the smoketest's virtual machines"
else
problem "can't use /dev/kvm, so the smoketest can't run VMs" \
"fix: turn on virtualization (VT-x/AMD-V) in the firmware settings"
fi
load_config
if [ -z "$WORKING_COPY" ]; then
problem "no working copy is set" "fix: bash $(sibling_dir)/install.sh"
elif is_coredesktop_clone "$WORKING_COPY"; then
ok "working copy: $WORKING_COPY"
else
problem "the working copy, $WORKING_COPY, isn't a clone of CoreDesktop" \
"fix: bash $(sibling_dir)/install.sh"
fi
doctor_deployed
if [ -n "${COREDESKTOP_DEV_VIA_FLATPAK:-}" ] || in_flatpak; then
note "you ran this in a Flatpak, which has no pacman, systemctl or host /tmp;
coredesktop-dev runs itself on the host for you (flatpak-spawn --host)"
fi
if [ -n "$WORKING_COPY" ] && hook_is_ours "$(hook_path)"; then
ok "the pre-push hook is installed"
else
note "the pre-push hook isn't installed (coredesktop-dev hooks install)"
fi
return $PROBLEMS
}
doctor_deployed() {
if ! git -C "$COREDESKTOP" rev-parse --git-dir &> /dev/null; then
problem "CoreDesktop isn't installed in $COREDESKTOP"
return
fi
local changes
changes="$(git -C "$COREDESKTOP" status --porcelain --untracked-files=no)"
if [ -z "$changes" ]; then
ok "the deployed copy has no local changes"
else
problem "the deployed copy has local changes, so update can't pull:" \
"${changes//$'\n'/$'\n' }" \
"fix: coredesktop-dev deployed restore"
fi
if ! GIT_TERMINAL_PROMPT=0 timeout 30 git -C "$COREDESKTOP" fetch --quiet &> /dev/null; then
problem "couldn't reach the deployed copy's upstream to check it can update"
elif git -C "$COREDESKTOP" merge-base --is-ancestor HEAD '@{upstream}' 2> /dev/null; then
ok "the deployed copy can fast-forward to its upstream"
else
problem "the deployed copy has commits its upstream doesn't, so update's pull will fail" \
"see: git -C $COREDESKTOP log @{upstream}..HEAD"
fi
}
# hooks.sh has hook_path and hook_is_ours
source "$(dirname "${BASH_SOURCE[0]}")/hooks.sh"