🐛 fix bug
Hello from ImmortalWrt / say-hello (push) Successful in 0s Details

This commit is contained in:
csh 2025-11-03 11:38:30 +08:00
parent 7373553270
commit fa21511d1a
1 changed files with 82 additions and 35 deletions

View File

@ -440,9 +440,9 @@ jobs:
echo "" echo ""
echo "🔍 扫描提交记录..." echo "🔍 扫描提交记录..."
# ============================================ TEMP_COMMITS=$(mktemp)
# 使用 NULL 分隔符读取 git log (最安全可靠的方式) 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_HASH
declare -a COMMITS_AUTHOR declare -a COMMITS_AUTHOR
declare -a COMMITS_MESSAGE declare -a COMMITS_MESSAGE
@ -458,48 +458,97 @@ jobs:
echo "📋 已加载 ${#IGNORE_PATTERNS[@]} 个忽略模式" echo "📋 已加载 ${#IGNORE_PATTERNS[@]} 个忽略模式"
VALID_COUNT=0 COMMIT_INDEX=0
CURRENT_HASH=""
CURRENT_AUTHOR=""
CURRENT_MESSAGE=""
CURRENT_BODY=""
IN_BODY=false
SKIPPED_COUNT=0 SKIPPED_COUNT=0
# 使用 NULL 分隔符读取 commits while IFS= read -r line; do
# -z: 使用 NULL 字符分隔输出 if [[ "$line" == "COMMIT_START" ]]; then
# %x00: 在格式中插入 NULL 字符 # 处理前一个 commit
# 格式: 完整hash \0 作者 \0 主题 \0 正文 \0 if [ -n "$CURRENT_HASH" ]; then
while IFS= read -r -d '' hash && \
IFS= read -r -d '' author && \
IFS= read -r -d '' subject && \
IFS= read -r -d '' body; do
# 检查是否应该忽略此提交
SHOULD_SKIP=false SHOULD_SKIP=false
MATCHED_PATTERN=""
for pattern in "${IGNORE_PATTERNS[@]}"; do for pattern in "${IGNORE_PATTERNS[@]}"; do
# 跳过空模式
[ -z "$pattern" ] && continue [ -z "$pattern" ] && continue
if echo "$CURRENT_MESSAGE" | grep -qiE "$pattern"; then
if [[ "$subject" =~ $pattern ]]; then
SHOULD_SKIP=true SHOULD_SKIP=true
MATCHED_PATTERN="$pattern" echo " ⏭️ 跳过: ${CURRENT_MESSAGE:0:70}... (匹配: ${pattern})"
SKIPPED_COUNT=$((SKIPPED_COUNT + 1))
break break
fi fi
done done
if [ "$SHOULD_SKIP" = true ]; then if [ "$SHOULD_SKIP" = false ]; then
echo " ⏭️ 跳过: ${subject:0:70}... (匹配: ${MATCHED_PATTERN})" COMMITS_HASH[$COMMIT_INDEX]="$CURRENT_HASH"
SKIPPED_COUNT=$((SKIPPED_COUNT + 1)) COMMITS_AUTHOR[$COMMIT_INDEX]="$CURRENT_AUTHOR"
else COMMITS_MESSAGE[$COMMIT_INDEX]="$CURRENT_MESSAGE"
COMMITS_HASH+=("$hash") COMMITS_BODY[$COMMIT_INDEX]="$CURRENT_BODY"
COMMITS_AUTHOR+=("$author") COMMIT_INDEX=$((COMMIT_INDEX + 1))
COMMITS_MESSAGE+=("$subject")
COMMITS_BODY+=("$body")
VALID_COUNT=$((VALID_COUNT + 1))
fi fi
done < <(git log $COMMIT_RANGE --no-merges --reverse -z --format="%H%x00%an%x00%s%x00%b%x00") 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
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
rm -f "$TEMP_COMMITS"
VALID_COUNT=$COMMIT_INDEX
echo "" echo ""
echo "📊 提交统计:" echo "📊 提交统计:"
echo " ✅ 有效提交: $VALID_COUNT" echo " 有效提交: $VALID_COUNT"
echo " ⏭️ 已跳过: $SKIPPED_COUNT" echo " ⏭️ 已跳过: $SKIPPED_COUNT"
echo " 📝 总计: $((VALID_COUNT + SKIPPED_COUNT))" echo " 📝 总计: $((VALID_COUNT + SKIPPED_COUNT))"
echo "" echo ""
@ -624,11 +673,9 @@ jobs:
/^## :bookmark: '"${CHANGELOG_VERSION}"'$/ { in_version=1; next } /^## :bookmark: '"${CHANGELOG_VERSION}"'$/ { in_version=1; next }
/^## :bookmark: / && in_version { in_version=0 } /^## :bookmark: / && in_version { in_version=0 }
in_version && /\(\[([0-9a-f]{7})\]/ { in_version && /\(\[([0-9a-f]{7})\]/ {
if(match($0, /\(\[([0-9a-f]{7})\]/)) { match($0, /\(\[([0-9a-f]{7})\]/, arr)
hash = substr($0, RSTART+2, 7)
print arr[1] print arr[1]
} }
}
' CHANGELOG.md | sort -u) ' CHANGELOG.md | sort -u)
# 找出真正的新 commits (基于 hash 去重) # 找出真正的新 commits (基于 hash 去重)