diff --git a/etc/limine-entry-tool.d/omarchy-defaults.conf b/etc/limine-entry-tool.d/omarchy-defaults.conf index 1703dab4..ec0fa96f 100644 --- a/etc/limine-entry-tool.d/omarchy-defaults.conf +++ b/etc/limine-entry-tool.d/omarchy-defaults.conf @@ -15,7 +15,8 @@ ENABLE_LIMINE_FALLBACK=yes # Find and add other bootloaders FIND_BOOTLOADERS=yes -BOOT_ORDER="linux-omarchy-*, *, *fallback, Snapshots" +# Keep T2 Macs on their specialized kernel; prefer linux-omarchy elsewhere. +BOOT_ORDER="linux-t2, linux-omarchy, linux-omarchy-*, *, *fallback, Snapshots" # Snapper is configured with NUMBER_LIMIT="5" (see default/snapper/root), but # limine-snapper-sync can see the newly created sixth snapshot before cleanup diff --git a/install/hardware/all.sh b/install/hardware/all.sh index df695c65..d40069b2 100644 --- a/install/hardware/all.sh +++ b/install/hardware/all.sh @@ -1,3 +1,5 @@ +run_logged "$OMARCHY_INSTALL/hardware/kernel.sh" + run_logged "$OMARCHY_INSTALL/hardware/asus-rog.sh" run_logged "$OMARCHY_INSTALL/hardware/framework16.sh" run_logged "$OMARCHY_INSTALL/hardware/dell-xps-touchpad-haptics.sh" @@ -14,21 +16,14 @@ run_logged "$OMARCHY_INSTALL/hardware/vulkan.sh" run_logged "$OMARCHY_INSTALL/hardware/intel/video-acceleration.sh" run_logged "$OMARCHY_INSTALL/hardware/intel/lpmd.sh" run_logged "$OMARCHY_INSTALL/hardware/intel/thermald.sh" -# Swap in the Panther Lake kernel before anything pulls DKMS modules in. -# intel-ipu7-camera drags in ipu7-drivers, vision-drivers and v4l2loopback, -# and building all three against the stock kernel only to rebuild them against -# the PTL kernel and tear the first set down again cost ~25s of the install. -run_logged "$OMARCHY_INSTALL/hardware/intel/ptl-kernel.sh" run_logged "$OMARCHY_INSTALL/hardware/intel/ipu7-camera.sh" run_logged "$OMARCHY_INSTALL/hardware/intel/fred.sh" run_logged "$OMARCHY_INSTALL/hardware/intel/fix-wifi7-eht.sh" run_logged "$OMARCHY_INSTALL/hardware/intel/sof-firmware.sh" -# Pulls in v4l2loopback-dkms, so it sits after the Panther Lake kernel swap. run_logged "$OMARCHY_INSTALL/hardware/fix-elgato-camlink-4k.sh" -# Rebuilds the boot image, so it has to follow the Panther Lake kernel swap -# above rather than sit with the other Dell leaf at the top of this file. +# Rebuilds the boot image, so it follows kernel and camera module setup. run_logged "$OMARCHY_INSTALL/hardware/dell-xps13-sidecar-amps.sh" run_logged "$OMARCHY_INSTALL/hardware/asus/fix-asus-ptl-display-backlight.sh" diff --git a/install/hardware/fix-elgato-camlink-4k.sh b/install/hardware/fix-elgato-camlink-4k.sh index eec9771f..274076ce 100644 --- a/install/hardware/fix-elgato-camlink-4k.sh +++ b/install/hardware/fix-elgato-camlink-4k.sh @@ -4,7 +4,7 @@ # v4l2-relayd re-exposes it at 1280x720 under the same name. if omarchy-hw-elgato-camlink-4k; then - mapfile -t kernel_headers < <(pacman -Qqs '^linux(-zen|-lts|-hardened|-t2|-ptl|-omarchy-bore|-omarchy-ptl-novrr-mm)?$' | sed 's/$/-headers/') + mapfile -t kernel_headers < <(pacman -Qqs '^linux(-zen|-lts|-hardened|-t2|-ptl|-omarchy(-bore|-ptl-novrr-mm)?)?$' | sed 's/$/-headers/') omarchy-pkg-add "${kernel_headers[@]}" v4l2loopback-dkms v4l2loopback-utils v4l2-relayd sudo install -Dm644 "$OMARCHY_PATH/default/udev/elgato-camlink-4k.rules" /etc/udev/rules.d/71-elgato-camlink-4k.rules diff --git a/install/hardware/intel/ptl-kernel.sh b/install/hardware/intel/ptl-kernel.sh deleted file mode 100644 index 12659a28..00000000 --- a/install/hardware/intel/ptl-kernel.sh +++ /dev/null @@ -1,26 +0,0 @@ -# Install Panther Lake kernel for Dell XPS Panther Lake systems -# The Omarchy PTL kernel includes Panther Lake display and memory fixes. - -if omarchy-hw-match "XPS" && omarchy-hw-intel-ptl; then - echo "Detected Dell XPS Panther Lake, installing PTL kernel..." - - # linux-ptl required SOF firmware; the new kernel only lists it as optional. - omarchy-pkg-add linux-omarchy-ptl-novrr-mm linux-omarchy-ptl-novrr-mm-headers sof-firmware - pacman -Rdd --noconfirm linux linux-headers || true - - # The PTL kernel doesn't provide=linux, so anything depending on linux drags the - # stock kernel back in and the boot menu grows a second, slower entry. - if pacman -Qq linux &>/dev/null; then - echo "WARNING: stock linux kernel still installed alongside the Omarchy PTL kernel:" - pacman -Qi linux | grep -i "required by" - fi - - mkdir -p /etc/limine-entry-tool.d - # Named to sort after omarchy-defaults.conf: drop-ins are read in order and - # the last BOOT_ORDER wins, so an earlier-sorting name is a silent no-op. - rm -f /etc/limine-entry-tool.d/dell-xps-panther-lake.conf - cat > /etc/limine-entry-tool.d/zz-dell-xps-panther-lake.conf <<'EOF' -# Prefer Omarchy kernels while keeping other kernels available for recovery -BOOT_ORDER="linux-omarchy-*, *, *fallback, Snapshots" -EOF -fi diff --git a/install/hardware/kernel.sh b/install/hardware/kernel.sh new file mode 100644 index 00000000..ed259c66 --- /dev/null +++ b/install/hardware/kernel.sh @@ -0,0 +1,9 @@ +# Install the default kernel before hardware setup pulls in DKMS modules. +# On a fresh T2 install linux-t2 is not installed yet, so also check the chip. +if [[ $(uname -m) == "x86_64" ]] && ! omarchy-pkg-present linux-t2; then + pci_devices=$(lspci -nn) + if ! grep "106b:180[12]" <<< "$pci_devices" >/dev/null; then + echo "Installing the Omarchy kernel..." + omarchy-pkg-add linux-omarchy linux-omarchy-headers + fi +fi diff --git a/install/hardware/nvidia.sh b/install/hardware/nvidia.sh index 81e1556e..48f62cd4 100644 --- a/install/hardware/nvidia.sh +++ b/install/hardware/nvidia.sh @@ -1,6 +1,6 @@ if lspci | grep -qi 'nvidia'; then # Check which kernel is installed and set appropriate headers package - KERNEL_PACKAGE=$(pacman -Qqs '^linux(-zen|-lts|-hardened|-t2|-ptl|-omarchy-ptl-novrr-mm)?$' | head -1 || true) + KERNEL_PACKAGE=$(pacman -Qqs '^linux(-zen|-lts|-hardened|-t2|-ptl|-omarchy(-bore|-ptl-novrr-mm)?)?$' | head -1 || true) [[ -n $KERNEL_PACKAGE ]] && omarchy-pkg-add "$KERNEL_PACKAGE-headers" if omarchy-hw-nvidia-gsp; then diff --git a/install/omarchy-other.packages b/install/omarchy-other.packages index 873e5048..1f325b24 100644 --- a/install/omarchy-other.packages +++ b/install/omarchy-other.packages @@ -23,8 +23,8 @@ limine-snapper-sync linux linux-firmware linux-headers -linux-omarchy-ptl-novrr-mm -linux-omarchy-ptl-novrr-mm-headers +linux-omarchy +linux-omarchy-headers macbook12-spi-driver-dkms nvidia-580xx-dkms nvidia-dkms diff --git a/migrations/1789095456.sh b/migrations/1789095456.sh deleted file mode 100644 index 574d3d9e..00000000 --- a/migrations/1789095456.sh +++ /dev/null @@ -1,45 +0,0 @@ -echo "Install the Omarchy Panther Lake kernel and prefer Omarchy kernels in Limine" - -omarchy-pkg-present linux-ptl || exit 0 - -limine_conf="${OMARCHY_PTL_LIMINE_CONF:-/etc/default/limine}" -limine_drop_ins="${OMARCHY_PTL_LIMINE_DROP_INS:-/etc/limine-entry-tool.d}" -rebuild_marker="${OMARCHY_PTL_REBUILD_MARKER:-/var/lib/omarchy/migrations/1789095456}" -kernel="linux-omarchy-ptl-novrr-mm" - -# Completion is machine-wide even though migrations run once per user. Leave -# the old kernel installed so it remains available if the new one cannot boot. -[[ ! -e $rebuild_marker ]] || exit 0 -omarchy-pkg-add "$kernel" "$kernel-headers" - -# /etc/default/limine and the Dell drop-ins were written by the installer. -# omarchy-settings ships omarchy-defaults.conf, but pacman's backup protection -# can leave its update in a .pacnew when other settings were customized. Repair -# only the old boot order in the active files, preserving custom orders and -# unrelated settings, including the root filesystem's kernel command line. -for conf in "$limine_conf" \ - "$limine_drop_ins/omarchy-defaults.conf" \ - "$limine_drop_ins/dell-xps-panther-lake.conf" \ - "$limine_drop_ins/zz-dell-xps-panther-lake.conf"; do - if [[ -f $conf ]]; then - sudo sed -i -E \ - 's/^([[:space:]]*BOOT_ORDER=)"(\*|linux-ptl\*), \*fallback, Snapshots"([[:space:]]*(#.*)?)$/\1"linux-omarchy-*, *, *fallback, Snapshots"\3/' \ - "$conf" - fi -done - -# Package hooks ran before the config repair. Rebuild the new kernel's image -# and boot entry explicitly, including on retries after a failed rebuild. -sudo limine-mkinitcpio "$kernel" - -# limine-mkinitcpio can return success after skipping a failed kernel build. -# Do not mark the migration complete unless the new kernel is in the menu. -if ! sudo limine-entry-tool --tree | grep -F "$kernel" >/dev/null; then - echo "The new Panther Lake kernel has no Limine boot entry; rerun omarchy-migrate after fixing the boot image build." >&2 - exit 1 -fi - -# Keeping the running kernel installed prevents the updater from detecting a -# kernel replacement, so request the reboot explicitly. -omarchy-state set reboot-required -sudo install -Dm644 /dev/null "$rebuild_marker" diff --git a/migrations/1789325478.sh b/migrations/1789325478.sh new file mode 100644 index 00000000..14ba7d98 --- /dev/null +++ b/migrations/1789325478.sh @@ -0,0 +1,44 @@ +echo "Install the Omarchy kernel and make it the first Limine boot entry" + +# linux-omarchy is an x86_64 kernel. T2 Macs must keep their specialized kernel, +# including when other kernels are installed or the running T2 package is gone. +[[ $(uname -m) == "x86_64" ]] || exit 0 +running_kernel=$(uname -r) +if omarchy-pkg-present linux-t2 || [[ ${running_kernel,,} == *-t2* ]]; then + exit 0 +fi + +limine_conf="${OMARCHY_KERNEL_LIMINE_CONF:-/etc/default/limine}" +rebuild_marker="${OMARCHY_KERNEL_REBUILD_MARKER:-/var/lib/omarchy/migrations/1789325478}" +kernel="linux-omarchy" + +# Completion is machine-wide even though migrations run once per user. Leave +# the old kernel installed so it remains available if the new one cannot boot. +# The new filename and marker also reach users who completed 1789095456. +[[ ! -e $rebuild_marker ]] || exit 0 +omarchy-pkg-add "$kernel" "$kernel-headers" + +# /etc/default/limine has priority over every drop-in, including old Dell +# settings and customized package files whose updates landed in a .pacnew. +# Set the exact kernel first: linux-omarchy-* only matches its older variants. +# Preserve unrelated settings, especially the root filesystem's kernel cmdline. +sudo mkdir -p "$(dirname "$limine_conf")" +sudo touch "$limine_conf" +sudo sed -i -E '/^[[:space:]]*BOOT_ORDER[[:space:]]*=/d' "$limine_conf" +printf '\n%s\n' 'BOOT_ORDER="linux-omarchy, linux-omarchy-*, *, *fallback, Snapshots"' | sudo tee -a "$limine_conf" >/dev/null + +# Package hooks ran before the config repair. Rebuild the new kernel's image +# and boot entry explicitly, including on retries after a failed rebuild. +sudo limine-mkinitcpio "$kernel" + +# limine-mkinitcpio can return success after skipping a failed kernel build. +# Do not mark the migration complete unless the new kernel is in the menu. +if ! sudo limine-entry-tool --tree | grep -E "(^|[^[:alnum:]_-])$kernel([^[:alnum:]_-]|$)" >/dev/null; then + echo "The Omarchy kernel has no Limine boot entry; rerun omarchy-migrate after fixing the boot image build." >&2 + exit 1 +fi + +# Keeping the running kernel installed prevents the updater from detecting a +# kernel replacement, so request the reboot explicitly. +omarchy-state set reboot-required +sudo install -Dm644 /dev/null "$rebuild_marker" diff --git a/test/shell.d/limine-defaults-test.sh b/test/shell.d/limine-defaults-test.sh index cf93ebdf..21adc94f 100644 --- a/test/shell.d/limine-defaults-test.sh +++ b/test/shell.d/limine-defaults-test.sh @@ -10,6 +10,6 @@ grep -Fq 'KERNEL_CMDLINE[default]+=" initramfs_async=0"' "$packaged_defaults" || fail "the packaged Limine defaults still unpack the initramfs synchronously" pass "packaged Limine defaults keep Plymouth alive at the LUKS prompt" -grep -Fxq 'BOOT_ORDER="linux-omarchy-*, *, *fallback, Snapshots"' "$packaged_defaults" || - fail "packaged Limine defaults prefer Omarchy kernels and retain recovery entries" -pass "packaged Limine defaults prefer Omarchy kernels and retain recovery entries" +grep -Fxq 'BOOT_ORDER="linux-t2, linux-omarchy, linux-omarchy-*, *, *fallback, Snapshots"' "$packaged_defaults" || + fail "packaged Limine defaults protect T2 Macs and prefer the exact Omarchy kernel elsewhere" +pass "packaged Limine defaults protect T2 Macs and prefer the exact Omarchy kernel elsewhere" diff --git a/test/shell.d/omarchy-kernel-install-test.sh b/test/shell.d/omarchy-kernel-install-test.sh new file mode 100644 index 00000000..cee20d9c --- /dev/null +++ b/test/shell.d/omarchy-kernel-install-test.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +set -euo pipefail + +source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh" + +leaf="$ROOT/install/hardware/kernel.sh" +scratch=$(mktemp -d) +trap 'rm -rf "$scratch"' EXIT +mkdir -p "$scratch/bin" +export PATH="$scratch/bin:$PATH" CALL_LOG="$scratch/calls" + +cat > "$scratch/bin/uname" <<'SH' +#!/bin/bash +[[ $* == "-m" ]] || exit 99 +printf '%s\n' "${TEST_ARCH:-x86_64}" +SH + +cat > "$scratch/bin/omarchy-pkg-present" <<'SH' +#!/bin/bash +[[ $* == "linux-t2" ]] || exit 99 +[[ ${T2_INSTALLED:-0} == "1" ]] +SH + +cat > "$scratch/bin/lspci" <<'SH' +#!/bin/bash +[[ $* == "-nn" ]] || exit 99 +[[ ${PCI_FAIL:-0} == "0" ]] || exit 1 +printf '%s\n' "${PCI_DEVICES:-00:02.0 VGA compatible controller: Intel [8086:1234]}" +SH + +cat > "$scratch/bin/omarchy-pkg-add" <<'SH' +#!/bin/bash +printf 'add %s\n' "$*" >> "$CALL_LOG" +[[ ${INSTALL_FAIL:-0} == "0" ]] +SH +chmod +x "$scratch/bin/"* + +run_leaf() { + : > "$CALL_LOG" + bash -euo pipefail "$leaf" > "$scratch/output" 2>&1 +} + +run_leaf +grep -Fxq 'add linux-omarchy linux-omarchy-headers' "$CALL_LOG" || fail "ordinary systems install the generic kernel and headers" +pass "ordinary x86_64 installs receive the Omarchy kernel without a Panther Lake hardware gate" + +T2_INSTALLED=1 run_leaf +[[ ! -s $CALL_LOG ]] || fail "an installed T2 kernel excludes the system" +pass "hardware setup skips systems with linux-t2 installed" + +for device in 1801 1802; do + PCI_DEVICES="04:00.0 Mass storage controller: Apple Inc. T2 [106b:$device]" run_leaf + [[ ! -s $CALL_LOG ]] || fail "fresh T2 hardware must not install the generic kernel" +done +pass "fresh T2 hardware is excluded before its specialized kernel has been installed" + +TEST_ARCH=aarch64 run_leaf +[[ ! -s $CALL_LOG ]] || fail "ARM hardware cannot install an x86_64 kernel" +pass "ARM hardware is excluded" + +if PCI_FAIL=1 run_leaf; then + fail "failed T2 hardware detection must stop kernel setup" +fi +[[ ! -s $CALL_LOG ]] || fail "unidentified hardware must not install the generic kernel" +pass "failed PCI detection prevents installing the generic kernel on unidentified hardware" + +if INSTALL_FAIL=1 run_leaf; then + fail "package installation failure must fail kernel setup" +fi +pass "kernel package installation failures stop hardware setup" + +kernel_line=$(grep -n 'hardware/kernel.sh' "$ROOT/install/hardware/all.sh" | cut -d: -f1) +for script in nvidia.sh intel/ipu7-camera.sh fix-elgato-camlink-4k.sh; do + driver_line=$(grep -n "hardware/$script" "$ROOT/install/hardware/all.sh" | cut -d: -f1) + (( kernel_line < driver_line )) || fail "the generic kernel is installed before $script pulls in DKMS drivers" +done +pass "kernel setup precedes NVIDIA, IPU7, and Cam Link DKMS setup" + +for package in linux-omarchy linux-omarchy-headers; do + grep -Fxq "$package" "$ROOT/install/omarchy-other.packages" || fail "the ISO includes $package" +done +! grep -q 'linux-omarchy-ptl-novrr-mm' "$ROOT/install/omarchy-other.packages" || fail "the ISO must not pull in the retired PTL variant" +pass "the ISO package list includes the generic kernel and headers" diff --git a/test/shell.d/omarchy-kernel-migration-test.sh b/test/shell.d/omarchy-kernel-migration-test.sh new file mode 100644 index 00000000..24e3480b --- /dev/null +++ b/test/shell.d/omarchy-kernel-migration-test.sh @@ -0,0 +1,248 @@ +#!/bin/bash + +set -euo pipefail + +source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh" + +migration="$ROOT/migrations/1789325478.sh" +scratch=$(mktemp -d) +trap 'rm -rf "$scratch"' EXIT +mkdir -p "$scratch/bin" "$scratch/drop-ins" + +export PATH="$scratch/bin:$ROOT/bin:$PATH" +export CALL_LOG="$scratch/calls" +export INSTALLED_PACKAGES="$scratch/packages" +export OMARCHY_KERNEL_LIMINE_CONF="$scratch/limine" +export OMARCHY_KERNEL_LIMINE_DROP_INS="$scratch/drop-ins" +export OMARCHY_KERNEL_REBUILD_MARKER="$scratch/state/1789325478" +kernel="linux-omarchy" +boot_order='BOOT_ORDER="linux-omarchy, linux-omarchy-*, *, *fallback, Snapshots"' + +# Exercise the real package helpers, including their post-install queries. +cat > "$scratch/bin/pacman" <<'SH' +#!/bin/bash +case "$1" in + -Q) grep -Fxq "$2" "$INSTALLED_PACKAGES" ;; + -S) + printf 'pacman %s\n' "$*" >> "$CALL_LOG" + [[ ${INSTALL_FAIL:-0} == "0" ]] || exit 1 + for arg in "$@"; do + [[ $arg == -* ]] || printf '%s\n' "$arg" >> "$INSTALLED_PACKAGES" + done + ;; + *) exit 99 ;; +esac +SH + +cat > "$scratch/bin/sudo" <<'SH' +#!/bin/bash +printf 'sudo %s\n' "$*" >> "$CALL_LOG" +case "$1" in + pacman | mkdir | touch | sed | tee | install | limine-mkinitcpio | limine-entry-tool) exec "$@" ;; + *) exit 99 ;; +esac +SH + +cat > "$scratch/bin/limine-mkinitcpio" <<'SH' +#!/bin/bash +[[ ${REBUILD_FAIL:-0} == "0" ]] +SH + +cat > "$scratch/bin/limine-entry-tool" <<'SH' +#!/bin/bash +[[ $* == "--tree" ]] || exit 99 +printf '%s\n' 'Omarchy' ' linux-ptl' ' linux-omarchy-ptl-novrr-mm' ' linux-omarchy-bore' ' linux-omarchy-fallback' ' Snapshots' +if [[ ${MISSING_ENTRY:-0} == "0" ]]; then + printf '%s\n' ' linux-omarchy' +fi +SH + +cat > "$scratch/bin/omarchy-state" <<'SH' +#!/bin/bash +[[ $* == "set reboot-required" ]] || exit 99 +printf 'state %s\n' "$*" >> "$CALL_LOG" +SH + +cat > "$scratch/bin/uname" <<'SH' +#!/bin/bash +case "$1" in + -m) printf '%s\n' "${TEST_ARCH:-x86_64}" ;; + -r) printf '%s\n' "${TEST_KERNEL_RELEASE:-7.2.5-arch1-1}" ;; + *) exit 99 ;; +esac +SH + +cat > "$scratch/bin/omarchy-notification-dismiss" <<'SH' +#!/bin/bash +exit 0 +SH +chmod +x "$scratch/bin/"* + +reset_fixture() { + : > "$CALL_LOG" + printf '%s\n' linux-ptl linux-ptl-headers > "$INSTALLED_PACKAGES" + rm -f "$OMARCHY_KERNEL_REBUILD_MARKER" "$OMARCHY_KERNEL_LIMINE_DROP_INS/"* + cat > "$OMARCHY_KERNEL_LIMINE_CONF" <<'CONF' +KERNEL_CMDLINE[default]="root=UUID=keep-me rw cryptdevice=UUID=keep-me:root" +BOOT_ORDER="*, *fallback, Snapshots" +ENABLE_UKI=yes +CONF + cp "$OMARCHY_KERNEL_LIMINE_CONF" "$scratch/original-limine" +} + +run_migration() { + bash -euo pipefail "$migration" > "$scratch/output" 2>&1 +} + +assert_preferred() { + grep -Fxq "$boot_order" "$1" || fail "Omarchy kernels are preferred in $1" +} + +assert_skipped() { + [[ ! -s $CALL_LOG ]] || fail "excluded systems do not change" "$(<"$CALL_LOG")" + cmp -s "$OMARCHY_KERNEL_LIMINE_CONF" "$scratch/original-limine" || fail "excluded systems keep their boot settings" + [[ ! -e $OMARCHY_KERNEL_REBUILD_MARKER ]] || fail "excluded systems do not get a completion marker" +} + +for old_kernel in linux linux-lts linux-zen linux-ptl linux-omarchy-ptl-novrr-mm; do + reset_fixture + printf '%s\n' "$old_kernel" "$old_kernel-headers" > "$INSTALLED_PACKAGES" + run_migration + grep -Fxq "$kernel" "$INSTALLED_PACKAGES" || fail "the generic kernel is installed" + grep -Fxq "$kernel-headers" "$INSTALLED_PACKAGES" || fail "its headers are installed" + grep -Fxq "$old_kernel" "$INSTALLED_PACKAGES" || fail "the previous kernel remains available" + assert_preferred "$OMARCHY_KERNEL_LIMINE_CONF" + pass "$old_kernel systems receive the generic Omarchy kernel and retain their recovery kernel" +done + +for installed in linux-t2 $'linux-t2\nlinux\nlinux-ptl\nlinux-omarchy'; do + reset_fixture + printf '%s\n' "$installed" > "$INSTALLED_PACKAGES" + run_migration + assert_skipped +done +pass "linux-t2 systems are skipped even with other kernels installed" + +reset_fixture +TEST_KERNEL_RELEASE=7.2.5-arch1-T2 run_migration +assert_skipped +pass "a running T2 kernel is excluded even if its package is no longer installed" + +reset_fixture +TEST_ARCH=aarch64 run_migration +assert_skipped +pass "ARM systems cannot receive an x86_64 kernel" + +reset_fixture +printf '%s\n' linux-omarchy-ptl-novrr-mm > "$INSTALLED_PACKAGES" +mkdir -p "$scratch/state" "$scratch/user-markers" "$scratch/omarchy/migrations" +export OMARCHY_PTL_REBUILD_MARKER="$scratch/state/1789095456" +export OMARCHY_MIGRATION_STATE="$scratch/user-markers" +touch "$OMARCHY_PTL_REBUILD_MARKER" "$OMARCHY_MIGRATION_STATE/1789095456.sh" +cp "$migration" "$scratch/omarchy/migrations/" +[[ ! -e $ROOT/migrations/1789095456.sh ]] || fail "the superseded migration must not install the PTL variant first" +pending=$(OMARCHY_PATH="$scratch/omarchy" "$ROOT/bin/omarchy-migrate" --pending) +[[ $pending == "1789325478.sh" ]] || fail "the renamed migration is pending after completing the old migration" +OMARCHY_PATH="$scratch/omarchy" "$ROOT/bin/omarchy-migrate" > "$scratch/output" 2>&1 +grep -Fxq "$kernel" "$INSTALLED_PACKAGES" || fail "the old completion markers cannot skip the generic kernel" +[[ -f $OMARCHY_KERNEL_REBUILD_MARKER && -f $OMARCHY_MIGRATION_STATE/1789325478.sh ]] || fail "new machine and user completion markers are recorded" +assert_preferred "$OMARCHY_KERNEL_LIMINE_CONF" +pass "users who completed the PTL migration run the renamed migration with fresh completion markers" + +reset_fixture +for name in dell-xps-panther-lake zz-dell-xps-panther-lake; do + printf '%s\n' 'BOOT_ORDER="linux-ptl*, *fallback, Snapshots"' > "$OMARCHY_KERNEL_LIMINE_DROP_INS/$name.conf" +done +cp "$OMARCHY_KERNEL_LIMINE_CONF" "$OMARCHY_KERNEL_LIMINE_DROP_INS/omarchy-defaults.conf" +run_migration +grep -Fxq "pacman -S --noconfirm --needed $kernel $kernel-headers" "$CALL_LOG" || fail "both new packages are installed" +grep -Fxq linux-ptl "$INSTALLED_PACKAGES" || fail "the old kernel is kept for recovery" +grep -Fxq linux-ptl-headers "$INSTALLED_PACKAGES" || fail "the old kernel headers are kept" +assert_preferred "$OMARCHY_KERNEL_LIMINE_CONF" +diff -u <(sed '/^BOOT_ORDER=/d; /^$/d' "$scratch/original-limine") \ + <(sed '/^BOOT_ORDER=/d; /^$/d' "$OMARCHY_KERNEL_LIMINE_CONF") || fail "kernel command line and unrelated settings are preserved" +grep -Fxq "sudo limine-mkinitcpio $kernel" "$CALL_LOG" || fail "the new kernel's boot image is rebuilt" +[[ -f $OMARCHY_KERNEL_REBUILD_MARKER ]] || fail "successful completion is recorded" +grep -Fxq 'state set reboot-required' "$CALL_LOG" || fail "the updater must offer a reboot when retaining the old kernel" +pass "new packages install, the central boot order is set, and the old kernel remains available" + +: > "$CALL_LOG" +run_migration +[[ ! -s $CALL_LOG ]] || fail "another user's run does not repeat the machine-wide migration" +pass "repeat runs are a no-op after successful completion" + +reset_fixture +printf '%s\n' "$kernel" >> "$INSTALLED_PACKAGES" +run_migration +grep -Fxq "$kernel-headers" "$INSTALLED_PACKAGES" || fail "missing headers install when the kernel is already present" +pass "a partially installed kernel gets its missing headers" + +reset_fixture +printf '%s\n' "$kernel" "$kernel-headers" >> "$INSTALLED_PACKAGES" +run_migration +! grep -q '^pacman -S' "$CALL_LOG" || fail "already installed packages are not reinstalled" +assert_preferred "$OMARCHY_KERNEL_LIMINE_CONF" +pass "existing new packages still receive the config repair and boot rebuild" + +reset_fixture +if INSTALL_FAIL=1 run_migration; then + fail "package installation failure must fail the migration" +fi +cmp -s "$OMARCHY_KERNEL_LIMINE_CONF" "$scratch/original-limine" || fail "install failure leaves the config untouched" +! grep -q 'limine-mkinitcpio' "$CALL_LOG" || fail "install failure does not rebuild" +[[ ! -e $OMARCHY_KERNEL_REBUILD_MARKER ]] || fail "install failure stays pending" +pass "package failures leave the old boot setup intact and the migration pending" + +reset_fixture +if REBUILD_FAIL=1 run_migration; then + fail "boot rebuild failure must fail the migration" +fi +[[ ! -e $OMARCHY_KERNEL_REBUILD_MARKER ]] || fail "rebuild failure stays pending" +! grep -q '^state ' "$CALL_LOG" || fail "rebuild failure must not request a reboot" +assert_preferred "$OMARCHY_KERNEL_LIMINE_CONF" +: > "$CALL_LOG" +run_migration +grep -Fxq "sudo limine-mkinitcpio $kernel" "$CALL_LOG" || fail "retry must rebuild even after config and packages are repaired" +[[ -f $OMARCHY_KERNEL_REBUILD_MARKER ]] || fail "retry records successful completion" +pass "a failed rebuild is retried even after config and package changes succeeded" + +reset_fixture +if MISSING_ENTRY=1 run_migration; then + fail "a silently skipped kernel build must fail the migration" +fi +[[ ! -e $OMARCHY_KERNEL_REBUILD_MARKER ]] || fail "a missing boot entry stays pending" +! grep -q '^state ' "$CALL_LOG" || fail "a missing boot entry must not request a reboot" +run_migration +[[ -f $OMARCHY_KERNEL_REBUILD_MARKER ]] || fail "a missing boot entry can be repaired on retry" +pass "older Omarchy variants and fallback entries cannot satisfy generic kernel verification" + +reset_fixture +cat >> "$OMARCHY_KERNEL_LIMINE_CONF" <<'CONF' +BOOT_ORDER="linux-omarchy-*, *, *fallback, Snapshots" + BOOT_ORDER = 'linux-lts, *, *fallback, Snapshots' +CONF +run_migration +assert_preferred "$OMARCHY_KERNEL_LIMINE_CONF" +[[ $(grep -c '^BOOT_ORDER=' "$OMARCHY_KERNEL_LIMINE_CONF") == "1" ]] || fail "only one boot order is written" +! grep -Eq '^[[:space:]]+BOOT_ORDER' "$OMARCHY_KERNEL_LIMINE_CONF" || fail "a later custom assignment cannot override first position" +pass "the exact generic kernel takes first position over previous PTL and custom orders" + +reset_fixture +for name in omarchy-defaults dell-xps-panther-lake zz-dell-xps-panther-lake; do + printf '%s\n' 'BOOT_ORDER="linux-ptl*, *fallback, Snapshots"' > "$OMARCHY_KERNEL_LIMINE_DROP_INS/$name.conf" +done +printf '%s\n' 'ENABLE_SORT=yes' >> "$OMARCHY_KERNEL_LIMINE_DROP_INS/omarchy-defaults.conf" +cp "$ROOT/etc/limine-entry-tool.d/omarchy-defaults.conf" "$OMARCHY_KERNEL_LIMINE_DROP_INS/omarchy-defaults.conf.pacnew" +run_migration +effective_order=$(bash -c 'declare -A KERNEL_CMDLINE; for conf in "$1/"*.conf "$2"; do source "$conf"; done; printf "%s" "$BOOT_ORDER"' -- "$OMARCHY_KERNEL_LIMINE_DROP_INS" "$OMARCHY_KERNEL_LIMINE_CONF") +[[ $effective_order == "linux-omarchy, linux-omarchy-*, *, *fallback, Snapshots" ]] || fail "the central config wins over old and customized drop-ins" +grep -Fxq 'ENABLE_SORT=yes' "$OMARCHY_KERNEL_LIMINE_DROP_INS/omarchy-defaults.conf" || fail "custom packaged settings survive" +cmp -s "$ROOT/etc/limine-entry-tool.d/omarchy-defaults.conf" \ + "$OMARCHY_KERNEL_LIMINE_DROP_INS/omarchy-defaults.conf.pacnew" || fail "the pacnew is left for the administrator to merge" +pass "the central boot order overrides legacy drop-ins and pacnew files without rewriting them" + +reset_fixture +rm "$OMARCHY_KERNEL_LIMINE_CONF" +run_migration +assert_preferred "$OMARCHY_KERNEL_LIMINE_CONF" +pass "a missing central config is created with the exact kernel first" diff --git a/test/shell.d/ptl-kernel-migration-test.sh b/test/shell.d/ptl-kernel-migration-test.sh deleted file mode 100644 index 874397c0..00000000 --- a/test/shell.d/ptl-kernel-migration-test.sh +++ /dev/null @@ -1,195 +0,0 @@ -#!/bin/bash - -set -euo pipefail - -source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh" - -migration="$ROOT/migrations/1789095456.sh" -scratch=$(mktemp -d) -trap 'rm -rf "$scratch"' EXIT -mkdir -p "$scratch/bin" "$scratch/drop-ins" - -export PATH="$scratch/bin:$ROOT/bin:$PATH" -export CALL_LOG="$scratch/calls" -export INSTALLED_PACKAGES="$scratch/packages" -export OMARCHY_PTL_LIMINE_CONF="$scratch/limine" -export OMARCHY_PTL_LIMINE_DROP_INS="$scratch/drop-ins" -export OMARCHY_PTL_REBUILD_MARKER="$scratch/state/completed" -kernel="linux-omarchy-ptl-novrr-mm" -boot_order='BOOT_ORDER="linux-omarchy-*, *, *fallback, Snapshots"' - -# Exercise the real package helpers, including their post-install queries. -cat > "$scratch/bin/pacman" <<'SH' -#!/bin/bash -case "$1" in - -Q) grep -Fxq "$2" "$INSTALLED_PACKAGES" ;; - -S) - printf 'pacman %s\n' "$*" >> "$CALL_LOG" - [[ ${INSTALL_FAIL:-0} == "0" ]] || exit 1 - for arg in "$@"; do - [[ $arg == -* ]] || printf '%s\n' "$arg" >> "$INSTALLED_PACKAGES" - done - ;; - *) exit 99 ;; -esac -SH - -cat > "$scratch/bin/sudo" <<'SH' -#!/bin/bash -printf 'sudo %s\n' "$*" >> "$CALL_LOG" -case "$1" in - pacman | sed | install | limine-mkinitcpio | limine-entry-tool) exec "$@" ;; - *) exit 99 ;; -esac -SH - -cat > "$scratch/bin/limine-mkinitcpio" <<'SH' -#!/bin/bash -[[ ${REBUILD_FAIL:-0} == "0" ]] -SH - -cat > "$scratch/bin/limine-entry-tool" <<'SH' -#!/bin/bash -[[ $* == "--tree" ]] || exit 99 -printf '%s\n' 'Omarchy' ' linux-ptl' ' Snapshots' -if [[ ${MISSING_ENTRY:-0} == "0" ]]; then - printf '%s\n' ' linux-omarchy-ptl-novrr-mm' -fi -SH - -cat > "$scratch/bin/omarchy-state" <<'SH' -#!/bin/bash -[[ $* == "set reboot-required" ]] || exit 99 -printf 'state %s\n' "$*" >> "$CALL_LOG" -SH -chmod +x "$scratch/bin/"* - -reset_fixture() { - : > "$CALL_LOG" - printf '%s\n' linux-ptl linux-ptl-headers > "$INSTALLED_PACKAGES" - rm -f "$OMARCHY_PTL_REBUILD_MARKER" "$OMARCHY_PTL_LIMINE_DROP_INS/"*.conf - cat > "$OMARCHY_PTL_LIMINE_CONF" <<'CONF' -KERNEL_CMDLINE[default]="root=UUID=keep-me rw cryptdevice=UUID=keep-me:root" -BOOT_ORDER="*, *fallback, Snapshots" -ENABLE_UKI=yes -CONF - cp "$OMARCHY_PTL_LIMINE_CONF" "$scratch/original-limine" -} - -run_migration() { - bash -euo pipefail "$migration" > "$scratch/output" 2>&1 -} - -assert_preferred() { - grep -Fxq "$boot_order" "$1" || fail "Omarchy kernels are preferred in $1" -} - -reset_fixture -printf '%s\n' linux > "$INSTALLED_PACKAGES" -run_migration -[[ ! -s $CALL_LOG ]] || fail "systems without linux-ptl do not change" -cmp -s "$OMARCHY_PTL_LIMINE_CONF" "$scratch/original-limine" || fail "unaffected Limine settings stay unchanged" -[[ ! -e $OMARCHY_PTL_REBUILD_MARKER ]] || fail "unaffected systems do not get a completion marker" -pass "systems without linux-ptl are skipped" - -reset_fixture -for name in dell-xps-panther-lake zz-dell-xps-panther-lake; do - printf '%s\n' 'BOOT_ORDER="linux-ptl*, *fallback, Snapshots"' > "$OMARCHY_PTL_LIMINE_DROP_INS/$name.conf" -done -cp "$OMARCHY_PTL_LIMINE_CONF" "$OMARCHY_PTL_LIMINE_DROP_INS/omarchy-defaults.conf" -run_migration -grep -Fxq "pacman -S --noconfirm --needed $kernel $kernel-headers" "$CALL_LOG" || fail "both new packages are installed" -grep -Fxq linux-ptl "$INSTALLED_PACKAGES" || fail "the old kernel is kept for recovery" -grep -Fxq linux-ptl-headers "$INSTALLED_PACKAGES" || fail "the old kernel headers are kept" -assert_preferred "$OMARCHY_PTL_LIMINE_CONF" -for conf in "$OMARCHY_PTL_LIMINE_DROP_INS/"*.conf; do - assert_preferred "$conf" -done -diff -u <(sed '/^BOOT_ORDER=/d' "$scratch/original-limine") \ - <(sed '/^BOOT_ORDER=/d' "$OMARCHY_PTL_LIMINE_CONF") || fail "kernel command line and unrelated settings are preserved" -grep -Fxq "sudo limine-mkinitcpio $kernel" "$CALL_LOG" || fail "the new kernel's boot image is rebuilt" -[[ -f $OMARCHY_PTL_REBUILD_MARKER ]] || fail "successful completion is recorded" -grep -Fxq 'state set reboot-required' "$CALL_LOG" || fail "the updater must offer a reboot when retaining the old kernel" -pass "new packages install, all stock boot orders are repaired, and the old kernel remains available" - -: > "$CALL_LOG" -run_migration -[[ ! -s $CALL_LOG ]] || fail "another user's run does not repeat the machine-wide migration" -pass "repeat runs are a no-op after successful completion" - -reset_fixture -printf '%s\n' "$kernel" >> "$INSTALLED_PACKAGES" -run_migration -grep -Fxq "$kernel-headers" "$INSTALLED_PACKAGES" || fail "missing headers install when the kernel is already present" -pass "a partially installed kernel gets its missing headers" - -reset_fixture -printf '%s\n' "$kernel" "$kernel-headers" >> "$INSTALLED_PACKAGES" -run_migration -! grep -q '^pacman -S' "$CALL_LOG" || fail "already installed packages are not reinstalled" -assert_preferred "$OMARCHY_PTL_LIMINE_CONF" -pass "existing new packages still receive the config repair and boot rebuild" - -reset_fixture -if INSTALL_FAIL=1 run_migration; then - fail "package installation failure must fail the migration" -fi -cmp -s "$OMARCHY_PTL_LIMINE_CONF" "$scratch/original-limine" || fail "install failure leaves the config untouched" -! grep -q 'limine-mkinitcpio' "$CALL_LOG" || fail "install failure does not rebuild" -[[ ! -e $OMARCHY_PTL_REBUILD_MARKER ]] || fail "install failure stays pending" -pass "package failures leave the old boot setup intact and the migration pending" - -reset_fixture -if REBUILD_FAIL=1 run_migration; then - fail "boot rebuild failure must fail the migration" -fi -[[ ! -e $OMARCHY_PTL_REBUILD_MARKER ]] || fail "rebuild failure stays pending" -! grep -q '^state ' "$CALL_LOG" || fail "rebuild failure must not request a reboot" -assert_preferred "$OMARCHY_PTL_LIMINE_CONF" -: > "$CALL_LOG" -run_migration -grep -Fxq "sudo limine-mkinitcpio $kernel" "$CALL_LOG" || fail "retry must rebuild even after config and packages are repaired" -[[ -f $OMARCHY_PTL_REBUILD_MARKER ]] || fail "retry records successful completion" -pass "a failed rebuild is retried even after config and package changes succeeded" - -reset_fixture -if MISSING_ENTRY=1 run_migration; then - fail "a silently skipped kernel build must fail the migration" -fi -[[ ! -e $OMARCHY_PTL_REBUILD_MARKER ]] || fail "a missing boot entry stays pending" -! grep -q '^state ' "$CALL_LOG" || fail "a missing boot entry must not request a reboot" -run_migration -[[ -f $OMARCHY_PTL_REBUILD_MARKER ]] || fail "a missing boot entry can be repaired on retry" -pass "a successful command without a new boot entry cannot complete the migration" - -reset_fixture -printf '%s\n' 'BOOT_ORDER="linux-lts, *, *fallback, Snapshots"' > "$OMARCHY_PTL_LIMINE_CONF" -cp "$OMARCHY_PTL_LIMINE_CONF" "$scratch/custom-limine" -run_migration -cmp -s "$OMARCHY_PTL_LIMINE_CONF" "$scratch/custom-limine" || fail "custom boot orders stay unchanged" -pass "administrator-defined boot orders are preserved" - -reset_fixture -cp "$OMARCHY_PTL_LIMINE_CONF" "$OMARCHY_PTL_LIMINE_DROP_INS/omarchy-defaults.conf" -printf '%s\n' 'ENABLE_SORT=yes' >> "$OMARCHY_PTL_LIMINE_DROP_INS/omarchy-defaults.conf" -cp "$ROOT/etc/limine-entry-tool.d/omarchy-defaults.conf" "$OMARCHY_PTL_LIMINE_DROP_INS/omarchy-defaults.conf.pacnew" -run_migration -assert_preferred "$OMARCHY_PTL_LIMINE_DROP_INS/omarchy-defaults.conf" -grep -Fxq 'ENABLE_SORT=yes' "$OMARCHY_PTL_LIMINE_DROP_INS/omarchy-defaults.conf" || fail "custom packaged settings survive the repair" -cmp -s "$ROOT/etc/limine-entry-tool.d/omarchy-defaults.conf" \ - "$OMARCHY_PTL_LIMINE_DROP_INS/omarchy-defaults.conf.pacnew" || fail "the pending pacnew is left for the administrator to merge" -pass "active packaged defaults are repaired when customized settings leave the update in a pacnew" - -reset_fixture -printf '%s\n' ' BOOT_ORDER="*, *fallback, Snapshots" # keep this comment' > "$OMARCHY_PTL_LIMINE_CONF" -run_migration -grep -Fxq " $boot_order # keep this comment" "$OMARCHY_PTL_LIMINE_CONF" || fail "stock orders with comments are repaired" -pass "indentation and comments survive the repair" - -reset_fixture -rm "$OMARCHY_PTL_LIMINE_CONF" -cp "$ROOT/etc/limine-entry-tool.d/omarchy-defaults.conf" "$OMARCHY_PTL_LIMINE_DROP_INS/omarchy-defaults.conf" -run_migration -[[ ! -e $OMARCHY_PTL_LIMINE_CONF ]] || fail "missing central config is not fabricated" -assert_preferred "$OMARCHY_PTL_LIMINE_DROP_INS/omarchy-defaults.conf" -pass "installs without a central config inherit the packaged boot order" diff --git a/test/shell.d/xps13-sidecar-amps-test.sh b/test/shell.d/xps13-sidecar-amps-test.sh index d82498f9..b7935fb2 100755 --- a/test/shell.d/xps13-sidecar-amps-test.sh +++ b/test/shell.d/xps13-sidecar-amps-test.sh @@ -13,13 +13,12 @@ grep -q 'run_logged .*hardware/dell-xps13-sidecar-amps.sh' "$all" || fail "the sidecar amplifier workaround runs during hardware setup" pass "the sidecar amplifier workaround runs during hardware setup" -# The apply step rebuilds the boot image, so it has to see the Panther Lake -# kernel that ptl-kernel.sh swaps in rather than the stock one it replaces. -ptl_line=$(grep -n 'hardware/intel/ptl-kernel.sh' "$all" | cut -d: -f1) +# The apply step rebuilds the boot image, so the default kernel must be installed. +kernel_line=$(grep -n 'hardware/kernel.sh' "$all" | cut -d: -f1) amps_line=$(grep -n 'hardware/dell-xps13-sidecar-amps.sh' "$all" | cut -d: -f1) -((ptl_line < amps_line)) || - fail "the sidecar amplifier workaround runs after the Panther Lake kernel swap" -pass "the sidecar amplifier workaround runs after the Panther Lake kernel swap" +((kernel_line < amps_line)) || + fail "the sidecar amplifier workaround runs after the default kernel is installed" +pass "the sidecar amplifier workaround runs after the default kernel is installed" [[ -n $migration ]] || fail "a migration enables the workaround on existing installs" pass "a migration enables the workaround on existing installs"