From fa21511d1ab98e415036046bc6950f8a3b322f25 Mon Sep 17 00:00:00 2001 From: csh Date: Mon, 3 Nov 2025 11:38:30 +0800 Subject: [PATCH] :bug: fix bug --- .gitea/workflows/changelog_and_release.yml | 117 +++++++++++++++------ 1 file changed, 82 insertions(+), 35 deletions(-) diff --git a/.gitea/workflows/changelog_and_release.yml b/.gitea/workflows/changelog_and_release.yml index f0a62b0..d32748d 100644 --- a/.gitea/workflows/changelog_and_release.yml +++ b/.gitea/workflows/changelog_and_release.yml @@ -440,9 +440,9 @@ jobs: echo "" echo "🔍 扫描提交记录..." - # ============================================ - # 使用 NULL 分隔符读取 git log (最安全可靠的方式) - # ============================================ + TEMP_COMMITS=$(mktemp) + git log $COMMIT_RANGE --no-merges --reverse --format="COMMIT_START%n%H%n%an%n%s%nBODY_START%n%b%nBODY_END" > "$TEMP_COMMITS" + declare -a COMMITS_HASH declare -a COMMITS_AUTHOR declare -a COMMITS_MESSAGE @@ -458,49 +458,98 @@ jobs: echo "📋 已加载 ${#IGNORE_PATTERNS[@]} 个忽略模式" - VALID_COUNT=0 + COMMIT_INDEX=0 + CURRENT_HASH="" + CURRENT_AUTHOR="" + CURRENT_MESSAGE="" + CURRENT_BODY="" + IN_BODY=false SKIPPED_COUNT=0 - # 使用 NULL 分隔符读取 commits - # -z: 使用 NULL 字符分隔输出 - # %x00: 在格式中插入 NULL 字符 - # 格式: 完整hash \0 作者 \0 主题 \0 正文 \0 - while IFS= read -r -d '' hash && \ - IFS= read -r -d '' author && \ - IFS= read -r -d '' subject && \ - IFS= read -r -d '' body; do + while IFS= read -r line; do + if [[ "$line" == "COMMIT_START" ]]; then + # 处理前一个 commit + if [ -n "$CURRENT_HASH" ]; then + SHOULD_SKIP=false + for pattern in "${IGNORE_PATTERNS[@]}"; do + [ -z "$pattern" ] && continue + if echo "$CURRENT_MESSAGE" | grep -qiE "$pattern"; then + SHOULD_SKIP=true + echo " ⏭️ 跳过: ${CURRENT_MESSAGE:0:70}... (匹配: ${pattern})" + SKIPPED_COUNT=$((SKIPPED_COUNT + 1)) + break + fi + done - # 检查是否应该忽略此提交 + if [ "$SHOULD_SKIP" = false ]; then + COMMITS_HASH[$COMMIT_INDEX]="$CURRENT_HASH" + COMMITS_AUTHOR[$COMMIT_INDEX]="$CURRENT_AUTHOR" + COMMITS_MESSAGE[$COMMIT_INDEX]="$CURRENT_MESSAGE" + COMMITS_BODY[$COMMIT_INDEX]="$CURRENT_BODY" + COMMIT_INDEX=$((COMMIT_INDEX + 1)) + fi + fi + + # 重置状态 + CURRENT_HASH="" + CURRENT_AUTHOR="" + CURRENT_MESSAGE="" + CURRENT_BODY="" + IN_BODY=false + STATE="HASH" + + elif [[ "$line" == "BODY_START" ]]; then + IN_BODY=true + CURRENT_BODY="" + elif [[ "$line" == "BODY_END" ]]; then + IN_BODY=false + elif [ "$IN_BODY" = true ]; then + if [ -n "$CURRENT_BODY" ]; then + CURRENT_BODY="${CURRENT_BODY}"$'\n'"${line}" + else + CURRENT_BODY="$line" + fi + else + if [ -z "$CURRENT_HASH" ]; then + CURRENT_HASH="$line" + elif [ -z "$CURRENT_AUTHOR" ]; then + CURRENT_AUTHOR="$line" + elif [ -z "$CURRENT_MESSAGE" ]; then + CURRENT_MESSAGE="$line" + fi + fi + done < "$TEMP_COMMITS" + + # 处理最后一个 commit + if [ -n "$CURRENT_HASH" ]; then SHOULD_SKIP=false - MATCHED_PATTERN="" - for pattern in "${IGNORE_PATTERNS[@]}"; do - # 跳过空模式 [ -z "$pattern" ] && continue - - if [[ "$subject" =~ $pattern ]]; then + if echo "$CURRENT_MESSAGE" | grep -qiE "$pattern"; then SHOULD_SKIP=true - MATCHED_PATTERN="$pattern" + echo " ⏭️ 跳过: ${CURRENT_MESSAGE:0:70}... (匹配: ${pattern})" + SKIPPED_COUNT=$((SKIPPED_COUNT + 1)) break fi done - if [ "$SHOULD_SKIP" = true ]; then - echo " ⏭️ 跳过: ${subject:0:70}... (匹配: ${MATCHED_PATTERN})" - SKIPPED_COUNT=$((SKIPPED_COUNT + 1)) - else - COMMITS_HASH+=("$hash") - COMMITS_AUTHOR+=("$author") - COMMITS_MESSAGE+=("$subject") - COMMITS_BODY+=("$body") - VALID_COUNT=$((VALID_COUNT + 1)) + if [ "$SHOULD_SKIP" = false ]; then + COMMITS_HASH[$COMMIT_INDEX]="$CURRENT_HASH" + COMMITS_AUTHOR[$COMMIT_INDEX]="$CURRENT_AUTHOR" + COMMITS_MESSAGE[$COMMIT_INDEX]="$CURRENT_MESSAGE" + COMMITS_BODY[$COMMIT_INDEX]="$CURRENT_BODY" + COMMIT_INDEX=$((COMMIT_INDEX + 1)) fi - done < <(git log $COMMIT_RANGE --no-merges --reverse -z --format="%H%x00%an%x00%s%x00%b%x00") + fi + + rm -f "$TEMP_COMMITS" + + VALID_COUNT=$COMMIT_INDEX echo "" echo "📊 提交统计:" - echo " ✅ 有效提交: $VALID_COUNT" - echo " ⏭️ 已跳过: $SKIPPED_COUNT" + echo " ✓ 有效提交: $VALID_COUNT" + echo " ⏭️ 已跳过: $SKIPPED_COUNT" echo " 📝 总计: $((VALID_COUNT + SKIPPED_COUNT))" echo "" @@ -624,10 +673,8 @@ jobs: /^## :bookmark: '"${CHANGELOG_VERSION}"'$/ { in_version=1; next } /^## :bookmark: / && in_version { in_version=0 } in_version && /\(\[([0-9a-f]{7})\]/ { - if(match($0, /\(\[([0-9a-f]{7})\]/)) { - hash = substr($0, RSTART+2, 7) - print arr[1] - } + match($0, /\(\[([0-9a-f]{7})\]/, arr) + print arr[1] } ' CHANGELOG.md | sort -u)