forked from Gitlink/gitlink-cli
92 lines
4.0 KiB
Bash
92 lines
4.0 KiB
Bash
#!/bin/bash
|
||
# ================================================================
|
||
# Phase 3: 自动 Release Notes
|
||
# 功能:获取最新 tag → 分析 commit → 推荐版本号 → 生成 Release Notes
|
||
# 使用:bash 03-auto-release-notes.sh <owner> <repo>
|
||
# 环境变量:DRY_RUN=true|false (默认 true)
|
||
# ================================================================
|
||
set -e
|
||
|
||
OWNER=${1:?"Usage: $0 <owner> <repo>"}
|
||
REPO=${2}
|
||
DRY_RUN=${DRY_RUN:-true}
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
OUTPUT_DIR="$SCRIPT_DIR/_output"
|
||
mkdir -p "$OUTPUT_DIR"
|
||
|
||
echo "[========================================]"
|
||
echo "[ Phase 3: 自动 Release Notes ]"
|
||
echo "[ Target: $OWNER/$REPO ]"
|
||
echo "[ DRY_RUN: $DRY_RUN ]"
|
||
echo "[========================================]"
|
||
|
||
# ---- Step 1: 获取最新 Release ----
|
||
echo "[INFO] 获取最新 Release..."
|
||
RELEASE_DATA=$(gitlink-cli release +list --owner "$OWNER" --repo "$REPO" --format json 2>&1) || {
|
||
echo "[WARN] 获取 Release 列表失败: $RELEASE_DATA"
|
||
echo "[INFO] 使用默认基线 v0.0.0"
|
||
LAST_TAG="v0.0.0"
|
||
}
|
||
echo "$RELEASE_DATA" > "$OUTPUT_DIR/releases.json"
|
||
|
||
# 提取最新 tag
|
||
LAST_TAG=$(echo "$RELEASE_DATA" | node -e "
|
||
let s='';
|
||
process.stdin.on('data',d=>s+=d).on('end',()=>{
|
||
try {
|
||
const d=JSON.parse(s).data||[];
|
||
const items=Array.isArray(d)?d:(d.releases||d);
|
||
if(items.length>0) process.stdout.write(String(items[0].tag_name||'v0.0.0'));
|
||
else process.stdout.write('v0.0.0');
|
||
} catch(e) { process.stdout.write('v0.0.0'); }
|
||
});
|
||
" 2>/dev/null || echo "v0.0.0")
|
||
|
||
echo "[INFO] 最新 tag: $LAST_TAG"
|
||
|
||
# ---- Step 2: 获取提交历史 ----
|
||
echo "[INFO] 获取提交历史 (基线: $LAST_TAG)..."
|
||
# 尝试从 git 获取(需要在 repo 目录下)
|
||
if git rev-parse --git-dir > /dev/null 2>&1; then
|
||
echo "[INFO] 在 git 仓库中,尝试获取 tags..."
|
||
git fetch --tags 2>&1 | tail -3 || true
|
||
|
||
# 检查 tag 是否存在
|
||
if git rev-parse -q --verify "$LAST_TAG" > /dev/null 2>&1; then
|
||
echo "[INFO] 找到本地 tag: $LAST_TAG"
|
||
git log "$LAST_TAG"..HEAD --format="%H|%s|%an|%ad" --date=short > "$OUTPUT_DIR/commits-since-$LAST_TAG.log" 2>&1
|
||
git log "$LAST_TAG"..HEAD --stat --oneline > "$OUTPUT_DIR/stats-since-$LAST_TAG.log" 2>&1
|
||
echo "[INFO] 提交历史已保存"
|
||
else
|
||
echo "[WARN] 本地未找到 tag '$LAST_TAG',尝试从远程获取..."
|
||
# 尝试从 remote 获取指定 tag
|
||
git fetch origin tag "$LAST_TAG" 2>&1 | tail -3 || true
|
||
if git rev-parse -q --verify "$LAST_TAG" > /dev/null 2>&1; then
|
||
git log "$LAST_TAG"..HEAD --format="%H|%s|%an|%ad" --date=short > "$OUTPUT_DIR/commits-since-$LAST_TAG.log" 2>&1
|
||
git log "$LAST_TAG"..HEAD --stat --oneline > "$OUTPUT_DIR/stats-since-$LAST_TAG.log" 2>&1
|
||
else
|
||
echo "[WARN] 远程也无此 tag,获取全部提交历史"
|
||
git log --all --format="%H|%s|%an|%ad" --date=short -100 > "$OUTPUT_DIR/commits-since-$LAST_TAG.log" 2>&1
|
||
git log --all --oneline --stat -100 > "$OUTPUT_DIR/stats-since-$LAST_TAG.log" 2>&1
|
||
echo "[INFO] 已获取最近 100 条提交(未按 tag 过滤)"
|
||
fi
|
||
fi
|
||
else
|
||
echo "[WARN] 不在 git 仓库中,通过 CLI 获取提交历史..."
|
||
source "$SCRIPT_DIR/../../gitlink-shared/scripts/detect-cli.sh" 2>/dev/null || true
|
||
gitlink-cli commit +list --owner "$OWNER" --repo "$REPO" --limit 100 --format json > "$OUTPUT_DIR/commits-api.json" 2>&1 || {
|
||
echo "[ERROR] 通过 API 获取提交历史也失败"
|
||
echo "[INFO] Release Notes 生成跳过"
|
||
touch "$OUTPUT_DIR/commits-api.json"
|
||
}
|
||
fi
|
||
|
||
# ---- Step 3: 运行 Release 分析引擎 ----
|
||
echo "[INFO] 运行 Release Notes 分析引擎..."
|
||
node "$SCRIPT_DIR/release-analyze.js" "$OUTPUT_DIR" "$LAST_TAG"
|
||
|
||
echo ""
|
||
echo "[========================================]"
|
||
echo "[ Phase 3 完成 ]"
|
||
echo "[========================================]"
|