Files
EvoScientist/scripts/release.sh
T

78 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# scripts/release.sh — 发版脚本: bump 版本号 → 提交 → 打 tag → 推送
# 用法: ./scripts/release.sh patch|minor|major
set -euo pipefail
VERSION_FILE="EvoScientist/_version.py"
# ── 参数检查 ──
BUMP="${1:-}"
if [[ -z "$BUMP" ]]; then
cat <<USAGE
用法: ./scripts/release.sh patch|minor|major
示例:
./scripts/release.sh patch # 0.1.19 → 0.1.20 (bug 修复 / 小改动)
./scripts/release.sh minor # 0.1.19 → 0.2.0 (新功能, 向后兼容)
./scripts/release.sh major # 0.1.19 → 1.0.0 (破坏性改动)
发版前请先提交所有代码改动 (git status 应为空)。
USAGE
exit 1
fi
# ── 环境检查 ──
[[ -f "$VERSION_FILE" ]] || { echo "✗ 找不到 $VERSION_FILE"; exit 1; }
git rev-parse --is-inside-work-tree >/dev/null 2>&1 || { echo "✗ 不在 git 仓库内"; exit 1; }
BRANCH=$(git rev-parse --abbrev-ref HEAD)
[[ "$BRANCH" != "HEAD" ]] || { echo "✗ 处于 detached HEAD, 请先切到分支"; exit 1; }
# 工作区必须干净 —— 发版提交只应包含版本号改动, 不混入其他代码
if ! git diff --quiet || ! git diff --cached --quiet; then
echo "✗ 工作区有未提交改动, 请先提交:"
git status --short
echo
echo "提示: 先 git add + git commit 你的代码改动, 再运行本脚本。"
exit 1
fi
# ── 计算新版本号 ──
current=$(grep -oE '[0-9]+\.[0-9]+\.[0-9]+' "$VERSION_FILE" | head -1)
[[ -n "$current" ]] || { echo "✗ $VERSION_FILE 里找不到版本号"; exit 1; }
IFS='.' read -r major minor patch <<< "$current"
case "$BUMP" in
major) major=$((major+1)); minor=0; patch=0 ;;
minor) minor=$((minor+1)); patch=0 ;;
patch) patch=$((patch+1)) ;;
*) echo "✗ 无效参数: $BUMP (用 patch|minor|major)"; exit 1 ;;
esac
new="$major.$minor.$patch"
[[ "$current" != "$new" ]] || { echo "✗ 版本号没变 ($current)"; exit 1; }
echo "▶ $current → $new (分支: $BRANCH)"
# ── 改版本号 (兼容 macOS/Linux) ──
if [[ "$(uname)" == "Darwin" ]]; then
sed -i '' "s/__version__ = \"$current\"/__version__ = \"$new\"/" "$VERSION_FILE"
else
sed -i "s/__version__ = \"$current\"/__version__ = \"$new\"/" "$VERSION_FILE"
fi
grep -q "__version__ = \"$new\"" "$VERSION_FILE" || { echo "✗ 版本号替换失败, 检查 $VERSION_FILE 格式"; exit 1; }
# ── 提交 + 打 tag + 推送 ──
git add "$VERSION_FILE"
git commit -m "Bump version to $new" >/dev/null
git tag -a "v$new" -m "Release v$new"
git push origin "$BRANCH"
git push origin "v$new"
echo
echo "✓ 发布完成"
echo " 版本: $new"
echo " Tag: v$new"
echo " 分支: $BRANCH"
echo " 提交: $(git rev-parse --short HEAD)"