omarchy-cn-convert turns a package-based install into OmarchyCN in one curl-able run: registry key + [omarchycn] repo, --ask=4 swap onto the cn-built packages (Chinese menu/bindings and OMARCHY CN branding ride the settings tree), [omarchy] mirror line, zh_CN locale, fcitx5-rime seeding, CN Arch mirrors, and a plymouth rebrand, recording pre-state in /var/lib/omarchycn/convert-state. omarchy-cn-revert restores that state symmetrically and survives user-removed packages, self-deletion mid-swap, and cosmetic plymouth failures after the state is cleared. Checkout installs are refused toward the overlay. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019hLK3wsDuKVAC37GgDqg6H
108 lines
4.5 KiB
Bash
108 lines
4.5 KiB
Bash
#!/bin/bash
|
||
# omarchy:summary=Convert a vanilla package-based Omarchy install into OmarchyCN
|
||
# omarchy:examples=omarchy cn convert
|
||
# Curl-able bootstrap (like the overlay installer): everything before the
|
||
# package swap must run without the cn tree, so no $OMARCHY_PATH until then.
|
||
|
||
set -euo pipefail
|
||
|
||
GITEA=${GITEA:-https://git.zacharyzhang.com}
|
||
OWNER=${OWNER:-ZacharyZhang-NY}
|
||
REGISTRY="$GITEA/api/packages/$OWNER/arch"
|
||
REG_KEY_FPR=74DCF57ACD812B24D959F146BD386048867B33B4
|
||
STATE_DIR=/var/lib/omarchycn
|
||
STATE=$STATE_DIR/convert-state
|
||
# Bootstrap exception: curl|bash runs outside a session, so default the path
|
||
export OMARCHY_PATH=${OMARCHY_PATH:-/usr/share/omarchy}
|
||
|
||
main() {
|
||
command -v pacman > /dev/null || { echo "需要 Arch Linux(未找到 pacman)" >&2; exit 1; }
|
||
if (( EUID == 0 )); then
|
||
echo "请以普通用户运行(脚本内部按需 sudo)" >&2
|
||
exit 1
|
||
fi
|
||
|
||
local prev_omarchy prev_settings
|
||
prev_omarchy=$(pacman -Q omarchy 2> /dev/null || pacman -Q omarchy-dev 2> /dev/null || true)
|
||
prev_settings=$(pacman -Q omarchy-settings 2> /dev/null || pacman -Q omarchy-settings-dev 2> /dev/null || true)
|
||
if [[ -z $prev_omarchy || -z $prev_settings ]]; then
|
||
if [[ -d $HOME/.local/share/omarchy/.git ]]; then
|
||
echo "检测到 checkout 安装(非包安装):请改用 overlay(bin/omarchycn-install-overlay)" >&2
|
||
else
|
||
echo "未检测到 Omarchy 包安装(需要 omarchy 与 omarchy-settings)" >&2
|
||
fi
|
||
exit 1
|
||
fi
|
||
[[ -f $STATE ]] && echo "已转换过($STATE 在案):本次仅同步更新,不覆盖回退状态"
|
||
|
||
echo "==> 信任 OmarchyCN registry 公钥并配置 [omarchycn] 仓库"
|
||
local tmpkey
|
||
tmpkey=$(mktemp)
|
||
curl -fsSL "$REGISTRY/repository.key" -o "$tmpkey"
|
||
sudo pacman-key --add "$tmpkey"
|
||
sudo pacman-key --lsign-key "$REG_KEY_FPR"
|
||
rm -f "$tmpkey"
|
||
if ! grep -q '^\[omarchycn\]' /etc/pacman.conf; then
|
||
printf '\n[omarchycn]\nSigLevel = Required DatabaseOptional\nServer = %s/omarchycn/x86_64\n' \
|
||
"$REGISTRY" | sudo tee -a /etc/pacman.conf > /dev/null
|
||
fi
|
||
|
||
if [[ ! -f $STATE ]]; then
|
||
echo "==> 记录转换前状态(供 omarchy cn revert 还原)"
|
||
sudo mkdir -p "$STATE_DIR"
|
||
if [[ -f /etc/locale.conf ]]; then
|
||
sudo cp /etc/locale.conf "$STATE_DIR/locale.conf.pre"
|
||
fi
|
||
sudo cp /etc/pacman.d/mirrorlist "$STATE_DIR/mirrorlist.pre"
|
||
local p new_pkgs=""
|
||
for p in fcitx5-rime fcitx5-chinese-addons fcitx5-configtool omarchycn-keyring; do
|
||
pacman -Q "$p" > /dev/null 2>&1 || new_pkgs+="$p "
|
||
done
|
||
# Values are quoted because revert sources this file; publish atomically
|
||
{
|
||
echo "prev_omarchy=\"${prev_omarchy%% *}\""
|
||
echo "prev_settings=\"${prev_settings%% *}\""
|
||
echo "new_pkgs=\"${new_pkgs% }\""
|
||
echo "converted_at=\"$(date +%s)\""
|
||
} | sudo tee "$STATE.new" > /dev/null
|
||
sudo mv "$STATE.new" "$STATE"
|
||
fi
|
||
|
||
echo "==> 系统更新并换装 OmarchyCN 软件包(替换 ${prev_omarchy%% *}/${prev_settings%% *})"
|
||
sudo pacman -Syu --noconfirm
|
||
sudo pacman -S --noconfirm omarchycn/omarchycn-keyring
|
||
# --ask=4 auto-confirms removing the conflicting upstream omarchy packages
|
||
sudo pacman -S --noconfirm --ask=4 omarchycn/omarchy-dev omarchycn/omarchy-settings-dev
|
||
sudo pacman -S --needed --noconfirm fcitx5-rime fcitx5-chinese-addons fcitx5-configtool
|
||
|
||
echo "==> [omarchy] 仓库启用自建镜像(Cloudflare 上游兜底)"
|
||
source /usr/share/omarchy/cn/lib/mirror.sh
|
||
cn_mirror_omarchy_repo_fix
|
||
|
||
echo "==> 系统语言 zh_CN.UTF-8"
|
||
grep -q '^zh_CN.UTF-8 UTF-8' /etc/locale.gen ||
|
||
echo 'zh_CN.UTF-8 UTF-8' | sudo tee -a /etc/locale.gen > /dev/null
|
||
sudo locale-gen > /dev/null
|
||
if grep -q '^LANG=' /etc/locale.conf 2> /dev/null; then
|
||
sudo sed -i 's/^LANG=.*/LANG=zh_CN.UTF-8/' /etc/locale.conf
|
||
else
|
||
echo 'LANG=zh_CN.UTF-8' | sudo tee -a /etc/locale.conf > /dev/null
|
||
fi
|
||
|
||
echo "==> 中文输入法与字体(用户级)"
|
||
OMARCHY_PATH=/usr/share/omarchy bash /usr/share/omarchy/install/user/cn-chinese.sh
|
||
systemctl --user restart omarchy-fcitx5.service 2> /dev/null || true
|
||
|
||
echo "==> Arch 官方仓库切换国内镜像(自动测速,失败则保留现状)"
|
||
omarchy-cn-mirror-apply china || echo "国内镜像不可达,保留当前 mirrorlist"
|
||
|
||
echo "==> OMARCHY CN 开机画面"
|
||
omarchy-refresh-plymouth
|
||
|
||
omarchy-notification-send "OmarchyCN" "转换完成:重新登录后菜单/键位/输入法全中文" 2> /dev/null || true
|
||
echo
|
||
echo "转换完成(重新登录生效)。回退: omarchy cn revert"
|
||
}
|
||
|
||
main "$@"
|