check-changelog.sh
5.69 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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#!/bin/bash
###############################################################################
# CHANGELOG 漏记检查脚本
#
# 功能:
# 1. 扫描最近 N 天的 git 提交记录
# 2. 对比 CHANGELOG.md 中的记录
# 3. 生成漏记报告
#
# 使用:
# ./scripts/check-changelog.sh [days]
#
# 示例:
# ./scripts/check-changelog.sh 7 # 检查最近 7 天
# ./scripts/check-changelog.sh 30 # 检查最近 30 天
# ./scripts/check-changelog.sh # 检查所有提交
#
###############################################################################
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 默认参数
DAYS=${1:-7} # 默认检查最近 7 天
CHANGELOG_FILE="docs/CHANGELOG.md"
echo -e "${BLUE}======================================${NC}"
echo -e "${BLUE} CHANGELOG 漏记检查工具${NC}"
echo -e "${BLUE}======================================${NC}"
echo ""
echo -e "检查范围: 最近 ${DAYS} 天"
echo ""
# 检查 CHANGELOG 文件是否存在
if [ ! -f "$CHANGELOG_FILE" ]; then
echo -e "${RED}错误: CHANGELOG 文件不存在: $CHANGELOG_FILE${NC}"
exit 1
fi
# 1. 获取 git 提交记录
echo -e "${BLUE}[1/4] 正在获取 git 提交记录...${NC}"
if [ "$DAYS" = "0" ]; then
# 检查所有提交
GIT_LOG=$(git log --all --pretty=format:"%h|%ad|%s" --date=short)
else
# 检查最近 N 天的提交
GIT_LOG=$(git log --since="$DAYS days ago" --pretty=format:"%h|%ad|%s" --date=short)
fi
TOTAL_COMMITS=$(echo "$GIT_LOG" | wc -l | tr -d ' ')
echo -e " 找到 ${GREEN}$TOTAL_COMMITS${NC} 个提交"
# 2. 解析 CHANGELOG 中的记录
echo -e "${BLUE}[2/4] 正在解析 CHANGELOG 记录...${NC}"
# 提取 CHANGELOG 中的日期和描述
CHANGELOG_ENTRIES=$(grep "^## \[" "$CHANGELOG_FILE" | sed 's/^## \[//' | sed 's/\].*//' | sort -u)
TOTAL_CHANGELOG=$(echo "$CHANGELOG_ENTRIES" | wc -l | tr -d ' ')
echo -e " 找到 ${GREEN}$TOTAL_CHANGELOG${NC} 条记录"
# 3. 对比分析
echo -e "${BLUE}[3/4] 正在对比分析...${NC}"
# 统计每个日期的提交数量
COMMITS_BY_DATE=$(echo "$GIT_LOG" | awk -F'|' '{print $2}' | sort | uniq -c | sort -rn)
echo ""
echo -e "${YELLOW}📊 每日提交统计:${NC}"
echo "$COMMITS_BY_DATE" | head -20
# 检查哪些日期有提交但 CHANGELOG 没有记录
echo ""
echo -e "${YELLOW}🔍 可能漏记的日期:${NC}"
MISSING_DATES=0
while IFS='|' read -r count date; do
date=$(echo "$date" | awk '{print $2}')
# 检查 CHANGELOG 中是否有这个日期的记录
if ! echo "$CHANGELOG_ENTRIES" | grep -q "$date"; then
echo -e " ${RED}✗${NC} $date - ${RED}$count 个提交未记录${NC}"
MISSING_DATES=$((MISSING_DATES + 1))
fi
done <<< "$COMMITS_BY_DATE"
if [ $MISSING_DATES -eq 0 ]; then
echo -e " ${GREEN}✓${NC} 所有提交都已记录"
fi
# 4. 生成详细报告
echo ""
echo -e "${BLUE}[4/4] 生成详细报告...${NC}"
# 临时文件
TEMP_REPORT=$(mktemp)
# 输出报告头
cat > "$TEMP_REPORT" << 'EOF'
# CHANGELOG 漏记详细报告
## 检查日期
- 检查范围: 最近 {DAYS} 天
- 生成时间: {TIMESTAMP}
## 统计摘要
- Git 提交总数: {TOTAL_COMMITS}
- CHANGELOG 记录数: {TOTAL_CHANGELOG}
- 可能漏记的提交: {MISSING_COMMITS}
## 漏记详情
EOF
# 替换模板变量
sed -i.bak "s/{DAYS}/$DAYS/g" "$TEMP_REPORT"
sed -i.bak "s/{TIMESTAMP}/$(date '+%Y-%m-%d %H:%M:%S')/g" "$TEMP_REPORT"
sed -i.bak "s/{TOTAL_COMMITS}/$TOTAL_COMMITS/g" "$TEMP_REPORT"
sed -i.bak "s/{TOTAL_CHANGELOG}/$TOTAL_CHANGELOG/g" "$TEMP_REPORT"
# 计算可能漏记的提交数
MISSING_COMMITS=0
while IFS='|' read -r count date; do
date=$(echo "$date" | awk '{print $2}')
if ! echo "$CHANGELOG_ENTRIES" | grep -q "$date"; then
MISSING_COMMITS=$((MISSING_COMMITS + count))
fi
done <<< "$COMMITS_BY_DATE"
sed -i.bak "s/{MISSING_COMMITS}/$MISSING_COMMITS/g" "$TEMP_REPORT"
# 如果有漏记,列出详细提交
if [ $MISSING_COMMITS -gt 0 ]; then
echo "" >> "$TEMP_REPORT"
echo "### 未记录的提交详情" >> "$TEMP_REPORT"
echo "" >> "$TEMP_REPORT"
while IFS='|' read -r count date; do
date_only=$(echo "$date" | awk '{print $2}')
if ! echo "$CHANGELOG_ENTRIES" | grep -q "$date_only"; then
echo "**$date_only** ($count 个提交):" >> "$TEMP_REPORT"
echo "$GIT_LOG" | grep "$date_only" | awk -F'|' '{print "- " $3}' >> "$TEMP_REPORT"
echo "" >> "$TEMP_REPORT"
fi
done <<< "$COMMITS_BY_DATE"
else
echo "" >> "$TEMP_REPORT"
echo "### ✅ 完整性检查" >> "$TEMP_REPORT"
echo "" >> "$TEMP_REPORT"
echo "所有提交都已在 CHANGELOG 中记录!" >> "$TEMP_REPORT"
fi
# 删除备份文件
rm -f "$TEMP_REPORT.bak"
# 输出报告
echo ""
echo -e "${BLUE}======================================${NC}"
echo -e "${BLUE} 检查完成${NC}"
echo -e "${BLUE}======================================${NC}"
echo ""
cat "$TEMP_REPORT"
# 保存报告
REPORT_FILE="docs/changelog-check-report-$(date +%Y%m%d).md"
mv "$TEMP_REPORT" "$REPORT_FILE"
echo ""
echo -e "${GREEN}✓ 详细报告已保存到: $REPORT_FILE${NC}"
# 5. 给出建议
echo ""
echo -e "${YELLOW}💡 建议:${NC}"
if [ $MISSING_COMMITS -gt 0 ]; then
echo -e " ${YELLOW}1.${NC} 查看 $REPORT_FILE 了解漏记详情"
echo -e " ${YELLOW}2.${NC} 更新 CHANGELOG.md 补充漏记的记录"
echo -e " ${YELLOW}3.${NC} 使用标准格式添加记录(参考文档顶部模板)"
else
echo -e " ${GREEN}✓${NC} CHANGELOG 记录完整,继续保持!"
fi
echo ""
echo -e "${BLUE}======================================${NC}"
echo ""
# 返回退出码
if [ $MISSING_COMMITS -gt 0 ]; then
exit 1 # 有漏记,返回非零退出码
else
exit 0 # 无漏记,返回零
fi