The 2026-09-19 revision of this migration, and a symlink then shipped under config/, pointed every install's ~/.config/omarchy/plugins/omacom.elsewhen at /usr/share/omarchy/plugins/omacom.elsewhen. elsewhen 1.0.0-2 moved to shell/plugins, so the link dangles, the shell lists the plugin as enabled but never loads it, and the bar carries an empty slot. The migration kept any existing link, resolving or not, so a rerun could not repair it. A link into /usr/share/omarchy that no longer resolves is Omarchy's own and is re-pointed; a link the user made is still left alone.
123 lines
5.2 KiB
Bash
123 lines
5.2 KiB
Bash
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
|
require_command jq
|
|
|
|
test_dir=$(mktemp -d)
|
|
trap 'rm -rf "$test_dir"' EXIT
|
|
mkdir -p "$test_dir/bin" "$test_dir/home"
|
|
export CALL_LOG="$test_dir/calls"
|
|
|
|
cat >"$test_dir/bin/omarchy-pkg-add" <<'SH'
|
|
#!/bin/bash
|
|
printf 'package %s\n' "$*" >>"$CALL_LOG"
|
|
exit "${PACKAGE_STATUS:-0}"
|
|
SH
|
|
cat >"$test_dir/bin/omarchy-shell" <<'SH'
|
|
#!/bin/bash
|
|
printf '%s\n' "$*" >>"$CALL_LOG"
|
|
quiet=0
|
|
if [[ $1 == "-q" ]]; then
|
|
quiet=1
|
|
shift
|
|
fi
|
|
if [[ ${SHELL_ABSENT:-0} == 1 ]]; then
|
|
(( quiet )) && exit 0
|
|
echo "omarchy-shell is not running" >&2
|
|
exit 1
|
|
fi
|
|
[[ $2 != "rescanPlugins" ]] || exit 0
|
|
printf '%s\n' "${TEST_PUT_RESULT:-ok}"
|
|
SH
|
|
cat >"$test_dir/bin/omarchy-restart-shell" <<'SH'
|
|
#!/bin/bash
|
|
echo 'migration must leave the restart to omarchy update' >&2
|
|
exit 1
|
|
SH
|
|
chmod +x "$test_dir/bin/"*
|
|
|
|
mkdir -p "$test_dir/packaged/shell/plugins/omacom.elsewhen"
|
|
sed "s|/usr/share/omarchy|$test_dir/packaged|g" "$ROOT/migrations/1789581661.sh" >"$test_dir/migration.sh"
|
|
|
|
plugin="$test_dir/home/.config/omarchy/plugins/omacom.elsewhen"
|
|
run_migration() {
|
|
: >"$CALL_LOG"
|
|
HOME="$test_dir/home" OMARCHY_PATH="${1:-$test_dir/packaged}" PATH="$test_dir/bin:$ROOT/bin:$PATH" \
|
|
bash -euo pipefail "$test_dir/migration.sh" >"$test_dir/output" 2>&1
|
|
}
|
|
|
|
if PACKAGE_STATUS=1 run_migration; then
|
|
fail "package failure stops the migration"
|
|
fi
|
|
[[ ! -e $plugin && ! -L $plugin && $(cat "$CALL_LOG") == "package elsewhen" ]] ||
|
|
fail "package failure leaves the plugin and shell untouched"
|
|
pass "package failure stops before changing the shell"
|
|
|
|
run_migration
|
|
[[ ! -e $plugin && ! -L $plugin ]] || fail "migration does not create a user plugin link"
|
|
[[ ! -e $ROOT/config/omarchy/plugins/omacom.elsewhen && ! -L $ROOT/config/omarchy/plugins/omacom.elsewhen ]] || fail "fresh installs do not ship a user plugin link"
|
|
pass "migration and fresh installs rely on the packaged plugin directory"
|
|
|
|
expected=$'package elsewhen\n-q shell rescanPlugins\nshell putBarWidget omacom.elsewhen {"before":"omarchy.clock"}'
|
|
[[ $(cat "$CALL_LOG") == "$expected" ]] || fail "install, scan and placement run in order" "$(cat "$CALL_LOG")"
|
|
pass "real bar helper enables and places before the clock without restarting during reload"
|
|
|
|
run_migration
|
|
[[ $(cat "$CALL_LOG") == "$expected" ]] || fail "migration can be rerun"
|
|
[[ ! -e $plugin && ! -L $plugin ]] || fail "rerunning the migration does not create a user plugin link"
|
|
pass "migration can be rerun without a user plugin link"
|
|
|
|
run_migration "$ROOT"
|
|
[[ $(readlink "$plugin") == "$test_dir/packaged/shell/plugins/omacom.elsewhen" ]] || fail "dev checkout links the packaged plugin"
|
|
pass "dev checkout discovers Elsewhen through a user plugin link"
|
|
run_migration "$ROOT"
|
|
[[ $(readlink "$plugin") == "$test_dir/packaged/shell/plugins/omacom.elsewhen" ]] || fail "dev link survives a rerun"
|
|
pass "dev link is idempotent"
|
|
rm "$plugin"
|
|
|
|
mkdir -p "$plugin"
|
|
printf 'local work\n' >"$plugin/notes"
|
|
run_migration "$ROOT"
|
|
[[ ! -L $plugin && $(cat "$plugin/notes") == "local work" ]] || fail "existing checkout is preserved"
|
|
pass "existing checkout and local files are preserved"
|
|
|
|
rm "$plugin/notes"
|
|
rmdir "$plugin"
|
|
ln -s "$test_dir/custom-plugin" "$plugin"
|
|
run_migration "$ROOT"
|
|
[[ $(readlink "$plugin") == "$test_dir/custom-plugin" ]] || fail "existing symlink is preserved"
|
|
pass "existing symlink is preserved, including a missing target"
|
|
|
|
# An earlier revision, and a symlink once shipped under config/, pointed every
|
|
# install at the package's old path.
|
|
for tree in "$ROOT" "$test_dir/packaged"; do
|
|
ln -sfn "$test_dir/packaged/plugins/omacom.elsewhen" "$plugin"
|
|
run_migration "$tree"
|
|
[[ $(readlink "$plugin") == "$test_dir/packaged/shell/plugins/omacom.elsewhen" ]] ||
|
|
fail "a stranded link to the package's old path is re-pointed (OMARCHY_PATH=$tree)" "$(readlink "$plugin")"
|
|
done
|
|
pass "a stranded link to the package's old path is re-pointed on every install"
|
|
rm "$plugin"
|
|
|
|
if env TEST_PUT_RESULT=unknown HOME="$test_dir/home" OMARCHY_PATH="$ROOT" PATH="$test_dir/bin:$ROOT/bin:$PATH" \
|
|
bash -euo pipefail "$test_dir/migration.sh" >"$test_dir/output" 2>&1; then
|
|
fail "an unknown widget must leave the migration pending"
|
|
fi
|
|
pass "an unknown widget leaves the migration pending"
|
|
|
|
# An update with no shell to ask, from a TTY or with the shell down, still
|
|
# finishes: the package and link land, the placement is skipped, and the update
|
|
# restarts the shell afterwards.
|
|
rm "$plugin"
|
|
: >"$CALL_LOG"
|
|
if ! env SHELL_ABSENT=1 OMARCHY_SHELL_ABSENT_ATTEMPTS=1 HOME="$test_dir/home" OMARCHY_PATH="$ROOT" PATH="$test_dir/bin:$ROOT/bin:$PATH" \
|
|
bash -euo pipefail "$test_dir/migration.sh" >"$test_dir/output" 2>&1; then
|
|
fail "an absent shell must not fail the migration" "$(cat "$test_dir/output")"
|
|
fi
|
|
grep -q "omacom.elsewhen was not put on the bar" "$test_dir/output" || fail "an absent shell is reported" "$(cat "$test_dir/output")"
|
|
[[ $(readlink "$plugin") == "$test_dir/packaged/shell/plugins/omacom.elsewhen" ]] || fail "the package and plugin link land without a shell"
|
|
[[ $(cat "$CALL_LOG") == "$expected" ]] || fail "the rescan is best-effort and the put is still asked" "$(cat "$CALL_LOG")"
|
|
pass "an absent shell leaves the update running with the package and link in place"
|