Switch to pull request list API instead of search (#393)

* Switch to pull request list API instead of search

To reduce the amount of rate-limit that we use,
switch to a cheaper API for determining whether
an existing PR exists for a given branch.

* Ensure PR remains open when updating description

* Update .changeset/clean-bees-count.md

Co-authored-by: willo-icon <161356817+willo-icon@users.noreply.github.com>

---------

Co-authored-by: Mateusz Burzyński <mateuszburzynski@gmail.com>
Co-authored-by: willo-icon <161356817+willo-icon@users.noreply.github.com>
This commit is contained in:
Sam Lanning
2024-08-26 18:38:29 +02:00
committed by GitHub
co-authored by willo-icon Mateusz Burzyński
parent 89b41e6c69
commit 48ab0d2f2e
4 changed files with 26 additions and 25 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"@changesets/action": patch
---
Ensure the PR remains open when updated
+5
View File
@@ -0,0 +1,5 @@
---
"@changesets/action": patch
---
Switch to cheaper API for querying existing PRs
+6 -18
View File
@@ -33,11 +33,9 @@ jest.mock("@actions/github/lib/utils", () => ({
jest.mock("./gitUtils"); jest.mock("./gitUtils");
let mockedGithubMethods = { let mockedGithubMethods = {
search: {
issuesAndPullRequests: jest.fn(),
},
pulls: { pulls: {
create: jest.fn(), create: jest.fn(),
list: jest.fn(),
}, },
repos: { repos: {
createRelease: jest.fn(), createRelease: jest.fn(),
@@ -65,9 +63,7 @@ describe("version", () => {
let cwd = f.copy("simple-project"); let cwd = f.copy("simple-project");
linkNodeModules(cwd); linkNodeModules(cwd);
mockedGithubMethods.search.issuesAndPullRequests.mockImplementationOnce( mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
() => ({ data: { items: [] } })
);
mockedGithubMethods.pulls.create.mockImplementationOnce(() => ({ mockedGithubMethods.pulls.create.mockImplementationOnce(() => ({
data: { number: 123 }, data: { number: 123 },
@@ -104,9 +100,7 @@ describe("version", () => {
let cwd = f.copy("simple-project"); let cwd = f.copy("simple-project");
linkNodeModules(cwd); linkNodeModules(cwd);
mockedGithubMethods.search.issuesAndPullRequests.mockImplementationOnce( mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
() => ({ data: { items: [] } })
);
mockedGithubMethods.pulls.create.mockImplementationOnce(() => ({ mockedGithubMethods.pulls.create.mockImplementationOnce(() => ({
data: { number: 123 }, data: { number: 123 },
@@ -139,9 +133,7 @@ describe("version", () => {
let cwd = f.copy("ignored-package"); let cwd = f.copy("ignored-package");
linkNodeModules(cwd); linkNodeModules(cwd);
mockedGithubMethods.search.issuesAndPullRequests.mockImplementationOnce( mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
() => ({ data: { items: [] } })
);
mockedGithubMethods.pulls.create.mockImplementationOnce(() => ({ mockedGithubMethods.pulls.create.mockImplementationOnce(() => ({
data: { number: 123 }, data: { number: 123 },
@@ -174,9 +166,7 @@ describe("version", () => {
let cwd = f.copy("simple-project"); let cwd = f.copy("simple-project");
linkNodeModules(cwd); linkNodeModules(cwd);
mockedGithubMethods.search.issuesAndPullRequests.mockImplementationOnce( mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
() => ({ data: { items: [] } })
);
mockedGithubMethods.pulls.create.mockImplementationOnce(() => ({ mockedGithubMethods.pulls.create.mockImplementationOnce(() => ({
data: { number: 123 }, data: { number: 123 },
@@ -233,9 +223,7 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
let cwd = f.copy("simple-project"); let cwd = f.copy("simple-project");
linkNodeModules(cwd); linkNodeModules(cwd);
mockedGithubMethods.search.issuesAndPullRequests.mockImplementationOnce( mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
() => ({ data: { items: [] } })
);
mockedGithubMethods.pulls.create.mockImplementationOnce(() => ({ mockedGithubMethods.pulls.create.mockImplementationOnce(() => ({
data: { number: 123 }, data: { number: 123 },
+10 -7
View File
@@ -342,9 +342,11 @@ export async function runVersion({
}); });
} }
let searchQuery = `repo:${repo}+state:open+head:${versionBranch}+base:${branch}+is:pull-request`; const existingPullRequestsPromise = octokit.rest.pulls.list({
let searchResultPromise = octokit.rest.search.issuesAndPullRequests({ ...github.context.repo,
q: searchQuery, state: "open",
head: `${github.context.repo.owner}:${versionBranch}`,
base: branch,
}); });
let changedPackages = await getChangedPackages(cwd, versionsByDirectory); let changedPackages = await getChangedPackages(cwd, versionsByDirectory);
let changedPackagesInfoPromises = Promise.all( let changedPackagesInfoPromises = Promise.all(
@@ -376,8 +378,8 @@ export async function runVersion({
await gitUtils.push(versionBranch, { force: true }); await gitUtils.push(versionBranch, { force: true });
let searchResult = await searchResultPromise; let existingPullRequests = await existingPullRequestsPromise;
core.info(JSON.stringify(searchResult.data, null, 2)); core.info(JSON.stringify(existingPullRequests.data, null, 2));
const changedPackagesInfo = (await changedPackagesInfoPromises) const changedPackagesInfo = (await changedPackagesInfoPromises)
.filter((x) => x) .filter((x) => x)
@@ -391,7 +393,7 @@ export async function runVersion({
prBodyMaxCharacters, prBodyMaxCharacters,
}); });
if (searchResult.data.items.length === 0) { if (existingPullRequests.data.length === 0) {
core.info("creating pull request"); core.info("creating pull request");
const { data: newPullRequest } = await octokit.rest.pulls.create({ const { data: newPullRequest } = await octokit.rest.pulls.create({
base: branch, base: branch,
@@ -405,7 +407,7 @@ export async function runVersion({
pullRequestNumber: newPullRequest.number, pullRequestNumber: newPullRequest.number,
}; };
} else { } else {
const [pullRequest] = searchResult.data.items; const [pullRequest] = existingPullRequests.data;
core.info(`updating found pull request #${pullRequest.number}`); core.info(`updating found pull request #${pullRequest.number}`);
await octokit.rest.pulls.update({ await octokit.rest.pulls.update({
@@ -413,6 +415,7 @@ export async function runVersion({
title: finalPrTitle, title: finalPrTitle,
body: prBody, body: prBody,
...github.context.repo, ...github.context.repo,
state: "open",
}); });
return { return {