prepare-commit-msg 1.63 KB
#!/bin/sh
# ============================================
# Prepare-commit-msg Hook
# ============================================
#
# 功能:
# 1. 自动更新 CHANGELOG.md(包含在当前提交中)
#
# 关键特性:
# - 只在初始提交时执行,amend 时不会触发
# - 配合 post-commit 使用 amend --no-verify 完成流程
#
# 作者:Claude Code
# 日期:2026-02-28
# ============================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 获取 commit message 文件
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2  # commit 来源:message/template/merge/squash等

# 只跳过 merge 提交,其他情况都执行
# 这样可以确保无论使用何种方式提交(-m/-C/-c等),CHANGELOG 都会被更新
if [ "$COMMIT_SOURCE" != "merge" ]; then
  # 读取 commit message
  if [ -f "$COMMIT_MSG_FILE" ]; then
    COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")

    # 只处理第一行(subject)
    FIRST_LINE=$(echo "$COMMIT_MSG" | head -n 1)

    # 解析 commit type
    COMMIT_TYPE=$(echo "$FIRST_LINE" | sed -E 's/^([a-z]+)\(.*/\1/')

    # 只对特定类型更新 CHANGELOG
    # 跳过: docs(changelog) 类型的提交,避免循环
    if echo "$FIRST_LINE" | grep -qE "^docs\(changelog\):"; then
      # 跳过
      :
    elif [ "$COMMIT_TYPE" = "feat" ] || [ "$COMMIT_TYPE" = "fix" ] || [ "$COMMIT_TYPE" = "refactor" ] || [ "$COMMIT_TYPE" = "perf" ]; then
      echo ""
      echo "📝 ${BLUE}更新 CHANGELOG...${NC}"

      # 调用 CHANGELOG 更新脚本
      bash scripts/changelog/update-changelog-prepare.sh "$COMMIT_MSG_FILE"
    fi
  fi
fi