feat: 流水线更新,修复commit次数统计不正确的问题
All checks were successful
缓存序列化结构检查 / cache-schema-check (push) Has been skipped
All checks were successful
缓存序列化结构检查 / cache-schema-check (push) Has been skipped
This commit is contained in:
@@ -82,6 +82,8 @@ jobs:
|
||||
env:
|
||||
# push 前 tip;新分支首次 push 时为全 0。workflow_dispatch 可能为空,下方会回退。
|
||||
PUSH_BEFORE: ${{ gitea.event.before }}
|
||||
# push 事件携带的 commits 列表(JSON);用于准确统计 commit 数(不受浅克隆影响)
|
||||
PUSH_COMMITS_JSON: ${{ toJson(gitea.event.commits) }}
|
||||
run: |
|
||||
if [ -f /tmp/cache-schema-check.skip ]; then
|
||||
echo "总开关已关闭,跳过检测"
|
||||
@@ -113,7 +115,7 @@ jobs:
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 确保 before 提交对象可读(按 SHA 浅取,无需全量历史)
|
||||
# 确保提交对象可读
|
||||
ensure_commit() {
|
||||
local sha="$1"
|
||||
if git cat-file -e "${sha}^{commit}" 2>/dev/null; then
|
||||
@@ -123,7 +125,6 @@ jobs:
|
||||
if git fetch --depth 1 origin "${sha}"; then
|
||||
git cat-file -e "${sha}^{commit}" 2>/dev/null && return 0
|
||||
fi
|
||||
# 兜底:逐步 deepen(应对部分服务端不允许直接 fetch SHA)
|
||||
for d in 10 30 50 100; do
|
||||
echo "deepen ${d}…"
|
||||
git fetch --deepen "${d}" || true
|
||||
@@ -134,6 +135,43 @@ jobs:
|
||||
return 1
|
||||
}
|
||||
|
||||
# 加深当前 tip 的历史,直到 before 成为 after 的祖先(否则 rev-list 在浅克隆下会少算)
|
||||
ensure_range() {
|
||||
local old="$1"
|
||||
local new="$2"
|
||||
local i=0
|
||||
while [ "$i" -lt 15 ]; do
|
||||
if git merge-base --is-ancestor "${old}" "${new}" 2>/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
echo "区间历史不完整,deepen 20…(第 $((i + 1)) 次)"
|
||||
git fetch --deepen 20 || true
|
||||
i=$((i + 1))
|
||||
done
|
||||
# force-push 等非祖先关系:对象在即可做 git show,但 rev-list 不可靠
|
||||
if git cat-file -e "${old}^{commit}" 2>/dev/null \
|
||||
&& git cat-file -e "${new}^{commit}" 2>/dev/null; then
|
||||
echo "警告: ${old} 不是 ${new} 的祖先(可能 force-push),commit 计数将改用事件 payload"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# 优先用 Gitea push 事件的 commits 数组长度(准确且不依赖 shallow)
|
||||
count_from_payload() {
|
||||
if [ -z "${PUSH_COMMITS_JSON:-}" ] || [ "${PUSH_COMMITS_JSON}" = "null" ] || [ "${PUSH_COMMITS_JSON}" = "[]" ]; then
|
||||
return 1
|
||||
fi
|
||||
# Gitea/GitHub push payload: [{"id":"<40位sha>", ...}, ...]
|
||||
local n
|
||||
n=$(printf '%s' "${PUSH_COMMITS_JSON}" | grep -oE '"id"[[:space:]]*:[[:space:]]*"[0-9a-fA-F]{7,40}"' | wc -l | tr -d ' ')
|
||||
if [ -n "$n" ] && [ "$n" -gt 0 ] 2>/dev/null; then
|
||||
echo "$n"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
if ! ensure_commit "$OLD_SHA"; then
|
||||
echo "错误: 无法获取 push 前 tip ${OLD_SHA},请检查 shallow/权限"
|
||||
exit 2
|
||||
@@ -142,10 +180,22 @@ jobs:
|
||||
echo "错误: 无法解析当前 tip ${NEW_SHA}"
|
||||
exit 2
|
||||
fi
|
||||
if ! ensure_range "$OLD_SHA" "$NEW_SHA"; then
|
||||
echo "错误: 无法补齐 ${OLD_SHA}..${NEW_SHA} 历史"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
echo "对比区间: ${OLD_SHA} → ${NEW_SHA}"
|
||||
COMMIT_COUNT=$(git rev-list --count "${OLD_SHA}..${NEW_SHA}" 2>/dev/null || echo "?")
|
||||
echo "本次 push 累计 commit 数(约): ${COMMIT_COUNT}"
|
||||
|
||||
COMMIT_COUNT=""
|
||||
if COMMIT_COUNT=$(count_from_payload); then
|
||||
echo "本次 push 累计 commit 数: ${COMMIT_COUNT}(来自事件 payload)"
|
||||
elif git merge-base --is-ancestor "$OLD_SHA" "$NEW_SHA" 2>/dev/null; then
|
||||
COMMIT_COUNT=$(git rev-list --count "${OLD_SHA}..${NEW_SHA}" 2>/dev/null || echo "?")
|
||||
echo "本次 push 累计 commit 数: ${COMMIT_COUNT}(来自 git rev-list)"
|
||||
else
|
||||
echo "本次 push 累计 commit 数: ?(非祖先关系且无 payload)"
|
||||
fi
|
||||
|
||||
COMMIT_TIME=$(git log -1 --format=%cd --date=format:'%Y-%m-%d %H:%M:%S' "${NEW_SHA}")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user