0

Update merge request

by
Published today

Change a merge request's title, description, target branch, labels, assignees or reviewers, or close or reopen it. Empty fields are left unchanged; labels replaces all labels, add_labels and remove_labels change some, clear_assignees and clear_reviewers remove everyone.

Script gitlab Verified

The script

Submitted by hugo989 Typescript (fetch-only)
Verified 8 hours ago
1
//native
2

3
/**
4
 * Update merge request
5
 * Change a merge request's title, description, target branch, labels, assignees or reviewers, or close or reopen it. Empty fields are left unchanged; labels replaces all labels, add_labels and remove_labels change some, clear_assignees and clear_reviewers remove everyone.
6
 */
7
export async function main(
8
  auth: RT.Gitlab,
9
  project: string,
10
  merge_request_iid: number,
11
  title: string | undefined,
12
  description: string | undefined,
13
  target_branch: string | undefined,
14
  labels: string[] | undefined,
15
  add_labels: string[] | undefined,
16
  remove_labels: string[] | undefined,
17
  assignee_ids: number[] | undefined,
18
  reviewer_ids: number[] | undefined,
19
  state_event: "keep" | "close" | "reopen" | undefined,
20
  clear_assignees: boolean = false,
21
  clear_reviewers: boolean = false
22
) {
23
  const list = (v: string[] | undefined) =>
24
    v?.length ? v.join(",") : undefined
25
  const url = `${(auth.baseUrl || "https://gitlab.com").replace(/\/+$/, "")}/api/v4/projects/${encodeURIComponent(project)}/merge_requests/${merge_request_iid}`
26

27
  const response = await fetch(url, {
28
    method: "PUT",
29
    headers: {
30
      Authorization: `Bearer ${auth.token}`,
31
      "Content-Type": "application/json",
32
      Accept: "application/json",
33
    },
34
    body: JSON.stringify({
35
      title: title || undefined,
36
      description: description || undefined,
37
      target_branch: target_branch || undefined,
38
      labels: list(labels),
39
      add_labels: list(add_labels),
40
      remove_labels: list(remove_labels),
41
      // An empty list leaves them as they are; clear_* removes everyone.
42
      assignee_ids: clear_assignees
43
        ? []
44
        : assignee_ids?.length
45
          ? assignee_ids
46
          : undefined,
47
      reviewer_ids: clear_reviewers
48
        ? []
49
        : reviewer_ids?.length
50
          ? reviewer_ids
51
          : undefined,
52
      state_event:
53
        state_event && state_event !== "keep" ? state_event : undefined,
54
    }),
55
  })
56

57
  if (!response.ok) {
58
    throw new Error(`${response.status} ${await response.text()}`)
59
  }
60

61
  return await response.json()
62
}
63