From 9f9982b488f5a309dde601d2fb7331e445dca939 Mon Sep 17 00:00:00 2001 From: "paseo-bot[bot]" <266920839+paseo-bot[bot]@users.noreply.github.com> Date: Sat, 10 Oct 2026 13:03:59 +0200 Subject: [PATCH] fix(gitlab): resolve merge requests with legacy null references Successful legacy MR responses were rejected before branch status could be resolved. Accept null at the existing response boundary, as with absent reference metadata, while keeping current response validation. --- .../src/services/gitlab-service.test.ts | 29 +++++++++++++++++++ .../server/src/services/gitlab-service.ts | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/server/src/services/gitlab-service.test.ts b/packages/server/src/services/gitlab-service.test.ts index c74224e444..13c8f9f20a 100644 --- a/packages/server/src/services/gitlab-service.test.ts +++ b/packages/server/src/services/gitlab-service.test.ts @@ -298,6 +298,35 @@ describe("createGitLabService", () => { expect(calls[1]).toEqual(["mr", "view", "14", "-F", "json"]); }); + it.each(["list", "view"])( + "resolves the current merge request when %s returns legacy null references", + async (legacyCommand) => { + const legacyMr = { + ...OPEN_MR, + reference: "!14", + references: null, + web_url: "https://gitlab.example.com/example-group/example-project/merge_requests/14", + }; + const { service } = makeService((args) => { + const mr = args[1] === legacyCommand ? legacyMr : OPEN_MR; + if (args[0] === "mr" && args[1] === "list") return ok(JSON.stringify([mr])); + if (args[0] === "mr" && args[1] === "view") return ok(JSON.stringify(mr)); + if (args[0] === "api") return ok("{}"); + throw new Error(`unexpected call: ${args.join(" ")}`); + }); + + await expect( + service.getCurrentPullRequestStatus({ cwd: "/repo", headRef: "release/v0.4.0" }), + ).resolves.toMatchObject({ + number: 14, + title: OPEN_MR.title, + state: "open", + headRefName: "release/v0.4.0", + url: legacyCommand === "view" ? legacyMr.web_url : OPEN_MR.web_url, + }); + }, + ); + it("reports a conflicting merge request as CONFLICTING", async () => { const conflicting = { ...OPEN_MR, diff --git a/packages/server/src/services/gitlab-service.ts b/packages/server/src/services/gitlab-service.ts index f0b166cdda..a3f1026fce 100644 --- a/packages/server/src/services/gitlab-service.ts +++ b/packages/server/src/services/gitlab-service.ts @@ -168,7 +168,7 @@ const GitLabMergeRequestSchema = z description: z.string().nullable().optional(), labels: z.array(z.string()).optional(), updated_at: z.string().optional(), - references: z.object({ full: z.string().optional() }).passthrough().optional(), + references: z.object({ full: z.string().optional() }).passthrough().nullable().optional(), head_pipeline: GitLabPipelineSchema.nullable().optional(), }) .passthrough();