93 lines
3.8 KiB
Bash
Executable File
93 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 统一设置桌面端版本号(一个命令完成:写 PEP 440 版本 → 同步 Tauri semver)。
|
||
#
|
||
# 版本唯一来源:src/pineagents/__version__.py(PEP 440,如 0.0.1b1)。
|
||
# 本脚本:
|
||
# 1) 规范化版本号:接受 PEP 440(0.0.1b1)或 semver(0.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 # 预发布(beta,PEP 440 写法)
|
||
# ./scripts/version-bump.sh 0.0.1-beta.1 # 预发布(beta,semver 写法,自动转换)
|
||
# ./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 440(0.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\"]'"
|