fix(sync): paginate compare and resolve real head SHA
This commit is contained in:
@@ -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),
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user