diff --git a/migrations/1785013000.sh b/migrations/1785013000.sh index b511f1a5..b6a07978 100644 --- a/migrations/1785013000.sh +++ b/migrations/1785013000.sh @@ -1,6 +1,7 @@ echo "Move zram tuning to a vendor drop-in" zram_conf="${OMARCHY_ZRAM_CONF:-/etc/systemd/zram-generator.conf}" +zram_dropin="${OMARCHY_ZRAM_DROPIN:-/usr/lib/systemd/zram-generator.conf.d/90-omarchy.conf}" # The tuning ships as /usr/lib/systemd/zram-generator.conf.d/90-omarchy.conf. # Drop-ins outrank the main config file, so a leftover /etc copy decides nothing @@ -8,6 +9,13 @@ zram_conf="${OMARCHY_ZRAM_CONF:-/etc/systemd/zram-generator.conf}" [[ -f $zram_conf ]] || exit 0 +# Only once the replacement is on disk. zram-generator makes no device at all +# when nothing configures one, so until the drop-in lands the /etc copy is the +# only thing standing between this machine and no zram swap. The update pipeline +# installs packages before it runs migrations, but a dev checkout carries +# migrations from a release the installed package does not have yet. +[[ -f $zram_dropin ]] || exit 0 + # Package-owned copies go away with their package on upgrade. pacman -Qo "$zram_conf" &>/dev/null && exit 0 diff --git a/test/shell.d/zram-migration-test.sh b/test/shell.d/zram-migration-test.sh index f4fca7d9..cf54c30f 100644 --- a/test/shell.d/zram-migration-test.sh +++ b/test/shell.d/zram-migration-test.sh @@ -26,11 +26,17 @@ STUB chmod +x "$stub_bin/pacman" "$stub_bin/sudo" +# The migration removes the /etc copy only once the drop-in that replaces it is +# installed. Point that at a fixture so the result does not depend on whether +# the machine running the tests happens to carry the real one. +dropin="$TMPDIR/90-omarchy.conf" +: >"$dropin" + # omarchy-migrate runs each migration with `bash -euo pipefail` and stops the # whole chain on a non-zero exit, so match that invocation exactly. run_migration() { local conf="$1" - PATH="$stub_bin:$PATH" OMARCHY_ZRAM_CONF="$conf" \ + PATH="$stub_bin:$PATH" OMARCHY_ZRAM_CONF="$conf" OMARCHY_ZRAM_DROPIN="$dropin" \ bash -euo pipefail "$migration" >/dev/null || fail "migration exits clean for $(basename "$conf")" } @@ -74,7 +80,7 @@ pass "migration keeps a locally edited config" # them. conf="$TMPDIR/owned.conf" printf '[zram0]\ncompression-algorithm = zstd\n' >"$conf" -PATH="$stub_bin:$PATH" PACMAN_OWNS=1 OMARCHY_ZRAM_CONF="$conf" \ +PATH="$stub_bin:$PATH" PACMAN_OWNS=1 OMARCHY_ZRAM_CONF="$conf" OMARCHY_ZRAM_DROPIN="$dropin" \ bash -euo pipefail "$migration" >/dev/null || fail "migration exits clean for a package-owned config" [[ -f $conf ]] || fail "migration keeps a package-owned config" @@ -85,3 +91,14 @@ conf="$TMPDIR/absent.conf" run_migration "$conf" run_migration "$conf" pass "migration no-ops when the config is already gone" + +# Without the drop-in installed, the /etc copy is the only thing configuring +# zram at all. Removing it would leave the machine with no zram device, so the +# migration has to leave it alone and stay clean doing it. +conf="$TMPDIR/no-dropin.conf" +printf '[zram0]\ncompression-algorithm = zstd\n' >"$conf" +PATH="$stub_bin:$PATH" OMARCHY_ZRAM_CONF="$conf" OMARCHY_ZRAM_DROPIN="$TMPDIR/absent-dropin.conf" \ + bash -euo pipefail "$migration" >/dev/null || + fail "migration exits clean when the drop-in is missing" +[[ -f $conf ]] || fail "migration keeps the config when the drop-in is missing" +pass "migration keeps the config until the drop-in is installed"