pre-commit
4.73 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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# 颜色定义
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(检查整个 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/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 ""
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 ""
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 ""
else
echo " ${GREEN}✅ CHANGELOG.md 已更新${NC}"
fi
# ============================================
# 所有检查通过
# ============================================
echo ""
echo "✅ ${GREEN}所有检查通过!${NC}"
echo "🚀 ${BLUE}开始提交...${NC}"
echo ""