fix(issue-extract): 留言逐頁讀完,不再只數第一頁

原本只打一次留言端點就收工,留言超過一頁時未整併的則數會少算——而少算的後果
是下游以為描述是最新的,照著過期的描述做事。改用 lib.pages 走完所有頁,讀不完
就以 COMMENT_LIMIT 報錯,不無聲回傳半份。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-17 05:00:28 +00:00
co-authored by Claude Opus 5
parent c8ecc39dc8
commit 6125c2b6e0
+12 -7
View File
@@ -14,6 +14,7 @@ import {
expectOk, expectOk,
giteaRequest, giteaRequest,
main, main,
pages,
parseFlags, parseFlags,
parseRepo, parseRepo,
preflight, preflight,
@@ -92,16 +93,20 @@ async function fetchIssue(login, repo, index, path) {
* *
* 已整併的留言會被打上 `+1` reaction(由 sdlc-sync 負責標記),而 Gitea 的留言物件 * 已整併的留言會被打上 `+1` reaction(由 sdlc-sync 負責標記),而 Gitea 的留言物件
* 不含 reaction,所以只能逐則再查一次。留言多時請求數會跟著長,但這個數字要準 * 不含 reaction,所以只能逐則再查一次。留言多時請求數會跟著長,但這個數字要準
* ——它決定下游會不會拿著過期的描述做事。 * ——它決定下游會不會拿著過期的描述做事,所以留言也要逐頁讀完,讀不完寧可報錯。
*/ */
async function countUnmergedComments(login, repo, commentsPath) { async function countUnmergedComments(login, repo, commentsPath) {
const comments = expectOk(await giteaRequest(login, 'GET', commentsPath), `GET ${commentsPath}`) ?? [];
let unmerged = 0; let unmerged = 0;
for (const comment of comments) {
const path = `/repos/${repo}/issues/comments/${comment.id}/reactions`; for await (const comments of pages(login, commentsPath, {
const reactions = expectOk(await giteaRequest(login, 'GET', path), `GET ${path}`) ?? []; limitCode: 'COMMENT_LIMIT',
if (!reactions.some((reaction) => reaction.content === '+1')) unmerged += 1; limitHint: `${commentsPath} 的留言太多,數不完未整併的則數`,
})) {
for (const comment of comments) {
const path = `/repos/${repo}/issues/comments/${comment.id}/reactions`;
const reactions = expectOk(await giteaRequest(login, 'GET', path), `GET ${path}`) ?? [];
if (!reactions.some((reaction) => reaction.content === '+1')) unmerged += 1;
}
} }
return unmerged; return unmerged;
} }