hookehuyr

chore(husky): 实现 CHANGELOG 自动更新功能

- 创建 scripts/update-changelog.sh 自动更新脚本
- 更新 commit-msg hook 调用自动更新脚本
- 简化 pre-commit hook 移除手动检查
- 支持从 commit message 提取信息生成条目
...@@ -85,3 +85,17 @@ fi ...@@ -85,3 +85,17 @@ fi
85 85
86 echo " ${GREEN}✅ Commit Message 格式正确${NC}" 86 echo " ${GREEN}✅ Commit Message 格式正确${NC}"
87 echo "" 87 echo ""
88 +
89 +# ============================================
90 +# 自动更新 CHANGELOG.md
91 +# ============================================
92 +echo "📝 ${BLUE}更新 CHANGELOG.md...${NC}"
93 +echo ""
94 +
95 +# 调用 CHANGELOG 更新脚本
96 +SCRIPT_PATH="scripts/update-changelog.sh"
97 +if [ -f "$SCRIPT_PATH" ]; then
98 + bash "$SCRIPT_PATH" "$COMMIT_MSG_FILE"
99 +else
100 + echo " ${YELLOW}⚠️ CHANGELOG 更新脚本不存在: $SCRIPT_PATH${NC}"
101 +fi
......
...@@ -12,7 +12,7 @@ echo "" ...@@ -12,7 +12,7 @@ echo ""
12 # ============================================ 12 # ============================================
13 # 1. 代码质量检查 13 # 1. 代码质量检查
14 # ============================================ 14 # ============================================
15 -echo "📋 ${BLUE}步骤 1/4: 代码格式检查${NC}" 15 +echo "📋 ${BLUE}步骤 1/3: 代码格式检查${NC}"
16 16
17 # 检查是否有 staged 文件 17 # 检查是否有 staged 文件
18 STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(vue|js|jsx|ts|tsx)$' || true) 18 STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(vue|js|jsx|ts|tsx)$' || true)
...@@ -42,7 +42,7 @@ fi ...@@ -42,7 +42,7 @@ fi
42 # 2. 检查 console.log 和 debugger 42 # 2. 检查 console.log 和 debugger
43 # ============================================ 43 # ============================================
44 echo "" 44 echo ""
45 -echo "📋 ${BLUE}步骤 2/4: 检查调试代码${NC}" 45 +echo "📋 ${BLUE}步骤 2/3: 检查调试代码${NC}"
46 46
47 if [ -n "$STAGED_FILES" ]; then 47 if [ -n "$STAGED_FILES" ]; then
48 # 检查 console.log - 将换行符替换为空格 48 # 检查 console.log - 将换行符替换为空格
...@@ -72,7 +72,7 @@ fi ...@@ -72,7 +72,7 @@ fi
72 # 3. 检查改动规模(自动审查触发) 72 # 3. 检查改动规模(自动审查触发)
73 # ============================================ 73 # ============================================
74 echo "" 74 echo ""
75 -echo "📋 ${BLUE}步骤 3/4: 改动规模检查${NC}" 75 +echo "📋 ${BLUE}步骤 3/3: 改动规模检查${NC}"
76 76
77 # 统计改动行数 77 # 统计改动行数
78 STATS=$(git diff --cached --numstat | awk '{added+=$1; deleted+=$2; files++} END {print files, added+deleted}') 78 STATS=$(git diff --cached --numstat | awk '{added+=$1; deleted+=$2; files++} END {print files, added+deleted}')
...@@ -120,41 +120,10 @@ fi ...@@ -120,41 +120,10 @@ fi
120 echo " ${GREEN}✅ 改动规模检查通过${NC}" 120 echo " ${GREEN}✅ 改动规模检查通过${NC}"
121 121
122 # ============================================ 122 # ============================================
123 -# 4. 检查 CHANGELOG.md
124 -# ============================================
125 -echo ""
126 -echo "📋 ${BLUE}步骤 4/4: 检查 CHANGELOG.md${NC}"
127 -
128 -# 检查 CHANGELOG.md 是否被修改
129 -CHANGELOG_MODIFIED=$(git diff --cached --name-only | grep 'CHANGELOG.md' || true)
130 -
131 -if [ -z "$CHANGELOG_MODIFIED" ]; then
132 - echo ""
133 - echo " ${YELLOW}⚠️ CHANGELOG.md 未更新${NC}"
134 - echo " ${YELLOW}建议:每次提交都应更新 docs/CHANGELOG.md${NC}"
135 - echo ""
136 - echo " ${BLUE}CHANGELOG 格式:${NC}"
137 - echo " ## [$(date +%Y-%m-%d)] - 简短描述"
138 - echo " "
139 - echo " ### 新增/修复/优化"
140 - echo " - 变更内容"
141 - echo " "
142 - echo " ---"
143 - echo " "
144 - echo " **详细信息**:"
145 - echo " - **影响文件**: 文件1, 文件2"
146 - echo " - **技术栈**: Vue 3, Taro"
147 - echo " - **测试状态**: 已通过"
148 - echo " - **备注**: 其他说明"
149 - echo ""
150 -else
151 - echo " ${GREEN}✅ CHANGELOG.md 已更新${NC}"
152 -fi
153 -
154 -# ============================================
155 # 所有检查通过 123 # 所有检查通过
156 # ============================================ 124 # ============================================
157 echo "" 125 echo ""
158 echo "✅ ${GREEN}所有检查通过!${NC}" 126 echo "✅ ${GREEN}所有检查通过!${NC}"
159 echo "🚀 ${BLUE}开始提交...${NC}" 127 echo "🚀 ${BLUE}开始提交...${NC}"
128 +echo "📝 ${BLUE}CHANGELOG.md 将在 commit-msg 阶段自动更新${NC}"
160 echo "" 129 echo ""
......
1 +#!/bin/bash
2 +
3 +# ============================================
4 +# CHANGELOG 自动更新脚本
5 +# ============================================
6 +#
7 +# 功能:根据 commit message 自动更新 docs/CHANGELOG.md
8 +# 使用:在 commit-msg hook 中调用
9 +#
10 +# 作者:Claude Code
11 +# 日期:2026-02-22
12 +# ============================================
13 +
14 +set -e
15 +
16 +# 颜色定义
17 +RED='\033[0;31m'
18 +GREEN='\033[0;32m'
19 +YELLOW='\033[1;33m'
20 +BLUE='\033[0;34m'
21 +NC='\033[0m' # No Color
22 +
23 +# 参数
24 +COMMIT_MSG_FILE=$1
25 +CHANGELOG_FILE="docs/CHANGELOG.md"
26 +
27 +# 检查文件是否存在
28 +if [ ! -f "$CHANGELOG_FILE" ]; then
29 + echo " ${YELLOW}⚠️ CHANGELOG.md 不存在,跳过自动更新${NC}"
30 + exit 0
31 +fi
32 +
33 +# 读取 commit message
34 +COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")
35 +
36 +# 解析 commit message
37 +# 格式: type(scope): subject
38 +if ! echo "$COMMIT_MSG" | grep -qE "^([a-z]+)\(([a-z-]+)\): .{1,50}"; then
39 + echo " ${YELLOW}⚠️ Commit message 格式不匹配,跳过自动更新${NC}"
40 + exit 0
41 +fi
42 +
43 +# 提取信息
44 +COMMIT_TYPE=$(echo "$COMMIT_MSG" | sed -E 's/^([a-z]+)\(.*/\1/')
45 +COMMIT_SCOPE=$(echo "$COMMIT_MSG" | sed -E 's/^[a-z]+\(([a-z-]+)\).*/\1/')
46 +COMMIT_SUBJECT=$(echo "$COMMIT_MSG" | sed -E 's/^[a-z]+\([a-z-]+\): (.{1,50}).*/\1/')
47 +
48 +# 类型映射到中文
49 +case "$COMMIT_TYPE" in
50 + feat)
51 + CHANGE_TYPE="新增"
52 + ;;
53 + fix)
54 + CHANGE_TYPE="修复"
55 + ;;
56 + docs)
57 + CHANGE_TYPE="文档"
58 + ;;
59 + style)
60 + CHANGE_TYPE="样式"
61 + ;;
62 + refactor)
63 + CHANGE_TYPE="优化"
64 + ;;
65 + perf)
66 + CHANGE_TYPE="性能"
67 + ;;
68 + test)
69 + CHANGE_TYPE="测试"
70 + ;;
71 + chore)
72 + CHANGE_TYPE="配置"
73 + ;;
74 + revert)
75 + CHANGE_TYPE="回滚"
76 + ;;
77 + *)
78 + CHANGE_TYPE="其他"
79 + ;;
80 +esac
81 +
82 +# 获取当前日期
83 +TODAY=$(date +%Y-%m-%d)
84 +
85 +# 获取影响的文件
86 +STAGED_FILES=$(git diff --cached --name-only | head -5 | tr '\n' ', ' | sed 's/, $//')
87 +if [ -z "$STAGED_FILES" ]; then
88 + STAGED_FILES="无"
89 +fi
90 +
91 +# 生成 CHANGELOG 条目
92 +CHANGELOG_ENTRY="## [$TODAY] - $COMMIT_SUBJECT
93 +
94 +### $CHANGE_TYPE
95 +- $COMMIT_SUBJECT$COMMIT_SCOPE
96 +
97 +---
98 +
99 +**详细信息**
100 +- **影响文件**: $STAGED_FILES
101 +- **技术栈**: Taro 4, Vue 3, NutUI
102 +- **测试状态**: 待验证
103 +- **备注**: 自动生成
104 +
105 +"
106 +
107 +# 检查今天是否已有相同标题的条目
108 +if grep -q "## \[$TODAY\] - $COMMIT_SUBJECT" "$CHANGELOG_FILE"; then
109 + echo " ${YELLOW}⚠️ CHANGELOG 中已存在今日相同条目,跳过${NC}"
110 + exit 0
111 +fi
112 +
113 +# 创建临时文件
114 +TEMP_FILE=$(mktemp)
115 +
116 +# 将新条目插入到文件开头(跳过可能的文件头注释)
117 +# 找到第一个 ## [ 开头的行,在它之前插入
118 +if grep -q "^## \[" "$CHANGELOG_FILE"; then
119 + # 找到第一个条目的行号
120 + FIRST_ENTRY_LINE=$(grep -n "^## \[" "$CHANGELOG_FILE" | head -1 | cut -d: -f1)
121 +
122 + # 将新条目和原有内容合并
123 + head -n $((FIRST_ENTRY_LINE - 1)) "$CHANGELOG_FILE" > "$TEMP_FILE"
124 + echo "$CHANGELOG_ENTRY" >> "$TEMP_FILE"
125 + tail -n +$FIRST_ENTRY_LINE "$CHANGELOG_FILE" >> "$TEMP_FILE"
126 +else
127 + # 如果没有找到条目,直接追加
128 + cat "$CHANGELOG_FILE" > "$TEMP_FILE"
129 + echo "$CHANGELOG_ENTRY" >> "$TEMP_FILE"
130 +fi
131 +
132 +# 替换原文件
133 +mv "$TEMP_FILE" "$CHANGELOG_FILE"
134 +
135 +# 将 CHANGELOG.md 加入暂存区
136 +git add "$CHANGELOG_FILE"
137 +
138 +echo " ${GREEN}✅ CHANGELOG.md 已自动更新${NC}"
139 +echo " ${BLUE} 类型: $CHANGE_TYPE${NC}"
140 +echo " ${BLUE} 范围: $COMMIT_SCOPE${NC}"
141 +echo " ${BLUE} 描述: $COMMIT_SUBJECT${NC}"