Skip to content

Commit 44de539

Browse files
authored
Merge request approvals support (#36)
1 parent a7408d5 commit 44de539

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

src/GitlabApi.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ export interface MergeRequestInfo extends MergeRequest {
8888
merge_error: string | null;
8989
}
9090

91+
export interface MergeRequestApprovals {
92+
approvals_required: number;
93+
approvals_left: number;
94+
}
95+
9196
export interface DiscussionNote {
9297
resolved: boolean;
9398
resolvable: boolean;
@@ -142,6 +147,10 @@ export class GitlabApi {
142147
return this.sendRequestWithMultiResponse(`/api/v4/projects/${projectId}/merge_requests/${mergeRequestIid}/pipelines`, RequestMethod.Get);
143148
}
144149

150+
public async getMergeRequestApprovals(projectId: number, mergeRequestIid: number): Promise<MergeRequestApprovals> {
151+
return this.sendRequestWithSingleResponse(`/api/v4/projects/${projectId}/merge_requests/${mergeRequestIid}/approvals`, RequestMethod.Get);
152+
}
153+
145154
public async updateMergeRequest(projectId: number, mergeRequestIid: number, data: MergeRequestUpdateData): Promise<MergeRequestInfo> {
146155
return this.sendRequestWithSingleResponse(`/api/v4/projects/${projectId}/merge_requests/${mergeRequestIid}`, RequestMethod.Put, data);
147156
}

src/MergeRequestAcceptor.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {
22
GitlabApi,
3-
MergeRequest,
3+
MergeRequest, MergeRequestApprovals,
44
MergeRequestInfo, MergeRequestPipeline,
55
MergeState,
66
MergeStatus,
@@ -19,6 +19,7 @@ export enum AcceptMergeRequestResultKind {
1919
FailedPipeline,
2020
InvalidPipeline,
2121
WaitingPipeline,
22+
WaitingForApprovals,
2223
Unauthorized,
2324
}
2425

@@ -65,6 +66,12 @@ interface WaitingPipelineResponse extends Response {
6566
pipeline: MergeRequestPipeline;
6667
}
6768

69+
interface WaitingForApprovalsResponse extends Response {
70+
kind: AcceptMergeRequestResultKind.WaitingForApprovals;
71+
mergeRequestInfo: MergeRequestInfo;
72+
approvals: MergeRequestApprovals;
73+
}
74+
6875
interface UnauthorizedResponse extends Response {
6976
kind: AcceptMergeRequestResultKind.Unauthorized;
7077
mergeRequestInfo: MergeRequestInfo;
@@ -77,6 +84,7 @@ export type AcceptMergeRequestResult = SuccessResponse
7784
| FailedPipelineResponse
7885
| InvalidPipelineResponse
7986
| WaitingPipelineResponse
87+
| WaitingForApprovalsResponse
8088
| UnauthorizedResponse;
8189

8290
interface AcceptMergeRequestOptions {
@@ -268,6 +276,16 @@ export const acceptMergeRequest = async (gitlabApi: GitlabApi, mergeRequest: Mer
268276
}
269277
}
270278

279+
const approvals = await gitlabApi.getMergeRequestApprovals(mergeRequestInfo.project_id, mergeRequestInfo.iid);
280+
if (approvals.approvals_left > 0) {
281+
return {
282+
kind: AcceptMergeRequestResultKind.WaitingForApprovals,
283+
mergeRequestInfo,
284+
user,
285+
approvals,
286+
};
287+
}
288+
271289
console.log(`[MR][${mergeRequestInfo.iid}] Calling merge request`);
272290
const response = await gitlabApi.sendRawRequest(`/api/v4/projects/${mergeRequestInfo.project_id}/merge_requests/${mergeRequestInfo.iid}/merge`, RequestMethod.Put, {
273291
should_remove_source_branch: options.removeBranchAfterMerge,

src/index.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,17 @@ const resolveMergeRequestResult = async (result: AcceptMergeRequestResult) => {
101101
return;
102102
}
103103

104+
if (result.kind === AcceptMergeRequestResultKind.WaitingForApprovals) {
105+
console.log(`[MR] Merge request is waiting for approvals, assigning back`);
106+
107+
await Promise.all([
108+
assignToAuthorAndResetLabels(gitlabApi, mergeRequestInfo),
109+
sendNote(gitlabApi, mergeRequestInfo, `Merge request is waiting for approvals. Required ${result.approvals.approvals_required}, but ${result.approvals.approvals_left} left.`),
110+
]);
111+
112+
return;
113+
}
114+
104115
if (result.kind === AcceptMergeRequestResultKind.InvalidPipeline) {
105116
const message = result.pipeline === null
106117
? `Merge request can't be merged. Pipeline does not exist`

0 commit comments

Comments
 (0)