zram-generator creates no device at all when nothing configures one, so the /etc copy is the only thing holding up swap until the vendor drop-in lands. Removing it early costs a machine its zram entirely, not just its tuning. The update pipeline installs packages before it runs migrations, so a packaged machine always has the drop-in by then. A dev checkout does not: omarchy-update-dev pulls migrations from a release the installed package has never seen, and no ordering of the pipeline can produce a file that has not been built yet. Checking for the drop-in is what makes the removal safe rather than well sequenced. The tests pinned the drop-in path to a fixture as well. Left at the real path they would pass or fail on whether the machine running them happened to carry the packaged copy. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
105 lines
4.0 KiB
Bash
105 lines
4.0 KiB
Bash
#!/bin/bash
|
|
|
|
source "$(dirname "${BASH_SOURCE[0]}")/base-test.sh"
|
|
|
|
migration=$(grep -rl 'Move zram tuning to a vendor drop-in' "$ROOT/migrations" | head -n 1 || true)
|
|
[[ -n $migration ]] || fail "zram drop-in migration exists"
|
|
|
|
TMPDIR=$(mktemp -d)
|
|
trap 'rm -rf "$TMPDIR"' EXIT
|
|
|
|
# The migration shells out to pacman (ownership check) and sudo (removal).
|
|
# Stub both so the test never touches the real system, and let each case pick
|
|
# what `pacman -Qo` reports through PACMAN_OWNS.
|
|
stub_bin="$TMPDIR/bin"
|
|
mkdir -p "$stub_bin"
|
|
|
|
cat >"$stub_bin/pacman" <<'STUB'
|
|
#!/bin/bash
|
|
[[ ${PACMAN_OWNS:-0} == 1 ]]
|
|
STUB
|
|
|
|
cat >"$stub_bin/sudo" <<'STUB'
|
|
#!/bin/bash
|
|
exec "$@"
|
|
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" OMARCHY_ZRAM_DROPIN="$dropin" \
|
|
bash -euo pipefail "$migration" >/dev/null ||
|
|
fail "migration exits clean for $(basename "$conf")"
|
|
}
|
|
|
|
# archinstall's own output: a [zram0] section with nothing but the algorithm.
|
|
conf="$TMPDIR/archinstall.conf"
|
|
printf '[zram0]\ncompression-algorithm = zstd\n' >"$conf"
|
|
run_migration "$conf"
|
|
[[ -f $conf ]] && fail "migration removes archinstall's generated config"
|
|
pass "migration removes archinstall's generated config"
|
|
|
|
# Same shape, different algorithm, plus comments and blank lines.
|
|
conf="$TMPDIR/commented.conf"
|
|
printf '# written by archinstall\n\n[zram0]\ncompression-algorithm = lz4\n\n' >"$conf"
|
|
run_migration "$conf"
|
|
[[ -f $conf ]] && fail "migration ignores comments and a non-zstd algorithm"
|
|
pass "migration ignores comments and a non-zstd algorithm"
|
|
|
|
# A config that sets nothing decides nothing, and must not take the migration
|
|
# chain down with it.
|
|
conf="$TMPDIR/comments-only.conf"
|
|
printf '# nothing to see here\n\n' >"$conf"
|
|
run_migration "$conf"
|
|
[[ -f $conf ]] && fail "migration removes a config that sets nothing"
|
|
pass "migration removes a config that sets nothing"
|
|
|
|
conf="$TMPDIR/empty.conf"
|
|
: >"$conf"
|
|
run_migration "$conf"
|
|
[[ -f $conf ]] && fail "migration removes an empty config"
|
|
pass "migration removes an empty config"
|
|
|
|
# A local override must survive.
|
|
conf="$TMPDIR/local.conf"
|
|
printf '[zram0]\ncompression-algorithm = zstd\nzram-size = ram / 4\n' >"$conf"
|
|
run_migration "$conf"
|
|
[[ -f $conf ]] || fail "migration keeps a locally edited config"
|
|
pass "migration keeps a locally edited config"
|
|
|
|
# Package-owned copies go away with their package; the migration must not touch
|
|
# them.
|
|
conf="$TMPDIR/owned.conf"
|
|
printf '[zram0]\ncompression-algorithm = zstd\n' >"$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"
|
|
pass "migration keeps a package-owned config"
|
|
|
|
# Nothing to do, and running twice must stay clean.
|
|
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"
|