diff --git a/packages/source-control-gitlab/src/server/gitLabMergeRequestJson.test.ts b/packages/source-control-gitlab/src/server/gitLabMergeRequestJson.test.ts index c9bc12743756c2593c55348a13c4b3c9edd8c918..1cb81087e0c8ce767a9bdfcbadc5fa0d9cf68956 100644 --- a/packages/source-control-gitlab/src/server/gitLabMergeRequestJson.test.ts +++ b/packages/source-control-gitlab/src/server/gitLabMergeRequestJson.test.ts @@ -181,6 +181,20 @@ describe("decodeMergeRequestDetailJson", () => { expect(detail.changedFiles).toBe(0); }); + it("reads the head commit, and says nothing where GitLab omitted it", () => { + const headSha = (entry: Record) => + expectSuccess(decodeMergeRequestDetailJson(detailJson(entry))).headSha; + const sha = "afce4da4d5fe7d2fd0647b5b864526ea0a2827cb"; + + expect(headSha({ sha })).toBe(sha); + // A new merge request can report its head before GitLab has computed `diff_refs`. + expect(headSha({ sha, diff_refs: null })).toBe(sha); + expect(headSha({ sha, merge_commit_sha: "0".repeat(40) })).toBe(sha); + expect(headSha({})).toBeUndefined(); + expect(headSha({ sha: null })).toBeUndefined(); + expect(headSha({ sha: " " })).toBeUndefined(); + }); + it("reads either auto-merge field, and says nothing where GitLab named neither", () => { const armed = (entry: Record) => expectSuccess(decodeMergeRequestDetailJson(detailJson(entry))).autoMergeEnabled; diff --git a/packages/source-control-gitlab/src/server/gitLabMergeRequestJson.ts b/packages/source-control-gitlab/src/server/gitLabMergeRequestJson.ts index b9991920d0d3a880bcf1edb12b0bb777f87d012a..d61816b516b032477069125e14fddbd09971d08e 100644 --- a/packages/source-control-gitlab/src/server/gitLabMergeRequestJson.ts +++ b/packages/source-control-gitlab/src/server/gitLabMergeRequestJson.ts @@ -51,6 +51,8 @@ const RawMergeRequestSchema = Schema.Struct({ author: Schema.optional(Schema.NullOr(RawUserSchema)), source_branch: Schema.String, target_branch: Schema.String, + /** The source branch's head commit. */ + sha: Schema.optional(Schema.NullOr(Schema.String)), state: Schema.optional(Schema.NullOr(Schema.String)), draft: Schema.optional(Schema.Boolean), work_in_progress: Schema.optional(Schema.Boolean), @@ -240,6 +242,8 @@ export interface GitLabMergeRequestDetail extends GitLabMergeRequestListItem { * it: an install too old to answer must not be read as saying the branch is current. */ readonly divergedCommits?: number; + /** Absent where GitLab did not report the head commit. */ + readonly headSha?: string; } function trimmed(value: string | null | undefined): string | null { @@ -365,6 +369,7 @@ function toListItem( function toDetail(raw: Schema.Schema.Type): GitLabMergeRequestDetail { const listItem = toListItem(raw); + const headSha = trimmed(raw.sha); const autoMerge = raw.merge_when_pipeline_succeeds == null && raw.auto_merge_enabled == null ? undefined @@ -390,6 +395,7 @@ function toDetail(raw: Schema.Schema.Type): GitLab ? { autoMergeMethod: "squash" as const } : {}), ...(raw.diverged_commits_count == null ? {} : { divergedCommits: raw.diverged_commits_count }), + ...(headSha === null ? {} : { headSha }), }; }