pre-commit
3.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# 颜色定义
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 "📝 ${BLUE}CHANGELOG.md 将在 prepare-commit-msg 阶段更新${NC}"
echo ""