fix(sync): paginate compare and resolve real head SHA

This commit is contained in:
Gabriel Brown
2026-07-11 13:44:10 -04:00
parent c8200a6747
commit 4684617fed
3 changed files with 128 additions and 12 deletions
+34 -9
View File
@@ -117,6 +117,9 @@ const normalizeCompareCommit = (
htmlUrl: commit.html_url,
});
const COMPARE_PER_PAGE = 100;
const COMPARE_MAX_PAGES = 30; // bound: up to 3000 commits collected
export const compareAcrossForkNetwork = async (
octokit: Octokit,
args: {
@@ -125,24 +128,46 @@ export const compareAcrossForkNetwork = async (
baseOwner: string;
baseBranch: string;
headOwner: string;
headRepo: string;
headBranch: string;
},
): Promise<GitHubCompareSummary> => {
const basehead = `${args.baseOwner}:${args.baseBranch}...${args.headOwner}:${args.headBranch}`;
const result = await octokit.rest.repos.compareCommitsWithBasehead({
const first = await octokit.rest.repos.compareCommitsWithBasehead({
owner: args.owner,
repo: args.repo,
basehead,
per_page: 100,
per_page: COMPARE_PER_PAGE,
page: 1,
});
const commits = result.data.commits.map(normalizeCompareCommit);
const rawCommits = [...first.data.commits];
const totalCommits = first.data.total_commits;
let page = 2;
while (rawCommits.length < totalCommits && page <= COMPARE_MAX_PAGES) {
const next = await octokit.rest.repos.compareCommitsWithBasehead({
owner: args.owner,
repo: args.repo,
basehead,
per_page: COMPARE_PER_PAGE,
page,
});
if (next.data.commits.length === 0) break;
rawCommits.push(...next.data.commits);
page += 1;
}
const head = await resolveBranchHead(
octokit,
args.headOwner,
args.headRepo,
args.headBranch,
);
return {
aheadBy: result.data.ahead_by,
mergeBaseSha: result.data.merge_base_commit.sha,
headSha: commits[commits.length - 1]?.sha,
baseSha: result.data.base_commit.sha,
htmlUrl: result.data.html_url,
commits,
aheadBy: first.data.ahead_by,
mergeBaseSha: first.data.merge_base_commit.sha,
headSha: head.sha,
baseSha: first.data.base_commit.sha,
htmlUrl: first.data.html_url,
commits: rawCommits.map(normalizeCompareCommit),
};
};