chore(husky): 实现 CHANGELOG 自动更新功能
- 创建 scripts/update-changelog.sh 自动更新脚本 - 更新 commit-msg hook 调用自动更新脚本 - 简化 pre-commit hook 移除手动检查 - 支持从 commit message 提取信息生成条目
Showing
3 changed files
with
159 additions
and
35 deletions
| ... | @@ -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 "" | ... | ... |
scripts/update-changelog.sh
0 → 100755
| 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}" |
-
Please register or login to post a comment