From 87da02ee7ea8de730e9c9a4d8952c9724473b105 Mon Sep 17 00:00:00 2001 From: Roomote Date: Thu, 10 Sep 2026 02:22:59 +0000 Subject: [PATCH 1/2] fix: preserve PR labels while mergeability is pending --- .github/workflows/label-pr-review-state.yml | 7 +++++-- src/services/__tests__/pr-review-state-workflow.test.ts | 8 +++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/label-pr-review-state.yml b/.github/workflows/label-pr-review-state.yml index d2c24ce3c0..9426ec4279 100644 --- a/.github/workflows/label-pr-review-state.yml +++ b/.github/workflows/label-pr-review-state.yml @@ -721,8 +721,11 @@ jobs: continue; } if (latestPrDetail.mergeable === null || latestPrDetail.mergeable_state === 'unknown') { - desiredLabel = null; - phase = 'mergeability-pending'; + core.info(`PR #${pr.number}: mergeability pending — preserving current state labels`); + await updateReviewGate(pr, 'mergeability-pending', false); + await setCodeRabbitReviewActive(pr, false); + await updateReviewGuide(pr, 'mergeability-pending', existingGuide); + continue; } } diff --git a/src/services/__tests__/pr-review-state-workflow.test.ts b/src/services/__tests__/pr-review-state-workflow.test.ts index abc77eed2a..8b7797ac77 100644 --- a/src/services/__tests__/pr-review-state-workflow.test.ts +++ b/src/services/__tests__/pr-review-state-workflow.test.ts @@ -957,10 +957,10 @@ describe("PR review-state workflow", () => { expect(result.addLabels).toHaveBeenCalledWith(expect.objectContaining({ labels: ["has-conflicts"] })) }) - it("does not tag a PR awaiting maintainer while mergeability is unknown", async () => { + it("preserves the current state while mergeability is unknown", async () => { const result = await runWorkflow({ eventName: "push", - labels: ["awaiting-maintainer"], + labels: ["awaiting-maintainer", "coderabbit-review-active"], mergeabilitySequence: [ { mergeable: null, mergeableState: "unknown" }, { mergeable: null, mergeableState: "unknown" }, @@ -975,9 +975,11 @@ describe("PR review-state workflow", () => { ], }) - expect(result.removeLabel).toHaveBeenCalledWith(expect.objectContaining({ name: "awaiting-maintainer" })) + expect(result.removeLabel).not.toHaveBeenCalledWith(expect.objectContaining({ name: "awaiting-maintainer" })) + expect(result.removeLabel).toHaveBeenCalledWith(expect.objectContaining({ name: "coderabbit-review-active" })) expect(result.addLabels).not.toHaveBeenCalledWith(expect.objectContaining({ labels: ["awaiting-maintainer"] })) expect(latestGateStatus(result)?.description).toContain("calculating mergeability") + expect(latestGuide(result)).toContain("calculating mergeability") }) it("routes CodeRabbit change requests back to the author", async () => { From 6dd6960d02517fef7f1ad6dba9a33e5b588e37d8 Mon Sep 17 00:00:00 2001 From: Roomote Date: Fri, 11 Sep 2026 12:01:54 +0000 Subject: [PATCH 2/2] fix: preserve review state after metadata failures --- .github/workflows/label-pr-review-state.yml | 13 ++++++---- .../pr-review-state-workflow.test.ts | 24 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/.github/workflows/label-pr-review-state.yml b/.github/workflows/label-pr-review-state.yml index 9426ec4279..fdeaf9960d 100644 --- a/.github/workflows/label-pr-review-state.yml +++ b/.github/workflows/label-pr-review-state.yml @@ -721,10 +721,15 @@ jobs: continue; } if (latestPrDetail.mergeable === null || latestPrDetail.mergeable_state === 'unknown') { - core.info(`PR #${pr.number}: mergeability pending — preserving current state labels`); - await updateReviewGate(pr, 'mergeability-pending', false); - await setCodeRabbitReviewActive(pr, false); - await updateReviewGuide(pr, 'mergeability-pending', existingGuide); + try { + core.info(`PR #${pr.number}: mergeability pending — preserving current state labels`); + await updateReviewGate(pr, 'mergeability-pending', false); + await setCodeRabbitReviewActive(pr, false); + await updateReviewGuide(pr, 'mergeability-pending', existingGuide); + } catch (error) { + error.preserveStateLabels = true; + throw error; + } continue; } } diff --git a/src/services/__tests__/pr-review-state-workflow.test.ts b/src/services/__tests__/pr-review-state-workflow.test.ts index 8b7797ac77..7f81abfd4e 100644 --- a/src/services/__tests__/pr-review-state-workflow.test.ts +++ b/src/services/__tests__/pr-review-state-workflow.test.ts @@ -982,6 +982,30 @@ describe("PR review-state workflow", () => { expect(latestGuide(result)).toContain("calculating mergeability") }) + it("preserves the current state when pending mergeability metadata cannot be updated", async () => { + const result = await runWorkflow({ + eventName: "push", + labels: ["awaiting-maintainer", "coderabbit-review-active"], + mergeabilitySequence: [ + { mergeable: null, mergeableState: "unknown" }, + { mergeable: null, mergeableState: "unknown" }, + ], + removeLabelStatus: 500, + reviews: [ + { + login: "coderabbitai[bot]", + type: "Bot", + state: "APPROVED", + submittedAt: REVIEWED_AT, + }, + ], + }) + + expect(result.removeLabel).toHaveBeenCalledWith(expect.objectContaining({ name: "coderabbit-review-active" })) + expect(result.removeLabel).not.toHaveBeenCalledWith(expect.objectContaining({ name: "awaiting-maintainer" })) + expect(result.setFailed).toHaveBeenCalledWith(expect.stringContaining("Remove label failed")) + }) + it("routes CodeRabbit change requests back to the author", async () => { const result = await runWorkflow({ labels: ["coderabbit-review-active"],