pre-commit 5.34 KB
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

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

echo ""
echo "🔍 ${BLUE}开始 Pre-commit 检查...${NC}"
echo ""

# ============================================
# 1. 代码质量检查
# ============================================
echo "📋 ${BLUE}步骤 1/4: 代码格式检查${NC}"

# 检查是否有 staged 文件
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(vue|js|jsx|ts|tsx)$' || true)

if [ -z "$STAGED_FILES" ]; then
  echo "  ⚠️  没有 JS/Vue 文件变更,跳过代码检查"
else
  echo "  📝 变更文件:"
  echo "$STAGED_FILES" | while read file; do
    echo "     - $file"
  done

  # 运行 ESLint
  echo ""
  echo "  🔍 运行 ESLint..."
  if ! pnpm lint --quiet "$STAGED_FILES"; then
    echo ""
    echo "  ${RED}❌ ESLint 检查失败${NC}"
    echo "  ${YELLOW}请运行 'pnpm lint' 查看详细错误并修复${NC}"
    exit 1
  fi

  echo "  ${GREEN}✅ ESLint 检查通过${NC}"
fi

# ============================================
# 2. 检查 console.log 和 debugger
# ============================================
echo ""
echo "📋 ${BLUE}步骤 2/4: 检查调试代码${NC}"

if [ -n "$STAGED_FILES" ]; then
  # 检查 console.log
  CONSOLE_LOGS=$(git diff --cached "$STAGED_FILES" | grep -E "^\+.*console\.(log|debug|info)" || true)

  if [ -n "$CONSOLE_LOGS" ]; then
    echo ""
    echo "  ${YELLOW}⚠️  发现 console.log/debug/info 语句${NC}"
    echo "  ${YELLOW}建议:生产代码应移除调试语句${NC}"
    echo ""
    echo "  是否继续提交?(y/n)"
    read -r response
    if [ ! "$response" = "y" ]; then
      echo "  ${RED}❌ 已取消提交${NC}"
      exit 1
    fi
  fi

  # 检查 debugger
  DEBUGGERS=$(git diff --cached "$STAGED_FILES" | grep -E "^\+.*debugger" || true)

  if [ -n "$DEBUGGERS" ]; then
    echo ""
    echo "  ${RED}❌ 发现 debugger 语句${NC}"
    echo "  ${RED}请移除后再提交${NC}"
    exit 1
  fi

  echo "  ${GREEN}✅ 调试代码检查通过${NC}"
fi

# ============================================
# 3. 检查改动规模(自动审查触发)
# ============================================
echo ""
echo "📋 ${BLUE}步骤 3/4: 改动规模检查${NC}"

# 统计改动行数
STATS=$(git diff --cached --numstat | awk '{added+=$1; deleted+=$2; files++} END {print files, added+deleted}')
FILES_CHANGED=$(echo "$STATS" | cut -d' ' -f1)
LINES_CHANGED=$(echo "$STATS" | cut -d' ' -f2)

echo "  📊 改动统计:"
echo "     文件数: $FILES_CHANGED"
echo "     行数:   $LINES_CHANGED"

# 判断是否需要代码审查
NEEDS_REVIEW=false
REVIEW_REASON=""

if [ "$FILES_CHANGED" -ge 3 ]; then
  NEEDS_REVIEW=true
  REVIEW_REASON="$REVIEW_REASON  - 文件数 ≥ 3 (实际: $FILES_CHANGED)"
fi

if [ "$LINES_CHANGED" -ge 100 ]; then
  NEEDS_REVIEW=true
  REVIEW_REASON="$REVIEW_REASON  - 改动行数 ≥ 100 (实际: $LINES_CHANGED)"
fi

# 检查是否涉及敏感文件
SENSITIVE_FILES=$(echo "$STAGED_FILES" | grep -E '(openid\.js|request\.js|app\.config\.js|stores/|api/)' || true)
if [ -n "$SENSITIVE_FILES" ]; then
  NEEDS_REVIEW=true
  REVIEW_REASON="$REVIEW_REASON  - 涉及核心文件(认证/状态管理/API)"
fi

if [ "$NEEDS_REVIEW" = true ]; then
  echo ""
  echo "  ${YELLOW}⚠️  检测到较大改动,建议进行代码审查${NC}"
  echo "  ${YELLOW}原因:${NC}"
  echo "$REVIEW_REASON"
  echo ""
  echo "  ${BLUE}请在 VSCode 中让 Claude Code 进行审查:${NC}"
  echo "     1. 保存所有文件"
  echo "     2. 对 Claude Code 说:'请审查我的代码改动'"
  echo "     3. 根据审查报告修复 P0 问题"
  echo "     4. 重新提交"
  echo ""
  echo "  ${YELLOW}是否跳过审查继续提交?(y/n)${NC}"
  read -r response
  if [ ! "$response" = "y" ]; then
    echo "  ${RED}❌ 已取消提交,请先进行代码审查${NC}"
    exit 1
  fi
fi

echo "  ${GREEN}✅ 改动规模检查通过${NC}"

# ============================================
# 4. 检查 CHANGELOG.md
# ============================================
echo ""
echo "📋 ${BLUE}步骤 4/4: 检查 CHANGELOG.md${NC}"

# 检查 CHANGELOG.md 是否被修改
CHANGELOG_MODIFIED=$(git diff --cached --name-only | grep 'CHANGELOG.md' || true)

if [ -z "$CHANGELOG_MODIFIED" ]; then
  echo ""
  echo "  ${YELLOW}⚠️  CHANGELOG.md 未更新${NC}"
  echo "  ${YELLOW}建议:每次提交都应更新 docs/CHANGELOG.md${NC}"
  echo ""
  echo "  ${BLUE}CHANGELOG 格式:${NC}"
  echo "     ## [$(date +%Y-%m-%d)] - 简短描述"
  echo "     "
  echo "     ### 新增/修复/优化"
  echo "     - 变更内容"
  echo "     "
  echo "     ---"
  echo "     "
  echo "     **详细信息**:"
  echo "     - **影响文件**: 文件1, 文件2"
  echo "     - **技术栈**: Vue 3, Taro"
  echo "     - **测试状态**: 已通过"
  echo "     - **备注**: 其他说明"
  echo ""
  echo "  ${YELLOW}是否继续提交(不更新 CHANGELOG)?(y/n)${NC}"
  read -r response
  if [ ! "$response" = "y" ]; then
    echo "  ${RED}❌ 已取消提交,请先更新 CHANGELOG.md${NC}"
    exit 1
  fi
else
  echo "  ${GREEN}✅ CHANGELOG.md 已更新${NC}"
fi

# ============================================
# 所有检查通过
# ============================================
echo ""
echo "✅ ${GREEN}所有检查通过!${NC}"
echo "🚀 ${BLUE}开始提交...${NC}"
echo ""