From ddfbb832fa74f89bf02f320863c2721d614dcbb6 Mon Sep 17 00:00:00 2001 From: glorysr1209-png Date: Fri, 29 May 2026 19:55:48 -0400 Subject: [PATCH] fix(labels): look up repository labels by name --- src/github/labels.ts | 10 ++++++---- test/unit/github-labels.test.ts | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/github/labels.ts b/src/github/labels.ts index c6a75e9fbe..6795ba9042 100644 --- a/src/github/labels.ts +++ b/src/github/labels.ts @@ -31,13 +31,15 @@ export async function ensurePullRequestLabel( let created = false; if (options.createMissingLabel) { - const repoLabels = await octokit.request("GET /repos/{owner}/{repo}/labels", { + const labelLookup = await octokit.request("GET /repos/{owner}/{repo}/labels/{name}", { owner, repo, - per_page: 100, + name: labelName, + }).catch((error: { status?: number }) => { + if (error.status === 404) return null; + throw error; }); - const labelExists = (repoLabels.data as GitHubLabel[]).some((label) => label.name?.toLowerCase() === labelName.toLowerCase()); - if (!labelExists) { + if (!labelLookup) { await octokit.request("POST /repos/{owner}/{repo}/labels", { owner, repo, diff --git a/test/unit/github-labels.test.ts b/test/unit/github-labels.test.ts index 370e22a156..89fa04c14c 100644 --- a/test/unit/github-labels.test.ts +++ b/test/unit/github-labels.test.ts @@ -38,7 +38,7 @@ describe("GitHub PR labels", () => { calls.push(`${method} ${url}`); if (url.includes("/access_tokens")) return Response.json({ token: "installation-token" }); if (url.includes("/issues/4/labels") && method === "GET") return Response.json([]); - if (url.includes("/repos/JSONbored/gittensory/labels") && method === "GET") return Response.json([{ name: "gittensor" }]); + if (url.includes("/labels/gittensor") && method === "GET") return Response.json({ name: "gittensor" }); if (url.includes("/issues/4/labels") && method === "POST") return Response.json([{ name: "gittensor" }]); return new Response("unexpected", { status: 500 }); }); @@ -59,7 +59,7 @@ describe("GitHub PR labels", () => { calls.push(`${method} ${url}`); if (url.includes("/access_tokens")) return Response.json({ token: "installation-token" }); if (url.includes("/issues/4/labels") && method === "GET") return Response.json([]); - if (url.includes("/repos/JSONbored/gittensory/labels") && method === "GET") return Response.json([]); + if (url.includes("/labels/gittensor") && method === "GET") return new Response("not found", { status: 404 }); if (url.includes("/repos/JSONbored/gittensory/labels") && method === "POST") { const body = JSON.parse(String(init?.body ?? "{}")) as { name?: string; color?: string }; expect(body).toMatchObject({ name: "gittensor", color: "7ee787" });