Files
agent-desktop/scripts/version-bump.sh
T

93 lines
3.8 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# 统一设置桌面端版本号(一个命令完成:写 PEP 440 版本 → 同步 Tauri semver)。
#
# 版本唯一来源:src/pineagents/__version__.pyPEP 440,如 0.0.1b1)。
# 本脚本:
# 1) 规范化版本号:接受 PEP 4400.0.1b1)或 semver0.0.1-beta.1)两种写法
# 2) 写入 src/pineagents/__version__.py
# 3) 运行 sync_tauri_version.mjs,生成 gitignored 的 console/src-tauri/tauri.version.conf.json
# Tauri 打包时通过 --config 读取,产出产物、更新 manifest 均以此版本为准)
#
# 用法:
# ./scripts/version-bump.sh 0.0.1b1 # 预发布(betaPEP 440 写法)
# ./scripts/version-bump.sh 0.0.1-beta.1 # 预发布(betasemver 写法,自动转换)
# ./scripts/version-bump.sh 0.0.1 # 正式版
# ./scripts/version-bump.sh 0.0.1-rc.1 # RC
# ./scripts/version-bump.sh 0.0.1.post1 # 构建号
#
# 支持格式(PEP 440 子集):
# N.N.N | N.N.N(a|b|rc)N | N.N.N.postN | N.N.N.devN(可组合,如 0.0.1b1.post2
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
VERSION_FILE="${REPO_ROOT}/src/pineagents/__version__.py"
SYNC_SCRIPT="${REPO_ROOT}/scripts/pack-tauri/sync_tauri_version.mjs"
NEW_VERSION="${1:-}"
if [[ -z "${NEW_VERSION}" ]]; then
echo "用法: $0 <version>" >&2
echo "示例: $0 0.0.1b1 → Tauri semver 0.0.1-beta.1" >&2
echo " $0 0.0.1-beta.1 → 同上(semver 写法自动转 PEP 440" >&2
echo " $0 0.0.1 → 正式版" >&2
exit 1
fi
# 版本号规范化:接受 PEP 4400.0.1b1 / 0.0.1rc1 / 0.0.1.post1 / 0.0.1.dev2
# 或 semver 预发布写法(0.0.1-beta.1 / 0.0.1-alpha.1 / 0.0.1-rc.1 / 0.0.1-dev.1),
# 统一转为 PEP 440 后写入 __version__.py(与 sync_tauri_version.mjs 的 toSemver 支持集合一致)。
NORM_VERSION=$(python3 - "${NEW_VERSION}" <<'PY'
import re, sys
v = sys.argv[1]
if re.match(r"^[0-9]+\.[0-9]+\.[0-9]+((a|b|rc)[0-9]+)?(\.post[0-9]+)?(\.dev[0-9]+)?$", v):
print(v)
sys.exit(0)
m = re.match(r"^([0-9]+\.[0-9]+\.[0-9]+)-(alpha|beta|rc|dev)\.([0-9]+)$", v)
if m:
base, label, num = m.groups()
mapping = {"alpha": "a", "beta": "b", "rc": "rc", "dev": "dev"}
print(f"{base}{mapping[label]}{num}" if label != "dev" else f"{base}.dev{num}")
sys.exit(0)
print(f"版本号不合法: {v}", file=sys.stderr)
sys.exit(1)
PY
) || exit 1
echo "== 设置版本号 =="
echo " PEP 440 : ${NORM_VERSION} (输入: ${NEW_VERSION})"
# 1) 写入 __version__.py(保留文件头注释,仅替换 __version__ 行)
if ! grep -q '^__version__[[:space:]]*=' "${VERSION_FILE}"; then
echo "ERROR: ${VERSION_FILE} 缺少 __version__ 行" >&2
exit 1
fi
sed -i.bak "s/^__version__[[:space:]]*=.*/__version__ = \"${NORM_VERSION}\"/" "${VERSION_FILE}"
rm -f "${VERSION_FILE}.bak"
echo " 已写入 ${VERSION_FILE}"
# 2) 同步 Tauri semver(写入 gitignored 的 tauri.version.conf.json
if [[ ! -f "${SYNC_SCRIPT}" ]]; then
echo "ERROR: 未找到 ${SYNC_SCRIPT}" >&2
exit 1
fi
node "${SYNC_SCRIPT}"
# 3) 回显最终结果
SEMVER=$(python3 - <<PY
import re
v = "${NORM_VERSION}"
m = re.match(r"^(\d+)\.(\d+)\.(\d+)(?:(a|b|rc)(\d+))?(?:\.post(\d+))?(?:\.dev(\d+))?$", v)
major, minor, patch, pre, pre_n, post, dev = m.groups()
labels = []
if pre:
labels.append({"a": "alpha", "b": "beta", "rc": "rc"}[pre] + "." + pre_n)
if dev:
labels.append("dev." + dev)
suffix = "-" + ".".join(labels) if labels else ""
post_meta = "+post." + post if post else ""
print(f"{major}.{minor}.{patch}{suffix}{post_meta}")
PY
)
echo " Tauri : ${SEMVER}"
echo "== 完成。打包时 Tauri 自动使用版本 ${SEMVER} =="
echo " 更新源 endpoint(如需覆盖): export TAURI_UPDATER_ENDPOINTS='[\"https://opc.pinesound.cn/desktop-updates/latest.json\"]'"