pre-commit 3.86 KB
# 颜色定义
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/3: 代码格式检查${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(检查整个 src 目录,避免文件列表传递问题)
  echo ""
  echo "  🔍 运行 ESLint..."
  if ! pnpm lint --quiet; 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/3: 检查调试代码${NC}"

if [ -n "$STAGED_FILES" ]; then
  # 检查 console.log - 将换行符替换为空格
  CONSOLE_LOGS=$(echo "$STAGED_FILES" | tr '\n' ' ' | xargs git diff --cached | grep -E "^\+.*console\.(log|debug|info)" || true)

  if [ -n "$CONSOLE_LOGS" ]; then
    echo ""
    echo "  ${YELLOW}⚠️  发现 console.log/debug/info 语句${NC}"
    echo "  ${YELLOW}建议:生产代码应移除调试语句${NC}"
    echo ""
  fi

  # 检查 debugger - 将换行符替换为空格
  DEBUGGERS=$(echo "$STAGED_FILES" | tr '\n' ' ' | xargs git diff --cached | 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/3: 改动规模检查${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 ""
fi

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

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