The region value is cn, the China files live under default/regions/cn/, and omarchy-apply-pacman renders pacman for every caller: the .cn twins of the channel servers first, then .org, USTC and ArchLinuxCN. Switching to China installs and trusts the ArchLinuxCN keyring. A migration renames china to cn and repoints the drop-in links.
92 lines
5.9 KiB
Bash
Executable File
92 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -euo pipefail
|
|
|
|
source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh"
|
|
|
|
test_tmp=$(mktemp -d)
|
|
trap 'rm -rf "$test_tmp"' EXIT
|
|
|
|
root="$test_tmp/root" sandbox="$test_tmp/omarchy" calls="$test_tmp/calls"
|
|
mkdir -p "$root/etc/pacman.d" "$sandbox/bin" "$sandbox/install/config" "$sandbox/default/regions" "$test_tmp/bin" "$test_tmp/home"
|
|
cp -r "$ROOT/default/regions/cn" "$sandbox/default/regions/"
|
|
rewrite() { sed -e "s|/etc/|$root/etc/|g" -e "s| /\\.cargo/| $root/.cargo/|g" "$1" >"$2"; chmod +x "$2"; }
|
|
rewrite "$ROOT/install/config/region.sh" "$sandbox/install/config/region.sh"
|
|
rewrite "$ROOT/bin/omarchy-region" "$sandbox/bin/omarchy-region"
|
|
|
|
for command in omarchy-update-pacman omarchy-refresh-pacman locale-gen rime-ice-installer omarchy-setup-claude-api systemctl omarchy-system-logout pacman-key; do
|
|
printf '#!/bin/bash\necho "%s $*" >>"%s"\n' "$command" "$calls" >"$test_tmp/bin/$command"
|
|
done
|
|
printf '#!/bin/bash\necho "omarchy-pkg-add $*" >>"%s"\n[[ -z ${STUB_PKG_FAIL:-} ]]\n' "$calls" >"$test_tmp/bin/omarchy-pkg-add"
|
|
printf '#!/bin/bash\necho "${STUB_CHANNEL:-stable}"\n' >"$test_tmp/bin/omarchy-version-channel"
|
|
printf '#!/bin/bash\n[[ $1 == env ]] && shift\nexec env "$@"\n' >"$test_tmp/bin/sudo"
|
|
printf '#!/bin/bash\necho "gum $*" >>"%s"\nexit "${GUM_ANSWER:-1}"\n' "$calls" >"$test_tmp/bin/gum"
|
|
chmod +x "$test_tmp/bin"/*
|
|
export PATH="$test_tmp/bin:$sandbox/bin:$PATH" OMARCHY_PATH="$sandbox" HOME="$test_tmp/home"
|
|
|
|
printf '#zh_CN.UTF-8 UTF-8\nen_US.UTF-8 UTF-8\n' >"$root/etc/locale.gen"
|
|
printf 'LANG=en_US.UTF-8\n' >"$root/etc/locale.conf"
|
|
|
|
omarchy-region cn >/dev/null
|
|
[[ $(omarchy-region) == "China" && $(<"$root/etc/omarchy/region") == "cn" && $(<"$root/etc/locale.conf") == "LANG=zh_CN.UTF-8" ]] ||
|
|
fail "switching to China records cn and sets the language"
|
|
[[ $(<"$calls") == $'omarchy-update-pacman -Syu --noconfirm\nomarchy-pkg-add fcitx5-configtool fcitx5-rime librime opencc rime-ice-installer\nlocale-gen \nomarchy-refresh-pacman stable\nomarchy-pkg-add archlinuxcn-keyring\npacman-key --populate archlinuxcn\nsystemctl --user try-restart omarchy-fcitx5.service\nrime-ice-installer --yes' ]] ||
|
|
fail "China installs Rime against current packages, refreshes pacman into the cn profile, then trusts ArchLinuxCN and sets Rime Ice up" "$(<"$calls")"
|
|
pass "switching to China installs Rime, renders the cn profile on the current channel and trusts ArchLinuxCN"
|
|
|
|
: >"$calls"
|
|
mkdir -p "$HOME/.local/share/fcitx5/rime" && touch "$HOME/.local/share/fcitx5/rime/rime_ice.schema.yaml"
|
|
STUB_CHANNEL=edge omarchy-region cn >/dev/null
|
|
grep -qx 'omarchy-refresh-pacman edge' "$calls" || fail "the refresh keeps the machine's channel" "$(<"$calls")"
|
|
grep -q '^rime-ice-installer\|^systemctl' "$calls" && fail "an existing Rime Ice setup is not redone"
|
|
pass "switching to China again keeps the channel and redoes no Rime Ice setup"
|
|
|
|
: >"$calls"
|
|
omarchy-region global >/dev/null
|
|
[[ $(omarchy-region) == "Global" && ! -e $root/etc/omarchy/region && $(<"$root/etc/locale.conf") == "LANG=en_US.UTF-8" ]] ||
|
|
fail "switching to Global removes the region and restores English"
|
|
[[ $(<"$calls") == $'omarchy-refresh-pacman stable\nomarchy-setup-claude-api --remove' ]] ||
|
|
fail "Global refreshes pacman back to the channel defaults and removes the Claude API setup" "$(<"$calls")"
|
|
[[ -f $HOME/.local/share/fcitx5/rime/rime_ice.schema.yaml ]] || fail "Global keeps the input method"
|
|
pass "switching to Global restores the channel's pacman defaults and English, keeps Rime, removes the Claude API setup"
|
|
|
|
if output=$(omarchy-region mars 2>&1); then
|
|
fail "an unknown region is refused" "$output"
|
|
fi
|
|
if output=$(STUB_CHANNEL="stable / edge" omarchy-region cn 2>&1); then
|
|
fail "a mixed channel is refused" "$output"
|
|
fi
|
|
[[ $(omarchy-region) == "Global" ]] || fail "a refused switch changes nothing"
|
|
pass "an unknown region or an unclear channel is refused"
|
|
|
|
: >"$calls"
|
|
if output=$(STUB_PKG_FAIL=1 omarchy-region cn 2>&1); then
|
|
fail "switching to China fails when its packages do not install" "$output"
|
|
fi
|
|
[[ $(omarchy-region) == "Global" ]] && ! grep -q '^omarchy-refresh-pacman' "$calls" ||
|
|
fail "a failed switch to China leaves the region Global and pacman untouched" "$(<"$calls")"
|
|
pass "a failed switch to China leaves the machine Global"
|
|
|
|
grep -q '^gum' "$calls" && fail "a switch without a terminal asks nothing" "$(<"$calls")"
|
|
: >"$calls"
|
|
output=$(GUM_ANSWER=1 script -qec "omarchy-region cn" /dev/null)
|
|
grep -qxF 'gum confirm --affirmative 立即注销 --negative 稍后 立即注销,切换到中文界面和国内镜像?' "$calls" ||
|
|
fail "switching to China offers to log out, in Chinese" "$(<"$calls")"
|
|
[[ $output == *"区域已设为中国。重新登录后切换到中文界面和国内镜像。"* ]] && ! grep -q '^omarchy-system-logout' "$calls" ||
|
|
fail "declining the logout leaves a reminder and the session" "$output"
|
|
: >"$calls"
|
|
GUM_ANSWER=0 script -qec "omarchy-region global" /dev/null >/dev/null
|
|
grep -qxF 'gum confirm --affirmative Log out now --negative Later Log out now to switch to English and the global mirrors?' "$calls" &&
|
|
grep -qx 'omarchy-system-logout ' "$calls" || fail "switching to Global offers to log out in English and logs out on yes" "$(<"$calls")"
|
|
pass "a switch in a terminal offers to log out in the new region's language"
|
|
|
|
rc_migration="$test_tmp/1788112314.sh"
|
|
rewrite "$ROOT/migrations/1788112314.sh" "$rc_migration"
|
|
cp "$ROOT/default/pacman/mirrorlist-rc" "$root/etc/pacman.d/mirrorlist"
|
|
sed -e 's|pkgs.omarchy.org/rc/|pkgs.omarchy.org/edge/|' "$ROOT/default/pacman/pacman-rc.conf" |
|
|
sed -f "$ROOT/default/regions/cn/pacman/servers.sed" >"$root/etc/pacman.conf"
|
|
bash -e "$rc_migration" >/dev/null
|
|
[[ $(grep '^Server' "$root/etc/pacman.conf") == $'Server = https://pkgs.omarchy.cn/rc/$arch\nServer = https://pkgs.omarchy.org/rc/$arch' ]] ||
|
|
fail "the rc repository migration moves the .cn twin with its .org server" "$(grep '^Server' "$root/etc/pacman.conf")"
|
|
pass "the rc repository migration moves the .cn twin with its .org server"
|