One-click convert between vanilla Omarchy and OmarchyCN
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
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
#!/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 "$@"
|
||||
Reference in New Issue
Block a user