check-changelog.sh 5.69 KB
#!/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