Improve update and migration flow
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
source "$(dirname "$0")/base-test.sh"
|
||||
|
||||
test_tmp=$(mktemp -d)
|
||||
trap 'rm -rf "$test_tmp"' EXIT
|
||||
|
||||
stub_bin="$test_tmp/bin"
|
||||
test_home="$test_tmp/home"
|
||||
runtime_dir="$test_tmp/runtime"
|
||||
mkdir -p "$stub_bin" "$test_home" "$runtime_dir"
|
||||
|
||||
run_with_lock_env() {
|
||||
HOME="$test_home" \
|
||||
XDG_RUNTIME_DIR="$runtime_dir" \
|
||||
XDG_STATE_HOME="$test_tmp/state" \
|
||||
PATH="$stub_bin:$ROOT/bin:$PATH" \
|
||||
"$@"
|
||||
}
|
||||
|
||||
write_stub() {
|
||||
local name="$1"
|
||||
local body="$2"
|
||||
|
||||
cat >"$stub_bin/$name" <<SH
|
||||
#!/bin/bash
|
||||
$body
|
||||
SH
|
||||
chmod +x "$stub_bin/$name"
|
||||
}
|
||||
|
||||
for command in \
|
||||
omarchy-toggle-idle \
|
||||
systemd-inhibit \
|
||||
omarchy-update-keyring \
|
||||
omarchy-update-system-pkgs \
|
||||
omarchy-migrate \
|
||||
omarchy-update-aur-pkgs \
|
||||
omarchy-update-mise \
|
||||
omarchy-update-orphan-pkgs \
|
||||
omarchy-hook \
|
||||
omarchy-update-analyze-logs \
|
||||
omarchy-shell \
|
||||
omarchy-update-restart; do
|
||||
write_stub "$command" 'exit 0'
|
||||
done
|
||||
write_stub omarchy-update-available 'exit 1'
|
||||
|
||||
# omarchy-update should hold the lock before snapshotting, so a second update
|
||||
# cannot even enter its pre-update snapshot.
|
||||
update_snapshot_marker="$test_tmp/update-snapshot-started"
|
||||
write_stub omarchy-snapshot 'echo started >"$TEST_MARKER"; sleep 2; exit 0'
|
||||
|
||||
OMARCHY_UPDATE_LOGGED=1 TEST_MARKER="$update_snapshot_marker" run_with_lock_env "$ROOT/bin/omarchy-update" -y >"$test_tmp/update-first.out" 2>&1 &
|
||||
update_pid=$!
|
||||
|
||||
for _ in {1..50}; do
|
||||
[[ -f $update_snapshot_marker ]] && break
|
||||
sleep 0.05
|
||||
done
|
||||
[[ -f $update_snapshot_marker ]] || fail "first omarchy-update reached snapshot under lock"
|
||||
|
||||
set +e
|
||||
OMARCHY_UPDATE_LOGGED=1 TEST_MARKER="$test_tmp/update-second-snapshot-started" run_with_lock_env "$ROOT/bin/omarchy-update" -y >"$test_tmp/update-second.out" 2>&1
|
||||
update_second_status=$?
|
||||
set -e
|
||||
|
||||
wait "$update_pid"
|
||||
|
||||
[[ $update_second_status -ne 0 ]] || fail "second omarchy-update exits non-zero while update lock is held"
|
||||
grep -q "already running" "$test_tmp/update-second.out" || fail "second omarchy-update reports held update lock"
|
||||
[[ ! -f $test_tmp/update-second-snapshot-started ]] || fail "second omarchy-update did not snapshot while lock was held"
|
||||
pass "omarchy-update prevents overlapping top-level updates"
|
||||
|
||||
# omarchy-update-perform is now only a compatibility wrapper around
|
||||
# omarchy-update -y, but it should still respect the same update lock.
|
||||
perform_marker="$test_tmp/perform-started"
|
||||
write_stub omarchy-update-keyring 'echo started >"$TEST_MARKER"; sleep 2; exit 0'
|
||||
|
||||
TEST_MARKER="$perform_marker" run_with_lock_env "$ROOT/bin/omarchy-update-perform" >"$test_tmp/perform-first.out" 2>&1 &
|
||||
perform_pid=$!
|
||||
|
||||
for _ in {1..50}; do
|
||||
[[ -f $perform_marker ]] && break
|
||||
sleep 0.05
|
||||
done
|
||||
[[ -f $perform_marker ]] || fail "first omarchy-update-perform delegated to update under lock"
|
||||
|
||||
set +e
|
||||
TEST_MARKER="$test_tmp/perform-second-started" run_with_lock_env "$ROOT/bin/omarchy-update-perform" >"$test_tmp/perform-second.out" 2>&1
|
||||
perform_second_status=$?
|
||||
set -e
|
||||
|
||||
wait "$perform_pid"
|
||||
|
||||
[[ $perform_second_status -ne 0 ]] || fail "second omarchy-update-perform exits non-zero while update lock is held"
|
||||
grep -q "already running" "$test_tmp/perform-second.out" || fail "second omarchy-update-perform reports held update lock"
|
||||
[[ ! -f $test_tmp/perform-second-started ]] || fail "second omarchy-update-perform did not snapshot while lock was held"
|
||||
pass "omarchy-update-perform compatibility wrapper respects update lock"
|
||||
Reference in New Issue
Block a user