forked from Gitlink/gitlink-cli
109 lines
4.3 KiB
Bash
109 lines
4.3 KiB
Bash
#!/bin/bash
|
||
# ================================================================
|
||
# Phase 3: 创建初始 Issue 和里程碑
|
||
# 功能:创建 v0.1.0 里程碑 → 起始标签 → 3 个初始 Issue
|
||
# 使用:bash 03-create-issues-milestones.sh <owner> <repo>
|
||
# 环境变量:DRY_RUN=true|false (默认 true)
|
||
# ================================================================
|
||
set -e
|
||
|
||
# 自动检测并使用本地编译的 gitlink-cli
|
||
source "$(cd "$(dirname "$0")" && pwd)/../../gitlink-shared/scripts/detect-cli.sh"
|
||
|
||
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"
|
||
|
||
# 里程碑 due-date = 今天 +30 天
|
||
DUE_DATE=$(date -d "+30 days" '+%Y-%m-%d' 2>/dev/null || date -v+30d '+%Y-%m-%d' 2>/dev/null || echo "2030-12-31")
|
||
|
||
echo "[========================================]"
|
||
echo "[ Phase 3: 创建 Issue 和里程碑 ]"
|
||
echo "[ Target: $OWNER/$REPO ]"
|
||
echo "[ DRY_RUN: $DRY_RUN ]"
|
||
echo "[========================================]"
|
||
|
||
# ---- Step 1: 创建里程碑 ----
|
||
MILESTONE_ID=""
|
||
if [ "$DRY_RUN" = "true" ]; then
|
||
echo "[DRY-RUN] 将执行: milestone +create -t v0.1.0 --due-date $DUE_DATE"
|
||
MILESTONE_ID="<pending>"
|
||
else
|
||
echo "[INFO] 创建里程碑 v0.1.0..."
|
||
MS=$(gitlink-cli milestone +create -t "v0.1.0" \
|
||
-d "首个里程碑:完成核心功能与文档" --due-date "$DUE_DATE" \
|
||
--owner "$OWNER" --repo "$REPO" --format json 2>&1) \
|
||
|| { echo "[WARN] 创建里程碑失败: $MS"; MS='{"data":{"id":""}}'; }
|
||
echo "$MS" > "$OUTPUT_DIR/milestone.json"
|
||
MILESTONE_ID=$(echo "$MS" | node -e "
|
||
let s='';
|
||
process.stdin.on('data',d=>s+=d).on('end',()=>{
|
||
try { const d=JSON.parse(s).data||{}; process.stdout.write(String(d.id||d.milestone_id||'')); }
|
||
catch(e){ process.stdout.write(''); }
|
||
});
|
||
" 2>/dev/null)
|
||
echo "[INFO] 里程碑 ID: ${MILESTONE_ID:-(未知)}"
|
||
fi
|
||
|
||
# ---- Step 2: 创建起始标签 ----
|
||
declare -a LABEL_NAMES=("good-first-issue" "enhancement" "bug")
|
||
declare -a LABEL_COLORS=("7057ff" "a2eeef" "d73a4a")
|
||
declare -a LABEL_IDS=()
|
||
|
||
for i in 0 1 2; do
|
||
NAME="${LABEL_NAMES[$i]}"
|
||
COLOR="${LABEL_COLORS[$i]}"
|
||
if [ "$DRY_RUN" = "true" ]; then
|
||
echo "[DRY-RUN] 将执行: label +create --name $NAME --color $COLOR"
|
||
LABEL_IDS[$i]="<pending>"
|
||
else
|
||
RES=$(gitlink-cli label +create --name "$NAME" --color "$COLOR" \
|
||
--owner "$OWNER" --repo "$REPO" --format json 2>&1) \
|
||
|| { echo "[WARN] 创建标签 $NAME 失败: $RES"; RES='{"data":{"id":""}}'; }
|
||
LID=$(echo "$RES" | node -e "
|
||
let s='';
|
||
process.stdin.on('data',d=>s+=d).on('end',()=>{
|
||
try { const d=JSON.parse(s).data||{}; process.stdout.write(String(d.id||'')); }
|
||
catch(e){ process.stdout.write(''); }
|
||
});
|
||
" 2>/dev/null)
|
||
LABEL_IDS[$i]="$LID"
|
||
echo "[INFO] 标签 $NAME ID: ${LID:-(未知)}"
|
||
fi
|
||
done
|
||
ENH_ID="${LABEL_IDS[1]}"
|
||
GFI_ID="${LABEL_IDS[0]}"
|
||
|
||
# ---- Step 3: 创建初始 Issue ----
|
||
declare -a ISSUE_TITLES=("完善 README 文档" "配置 CI 流水线" "撰写贡献指南 CONTRIBUTING.md")
|
||
declare -a ISSUE_BODIES=(
|
||
"补充安装、用法、贡献指南等小节,让新贡献者快速上手。"
|
||
"确保 push/PR 触发构建与测试,输出测试覆盖率。"
|
||
"说明提交流程、代码规范、Issue/PR 模板。"
|
||
)
|
||
declare -a ISSUE_LABELS=("$ENH_ID" "$ENH_ID" "$GFI_ID")
|
||
|
||
for i in 0 1 2; do
|
||
TITLE="${ISSUE_TITLES[$i]}"
|
||
BODY="${ISSUE_BODIES[$i]}"
|
||
LBL="${ISSUE_LABELS[$i]}"
|
||
if [ "$DRY_RUN" = "true" ]; then
|
||
echo "[DRY-RUN] 将执行: issue +create -t \"$TITLE\" --milestone ${MILESTONE_ID} --label ${LBL}"
|
||
else
|
||
ISSUE_RES=$(gitlink-cli issue +create -t "$TITLE" -b "$BODY" \
|
||
--owner "$OWNER" --repo "$REPO" \
|
||
--milestone "$MILESTONE_ID" --label "$LBL" --format json 2>&1) \
|
||
|| { echo "[WARN] 创建 Issue \"$TITLE\" 失败: $ISSUE_RES"; continue; }
|
||
echo "[INFO] Issue 已创建: $TITLE"
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "[========================================]"
|
||
echo "[ Phase 3 完成 ]"
|
||
echo "[ 数据保存至: $OUTPUT_DIR/ ]"
|
||
echo "[========================================]"
|