File: merge_request_approvals.rb

package info (click to toggle)
ruby-gitlab 5.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,660 kB
  • sloc: ruby: 12,582; makefile: 7; sh: 4
file content (265 lines) | stat: -rw-r--r-- 13,046 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# frozen_string_literal: true

class Gitlab::Client
  # Defines methods related to MR Approvals.
  # @see https://docs.gitlab.com/ee/api/merge_request_approvals.html
  module MergeRequestApprovals
    # Gets MR Approval Configuration for a project
    #
    # @example
    #   Gitlab.project_merge_request_approvals(1)
    #
    # @param [Integer] project The ID of a project.
    # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
    def project_merge_request_approvals(project)
      get("/projects/#{url_encode project}/approvals")
    end

    # Change MR Approval Configuration for a project
    #
    # @example
    #    Gitlab.edit_project_merge_request_approvals(1, {approvals_before_merge: 3})
    #    Gitlab.edit_project_merge_request_approvals(1, {approvals_before_merge: 3, reset_approvals_on_push: true})
    #    Gitlab.edit_project_merge_request_approvals(1, {approvals_before_merge: 3, disable_overriding_approvers_per_merge_request: false})
    #
    # @param [Integer] project(required) The ID of a project.
    # @option options [Integer] :approvals_before_merge(optional) How many approvals are required before an MR can be merged
    # @option options [Boolean] :reset_approvals_on_push(optional) Reset approvals on a new push
    # @option options [Boolean] :disable_overriding_approvers_per_merge_request(optional) Allow/Disallow overriding approvers per MR
    # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
    def edit_project_merge_request_approvals(project, options = {})
      post("/projects/#{url_encode project}/approvals", body: options)
    end

    # Gets MR Approval Rules for a project
    #
    # @example
    #   Gitlab.project_merge_request_approval_rules(1)
    #
    # @param [Integer] project The ID of a project.
    # @return [Gitlab::ObjectifiedHash] MR approval rules for the project
    def project_merge_request_approval_rules(project)
      get("/projects/#{url_encode project}/approval_rules")
    end

    # Create MR Approval Rule for a project
    #
    # @example
    #   Gitlab.create_project_merge_request_approval_rule(1, {name: "security", approvals_required: 1})
    #
    # @param [Integer] project(required) The ID of a project.
    # @option options [String] :name(required) The name of the approval rule
    # @option options [Integer] :approvals_required(required) The number of required approvals for this rule
    # @option options [Array] :user_ids(optional) The ids of users as approvers
    # @option options [Array] :group_ids(optional) The ids of groups as approvers
    # @option options [Array] :protected_branch_ids(optional) The ids of protected branches to scope the rule by
    # @return [Gitlab::ObjectifiedHash] New MR approval rule
    def create_project_merge_request_approval_rule(project, options = {})
      post("/projects/#{url_encode project}/approval_rules", body: options)
    end

    # Update MR Approval Rule for a project
    #
    # @example
    #   Gitlab.update_project_merge_request_approval_rule(1, {name: "security", approvals_required: 2})
    #
    # @param [Integer] project(required) The ID of a project.
    # @param [Integer] approval_rule_id(required) The ID of a project Approval Rule
    # @option options [String] :name(required) The name of the approval rule
    # @option options [Integer] :approvals_required(required) The number of required approvals for this rule
    # @option options [Array] :user_ids(optional) The ids of users as approvers
    # @option options [Array] :group_ids(optional) The ids of groups as approvers
    # @option options [Array] :protected_branch_ids(optional) The ids of protected branches to scope the rule by
    # @return [Gitlab::ObjectifiedHash] Updated MR approval rule
    def update_project_merge_request_approval_rule(project, approval_rule_id, options = {})
      put("/projects/#{url_encode project}/approval_rules/#{approval_rule_id}", body: options)
    end

    # Delete MR Approval Rule for a project
    #
    # @example
    #   Gitlab.delete_project_merge_request_approval_rule(1, 1)
    #
    # @param [Integer] project(required) The ID of a project.
    # @param [Integer] approval_rule_id(required) The ID of a approval rule
    # @return [void] This API call returns an empty response body
    def delete_project_merge_request_approval_rule(project, approval_rule_id)
      delete("/projects/#{url_encode project}/approval_rules/#{approval_rule_id}")
    end

    # Change allowed approvers and approver groups for a project
    # @deprecated Since Gitlab 13.12 /approvers endpoints are removed!!!
    # See Gitlab.create_project_merge_request_approval_rule
    #
    # @example
    #    Gitlab.edit_project_approvers(1, {approver_ids: [5], approver_groups: [1]})
    #
    # @param [Integer] project(required) The ID of a project.
    # @option options [Array] :approver_ids(required, nil if none) An array of User IDs that can approve MRs
    # @option options [Array] :approver_group_ids(required, nil if none) An array of Group IDs whose members can approve MRs
    # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
    def edit_project_approvers(project, options = {})
      put("/projects/#{url_encode project}/approvers", body: options)
    end

    # Get Configuration for approvals on a specific Merge Request.
    #
    # @example
    #    Gitlab.merge_request_approvals(1, 5)
    #
    # @param [Integer] project(required) The ID of a project.
    # @param [Integer] merge_request(required) The IID of a merge_request.
    # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the merge request
    def merge_request_approvals(project, merge_request)
      get("/projects/#{url_encode project}/merge_requests/#{merge_request}/approvals")
    end

    # Change configuration for approvals on a specific merge request.
    #
    # @example
    #    Gitlab.edit_merge_request_approvals(1, 5, approvals_required: 2)
    #
    # @param [Integer] project(required) The ID of a project.
    # @param [Integer] merge_request(required) The IID of a merge_request.
    # @option options [Integer] :approvals_required(required) Approvals required before MR can be merged
    # @return [Gitlab::ObjectifiedHash] Updated MR approval configuration information about the merge request
    def edit_merge_request_approvals(project, merge_request, options = {})
      post("/projects/#{url_encode project}/merge_requests/#{merge_request}/approvals", body: options)
    end

    # Change allowed approvers and approver groups for a merge request
    # @deprecated Since Gitlab 13.12 /approvers endpoints are removed!!!
    # See Gitlab.create_merge_request_level_rule
    #
    # @example
    #    Gitlab.edit_merge_request_approvers(1, 5, {approver_ids: [5], approver_groups: [1]})
    #
    # @param [Integer] project(required) The ID of a project.
    # @param [Integer] merge_request(required) The IID of a merge_request.
    # @option options [Array] :approver_ids(required, nil if none) An array of User IDs that can approve MRs
    # @option options [Array] :approver_group_ids(required, nil if none) An array of Group IDs whose members can approve MRs
    # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
    def edit_merge_request_approvers(project, merge_request, options = {})
      put("/projects/#{url_encode project}/merge_requests/#{merge_request}/approvers", body: options)
    end

    # Create merge request level rule
    #
    # @example
    #   Gitlab.create_merge_request_level_rule(1, 2, {
    #     name: "devs",
    #     approvals_required: 2,
    #     approval_project_rule_id: 99,
    #     user_ids: [3, 4],
    #     group_ids: [5, 6],
    #   })
    #
    # Important: When approval_project_rule_id is set, the name, users and groups of project-level rule are copied.
    # The approvals_required specified is used.
    #
    # @param [Integer] project(required) The ID of a project.
    # @param [Integer] merge_request(required) The IID of a merge request.
    # @option options [String] :name(required) The name of the approval rule
    # @option options [Integer] :approvals_required(required) The number of required approvals for this rule
    # @option options [Integer] :approval_project_rule_id(optional) The ID of a project-level approval rule
    # @option options [Array] :user_ids(optional) The ids of users as approvers
    # @option options [Array] :group_ids(optional) The ids of groups as approvers
    # @return [Gitlab::ObjectifiedHash] New MR level approval rule
    def create_merge_request_level_rule(project, merge_request, options = {})
      post("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules", body: options)
    end

    # Get merge request level rule
    #
    # @example
    #   Gitlab.merge_request_level_rule(1, 2)
    #
    # @param [Integer] project(required) The ID of a project.
    # @param [Integer] merge_request(required) The IID of a merge request.
    # @return [Gitlab::ObjectifiedHash] New MR level approval rule
    def merge_request_level_rule(project, merge_request)
      get("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules")
    end

    # Update merge request level rule
    #
    # @example
    #   Gitlab.update_merge_request_level_rule(1, 2, 69, {
    #     name: "devs",
    #     approvals_required: 2,
    #     user_ids: [3, 4],
    #     group_ids: [5, 6],
    #   })
    #
    # Important: Approvers and groups not in the users/groups parameters are removed
    # Important: Updating a report_approver or code_owner rule is not allowed.
    # These are system generated rules.
    #
    # @param [Integer] project(required) The ID of a project.
    # @param [Integer] merge_request(required) The IID of a merge request.
    # @param [Integer] appr_rule_id(required) The ID of a approval rule
    # @option options [String] :name(required) The name of the approval rule
    # @option options [Integer] :approvals_required(required) The number of required approvals for this rule
    # @option options [Array] :user_ids(optional) The ids of users as approvers
    # @option options [Array] :group_ids(optional) The ids of groups as approvers
    # @return [Gitlab::ObjectifiedHash] Updated MR level approval rule
    def update_merge_request_level_rule(project, merge_request, appr_rule_id, options = {})
      put("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules/#{appr_rule_id}", body: options)
    end

    # Delete merge request level rule
    #
    # @example
    #   Gitlab.delete_merge_request_level_rule(1, 2, 69)
    #
    # Important: Deleting a report_approver or code_owner rule is not allowed.
    # These are system generated rules.
    #
    # @param [Integer] project(required) The ID of a project.
    # @param [Integer] merge_request(required) The IID of a merge request.
    # @param [Integer] appr_rule_id(required) The ID of a approval rule
    # @return [void] This API call returns an empty response body
    def delete_merge_request_level_rule(project, merge_request, appr_rule_id)
      delete("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules/#{appr_rule_id}")
    end

    # Approve a merge request
    #
    # @example
    #    Gitlab.approve_merge_request(1, 5)
    #    Gitlab.approve_merge_request(1, 5, sha: 'fe678da')
    #
    # @param [Integer] project(required) The ID of a project.
    # @param [Integer] merge_request(required) The IID of a merge request.
    # @option options [String] :sha(optional) The HEAD of the MR
    # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
    def approve_merge_request(project, merge_request, options = {})
      post("/projects/#{url_encode project}/merge_requests/#{merge_request}/approve", body: options)
    end

    # Unapprove a merge request
    #
    # @example
    #    Gitlab.unapprove_merge_request(1, 5)
    #
    # @param [Integer] project(required) The ID of a project.
    # @param [Integer] merge_request(required) The IID of a merge request.
    # @option options [String] :sudo(optional) The username of the user you want to remove the approval for
    # @return [void] This API call returns an empty response body.
    def unapprove_merge_request(project, merge_request, options = {})
      post("/projects/#{url_encode project}/merge_requests/#{merge_request}/unapprove", body: options)
    end

    # Get the approval state of merge requests
    #
    # @example
    #   Gitlab.merge_request_approval_state(5, 36)
    #
    # @param  [Integer, String] project The ID or name of a project.
    # @param  [Integer] id The ID of a merge request.
    # @return [Array<Gitlab::ObjectifiedHash>]
    def merge_request_approval_state(project, id)
      get("/projects/#{url_encode project}/merge_requests/#{id}/approval_state")
    end
  end
end