fs-gitlab 4.18.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +270 -0
  3. data/LICENSE.txt +24 -0
  4. data/README.md +260 -0
  5. data/exe/gitlab +11 -0
  6. data/lib/gitlab/api.rb +24 -0
  7. data/lib/gitlab/cli.rb +89 -0
  8. data/lib/gitlab/cli_helpers.rb +243 -0
  9. data/lib/gitlab/client/access_requests.rb +103 -0
  10. data/lib/gitlab/client/application_settings.rb +172 -0
  11. data/lib/gitlab/client/avatar.rb +21 -0
  12. data/lib/gitlab/client/award_emojis.rb +137 -0
  13. data/lib/gitlab/client/boards.rb +146 -0
  14. data/lib/gitlab/client/branches.rb +135 -0
  15. data/lib/gitlab/client/broadcast_messages.rb +75 -0
  16. data/lib/gitlab/client/build_variables.rb +135 -0
  17. data/lib/gitlab/client/builds.rb +108 -0
  18. data/lib/gitlab/client/commits.rb +216 -0
  19. data/lib/gitlab/client/container_registry.rb +85 -0
  20. data/lib/gitlab/client/deployments.rb +34 -0
  21. data/lib/gitlab/client/environments.rb +89 -0
  22. data/lib/gitlab/client/epic_issues.rb +23 -0
  23. data/lib/gitlab/client/epics.rb +73 -0
  24. data/lib/gitlab/client/events.rb +60 -0
  25. data/lib/gitlab/client/features.rb +48 -0
  26. data/lib/gitlab/client/group_badges.rb +88 -0
  27. data/lib/gitlab/client/group_boards.rb +141 -0
  28. data/lib/gitlab/client/group_labels.rb +88 -0
  29. data/lib/gitlab/client/group_milestones.rb +94 -0
  30. data/lib/gitlab/client/groups.rb +358 -0
  31. data/lib/gitlab/client/issue_links.rb +48 -0
  32. data/lib/gitlab/client/issues.rb +231 -0
  33. data/lib/gitlab/client/jobs.rb +250 -0
  34. data/lib/gitlab/client/keys.rb +29 -0
  35. data/lib/gitlab/client/labels.rb +88 -0
  36. data/lib/gitlab/client/lint.rb +19 -0
  37. data/lib/gitlab/client/markdown.rb +23 -0
  38. data/lib/gitlab/client/merge_request_approvals.rb +265 -0
  39. data/lib/gitlab/client/merge_requests.rb +386 -0
  40. data/lib/gitlab/client/milestones.rb +106 -0
  41. data/lib/gitlab/client/namespaces.rb +22 -0
  42. data/lib/gitlab/client/notes.rb +313 -0
  43. data/lib/gitlab/client/packages.rb +95 -0
  44. data/lib/gitlab/client/pipeline_schedules.rb +147 -0
  45. data/lib/gitlab/client/pipeline_triggers.rb +103 -0
  46. data/lib/gitlab/client/pipelines.rb +105 -0
  47. data/lib/gitlab/client/project_badges.rb +85 -0
  48. data/lib/gitlab/client/project_clusters.rb +83 -0
  49. data/lib/gitlab/client/project_release_links.rb +76 -0
  50. data/lib/gitlab/client/project_releases.rb +79 -0
  51. data/lib/gitlab/client/projects.rb +708 -0
  52. data/lib/gitlab/client/protected_tags.rb +59 -0
  53. data/lib/gitlab/client/remote_mirrors.rb +51 -0
  54. data/lib/gitlab/client/repositories.rb +113 -0
  55. data/lib/gitlab/client/repository_files.rb +131 -0
  56. data/lib/gitlab/client/repository_submodules.rb +27 -0
  57. data/lib/gitlab/client/resource_label_events.rb +82 -0
  58. data/lib/gitlab/client/resource_state_events.rb +57 -0
  59. data/lib/gitlab/client/runners.rb +211 -0
  60. data/lib/gitlab/client/search.rb +66 -0
  61. data/lib/gitlab/client/services.rb +53 -0
  62. data/lib/gitlab/client/sidekiq.rb +39 -0
  63. data/lib/gitlab/client/snippets.rb +95 -0
  64. data/lib/gitlab/client/system_hooks.rb +64 -0
  65. data/lib/gitlab/client/tags.rb +97 -0
  66. data/lib/gitlab/client/templates.rb +100 -0
  67. data/lib/gitlab/client/todos.rb +46 -0
  68. data/lib/gitlab/client/user_snippets.rb +114 -0
  69. data/lib/gitlab/client/users.rb +397 -0
  70. data/lib/gitlab/client/versions.rb +18 -0
  71. data/lib/gitlab/client/wikis.rb +79 -0
  72. data/lib/gitlab/client.rb +95 -0
  73. data/lib/gitlab/configuration.rb +57 -0
  74. data/lib/gitlab/error.rb +170 -0
  75. data/lib/gitlab/file_response.rb +48 -0
  76. data/lib/gitlab/help.rb +94 -0
  77. data/lib/gitlab/objectified_hash.rb +51 -0
  78. data/lib/gitlab/page_links.rb +35 -0
  79. data/lib/gitlab/paginated_response.rb +110 -0
  80. data/lib/gitlab/request.rb +109 -0
  81. data/lib/gitlab/shell.rb +83 -0
  82. data/lib/gitlab/shell_history.rb +57 -0
  83. data/lib/gitlab/version.rb +5 -0
  84. data/lib/gitlab.rb +56 -0
  85. metadata +204 -0
@@ -0,0 +1,250 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Gitlab::Client
4
+ # Defines methods related to projects.
5
+ # @see https://docs.gitlab.com/ee/api/jobs.html
6
+ module Jobs
7
+ # Gets a list of Jobs for a Project
8
+ #
9
+ # @example
10
+ # Gitlab.jobs(1)
11
+ # Gitlab.jobs("project")
12
+ # Gitlab.jobs("project", {scope: ["manual", "success"], per_page: 100 })
13
+ #
14
+ # @param [Integer, String] id The ID or name of a project.
15
+ # @param [Hash] options A customizable set of options.
16
+ # @option options [Array] :scope The scope of jobs to show, one or array of: created, pending, running, failed, success, canceled, skipped, manual; showing all jobs if none provided.
17
+ # @option options [Integer] :page The page number.
18
+ # @option options [Integer] :per_page The number of results per page.
19
+ # @return [Array<Gitlab::ObjectifiedHash>]
20
+ def jobs(project_id, options = {})
21
+ get("/projects/#{url_encode project_id}/jobs", query: options)
22
+ end
23
+
24
+ # Gets a list of Jobs from a pipeline
25
+ #
26
+ # @example
27
+ # Gitlab.pipeline_jobs(1, 2)
28
+ # Gitlab.pipeline_jobs("project", 2)
29
+ #
30
+ # @param [Integer, String] The ID or name of a project.
31
+ # @param [Integer] the id of the pipeline
32
+ # @param [Hash] options A customizable set of options.
33
+ # @option options [Array] :scope The scope of jobs to show, one or array of: created, pending, running, failed, success, canceled, skipped, manual; showing all jobs if none provided.
34
+ # @return [Array<Gitlab::ObjectifiedHash>]
35
+ def pipeline_jobs(project_id, pipeline_id, options = {})
36
+ get("/projects/#{url_encode project_id}/pipelines/#{pipeline_id}/jobs", query: options)
37
+ end
38
+
39
+ # Gets a list of Bridge Jobs from a pipeline
40
+ #
41
+ # @example
42
+ # Gitlab.pipeline_bridges(1, 2)
43
+ # Gitlab.pipeline_bridges("project", 2)
44
+ #
45
+ # @param [Integer, String] The ID or name of a project.
46
+ # @param [Integer] the id of the pipeline
47
+ # @param [Hash] options A customizable set of options.
48
+ # @option options [Array] :scope The scope of bridge jobs to show, one or array of: created, pending, running, failed, success, canceled, skipped, manual; showing all bridge jobs if none provided.
49
+ # @return [Array<Gitlab::ObjectifiedHash>]
50
+ def pipeline_bridges(project_id, pipeline_id, options = {})
51
+ get("/projects/#{url_encode project_id}/pipelines/#{pipeline_id}/bridges", query: options)
52
+ end
53
+
54
+ # Gets a single job
55
+ #
56
+ # @example
57
+ # Gitlab.job(1, 2)
58
+ # Gitlab.job("project", 2)
59
+ #
60
+ # @param [Integer, String] The ID or name of a project.
61
+ # @param [Integer] the id of the job
62
+ def job(project_id, job_id)
63
+ get("/projects/#{url_encode project_id}/jobs/#{job_id}")
64
+ end
65
+
66
+ # Gets artifacts from a job
67
+ #
68
+ # @example
69
+ # Gitlab.job_artifacts(1, 2)
70
+ # Gitlab.job_artifacts("project", 2)
71
+ #
72
+ # @param [Integer, String] The ID or name of a project.
73
+ # @param [Integer] the id of the job
74
+ # @return [Array<Gitlab::ObjectifiedHash>]
75
+ def job_artifacts(project_id, job_id)
76
+ get("/projects/#{url_encode project_id}/jobs/#{job_id}/artifacts",
77
+ format: nil,
78
+ headers: { Accept: 'text/plain' },
79
+ parser: ::Gitlab::Request::Parser)
80
+ end
81
+
82
+ # Download Job Artifact
83
+ #
84
+ # @example
85
+ # Gitlab.job_artifacts_download(1, "master", "release")
86
+ # Gitlab.job_artifacts_download("project", "master", "release")
87
+ #
88
+ # @param [Integer, String] project_id The ID or name of a project.
89
+ # @param [String] ref Ref Name
90
+ # @param [String] job jobname
91
+ # @return [Gitlab::FileResponse]
92
+ def job_artifacts_download(project_id, ref_name, job_name)
93
+ get("/projects/#{url_encode project_id}/jobs/artifacts/#{ref_name}/download",
94
+ query: { job: job_name },
95
+ format: nil,
96
+ headers: { Accept: 'application/octet-stream' },
97
+ parser: proc { |body, _|
98
+ if body.encoding == Encoding::ASCII_8BIT # binary response
99
+ ::Gitlab::FileResponse.new StringIO.new(body, 'rb+')
100
+ else # error with json response
101
+ ::Gitlab::Request.parse(body)
102
+ end
103
+ })
104
+ end
105
+
106
+ # Download a single artifact file by job ID
107
+ #
108
+ # @example
109
+ # Gitlab.download_job_artifact_file(1, 5, "some/release/file.pdf")
110
+ #
111
+ # @param [Integer, String] project_id(required) The ID or name of a project.
112
+ # @param [String] job_id(required) The unique job identifier.
113
+ # @param [String] artifact_path(required) Path to a file inside the artifacts archive.
114
+ # @return [Gitlab::FileResponse]
115
+ def download_job_artifact_file(project_id, job_id, artifact_path)
116
+ get("/projects/#{url_encode project_id}/jobs/#{job_id}/artifacts/#{artifact_path}",
117
+ format: nil,
118
+ headers: { Accept: 'application/octet-stream' },
119
+ parser: proc { |body, _|
120
+ if body.encoding == Encoding::ASCII_8BIT # binary response
121
+ ::Gitlab::FileResponse.new StringIO.new(body, 'rb+')
122
+ else # error with json response
123
+ ::Gitlab::Request.parse(body)
124
+ end
125
+ })
126
+ end
127
+
128
+ # Download a single artifact file from specific tag or branch
129
+ #
130
+ # @example
131
+ # Gitlab.download_branch_artifact_file(1, "master", "some/release/file.pdf", 'pdf')
132
+ #
133
+ # @param [Integer, String] project_id(required) The ID or name of a project.
134
+ # @param [String] ref_name(required) Branch or tag name in repository. HEAD or SHA references are not supported.
135
+ # @param [String] artifact_path(required) Path to a file inside the artifacts archive.
136
+ # @param [String] job(required) The name of the job.
137
+ # @return [Gitlab::FileResponse]
138
+ def download_branch_artifact_file(project_id, ref_name, artifact_path, job)
139
+ get("/projects/#{url_encode project_id}/jobs/artifacts/#{ref_name}/raw/#{artifact_path}",
140
+ query: { job: job },
141
+ format: nil,
142
+ headers: { Accept: 'application/octet-stream' },
143
+ parser: proc { |body, _|
144
+ if body.encoding == Encoding::ASCII_8BIT # binary response
145
+ ::Gitlab::FileResponse.new StringIO.new(body, 'rb+')
146
+ else # error with json response
147
+ ::Gitlab::Request.parse(body)
148
+ end
149
+ })
150
+ end
151
+ alias download_tag_artifact_file download_branch_artifact_file
152
+
153
+ # Get Job Trace
154
+ #
155
+ # @example
156
+ # Gitlab.job_trace(1,1)
157
+ # Gitlab.job_trace("project", 1)
158
+ #
159
+ # @param [Integer, String] The ID or name of a project.
160
+ # @param [Integer] the id of the job
161
+ # @return [Array<Gitlab::ObjectifiedHash>]
162
+ def job_trace(project_id, job_id)
163
+ get("/projects/#{url_encode project_id}/jobs/#{job_id}/trace",
164
+ format: nil,
165
+ headers: { Accept: 'text/plain' },
166
+ parser: ::Gitlab::Request::Parser)
167
+ end
168
+
169
+ # Cancel a job
170
+ #
171
+ # @example
172
+ # Gitlab.job_cancel(1,1)
173
+ # Gitlab.job_cancel("project", 1)
174
+ #
175
+ # @param [Integer, String] The ID or name of a project.
176
+ # @param [Integer] the id of the job
177
+ # @return [Array<Gitlab::ObjectifiedHash>]
178
+ def job_cancel(project_id, job_id)
179
+ post("/projects/#{url_encode project_id}/jobs/#{job_id}/cancel")
180
+ end
181
+
182
+ # Retry a job
183
+ #
184
+ # @example
185
+ # Gitlab.job_retry(1,1)
186
+ # Gitlab.job_retry("project", 1)
187
+ #
188
+ # @param [Integer, String] The ID or name of a project.
189
+ # @param [Integer] the id of the job
190
+ # @return [Array<Gitlab::ObjectifiedHash>]
191
+ def job_retry(project_id, job_id)
192
+ post("/projects/#{url_encode project_id}/jobs/#{job_id}/retry")
193
+ end
194
+
195
+ # Erase Job
196
+ #
197
+ # @example
198
+ # Gitlab.job_erase(1,1)
199
+ # Gitlab.job_erase("project", 1)
200
+ #
201
+ # @param [Integer, String] The ID or name of a project.
202
+ # @param [Integer] the id of the job
203
+ # @return [Array<Gitlab::ObjectifiedHash>]
204
+ def job_erase(project_id, job_id)
205
+ post("/projects/#{url_encode project_id}/jobs/#{job_id}/erase")
206
+ end
207
+
208
+ # Play a Job
209
+ # Triggers a manual action to start a job.
210
+ #
211
+ # @example
212
+ # Gitlab.job_play(1,1)
213
+ # Gitlab.job_play("project", 1)
214
+ #
215
+ # @param [Integer, String] The ID or name of a project.
216
+ # @param [Integer] the id of the job
217
+ # @return [Array<Gitlab::ObjectifiedHash>]
218
+ def job_play(project_id, job_id)
219
+ post("/projects/#{url_encode project_id}/jobs/#{job_id}/play")
220
+ end
221
+
222
+ # Keep Artifacts
223
+ # Prevents artifacts from being deleted when expiration is set.
224
+ #
225
+ # @example
226
+ # Gitlab.job_artifacts_keep(1,1)
227
+ # Gitlab.job_artifacts_keep("project", 1)
228
+ #
229
+ # @param [Integer, String] The ID or name of a project.
230
+ # @param [Integer] the id of the job
231
+ # @return [Array<Gitlab::ObjectifiedHash>]
232
+ def job_artifacts_keep(project_id, job_id)
233
+ post("/projects/#{url_encode project_id}/jobs/#{job_id}/artifacts/keep")
234
+ end
235
+
236
+ # Delete Artifacts
237
+ # Deletes the artifacts associated with a job.
238
+ #
239
+ # @example
240
+ # Gitlab.job_artifacts_delete(1,1)
241
+ # Gitlab.job_artifacts_delete("project", 1)
242
+ #
243
+ # @param [Integer, String] The ID or name of a project.
244
+ # @param [Integer] the id of the job
245
+ # @return [Array<Gitlab::ObjectifiedHash>]
246
+ def job_artifacts_delete(project_id, job_id)
247
+ delete("/projects/#{url_encode project_id}/jobs/#{job_id}/artifacts")
248
+ end
249
+ end
250
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Gitlab::Client
4
+ # Defines methods related to keys.
5
+ # @see https://docs.gitlab.com/ce/api/keys.html
6
+ module Keys
7
+ # Gets information about a key.
8
+ #
9
+ # @example
10
+ # Gitlab.key(1)
11
+ #
12
+ # @param [Integer] id The ID of a key.
13
+ # @return [Gitlab::ObjectifiedHash]
14
+ def key(id)
15
+ get("/keys/#{id}")
16
+ end
17
+
18
+ # Gets information about a key by key fingerprint.
19
+ #
20
+ # @example
21
+ # Gitlab.key_by_fingerprint("9f:70:33:b3:50:4d:9a:a3:ef:ea:13:9b:87:0f:7f:7e")
22
+ #
23
+ # @param [String] fingerprint The Fingerprint of a key.
24
+ # @return [Gitlab::ObjectifiedHash]
25
+ def key_by_fingerprint(fingerprint)
26
+ get('/keys', query: { fingerprint: fingerprint })
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Gitlab::Client
4
+ # Defines methods related to project labels.
5
+ # @see https://docs.gitlab.com/ce/api/labels.html
6
+ module Labels
7
+ # Gets a list of project's labels.
8
+ #
9
+ # @example
10
+ # Gitlab.labels(5)
11
+ #
12
+ # @param [Integer, String] project The ID or name of a project.
13
+ # @return [Array<Gitlab::ObjectifiedHash>]
14
+ def labels(project, options = {})
15
+ get("/projects/#{url_encode project}/labels", query: options)
16
+ end
17
+
18
+ # Creates a new label.
19
+ #
20
+ # @example
21
+ # Gitlab.create_label(42, "Backlog", '#DD10AA')
22
+ #
23
+ # @param [Integer, String] project The ID or name of a project.
24
+ # @param [String] name The name of a label.
25
+ # @param [String] color The color of a label.
26
+ # @param [Hash] options A customizable set of options.
27
+ # @option options [String] :description The description of the label.
28
+ # @option options [String] :priority The priority of the label. Must be greater or equal than zero or null to remove the priority.
29
+ # @return [Gitlab::ObjectifiedHash] Information about created label.
30
+ def create_label(project, name, color, options = {})
31
+ post("/projects/#{url_encode project}/labels", body: options.merge(name: name, color: color))
32
+ end
33
+
34
+ # Updates a label.
35
+ #
36
+ # @example
37
+ # Gitlab.edit_label(42, "Backlog", { new_name: 'TODO' })
38
+ # Gitlab.edit_label(42, "Backlog", { new_name: 'TODO', color: '#DD10AA' })
39
+ #
40
+ # @param [Integer, String] project The ID or name of a project.
41
+ # @param [String] name The name of a label.
42
+ # @param [Hash] options A customizable set of options.
43
+ # @option options [String] :new_name The new name of a label.
44
+ # @option options [String] :color The color of a label.
45
+ # @option options [String] :description The description of the label.
46
+ # @option options [String] :priority The priority of the label. Must be greater or equal than zero or null to remove the priority.
47
+ # @return [Gitlab::ObjectifiedHash] Information about updated label.
48
+ def edit_label(project, name, options = {})
49
+ put("/projects/#{url_encode project}/labels", body: options.merge(name: name))
50
+ end
51
+
52
+ # Deletes a label.
53
+ #
54
+ # @example
55
+ # Gitlab.delete_label(2, 'Backlog')
56
+ #
57
+ # @param [Integer, String] project The ID or name of a project.
58
+ # @param [String] name The name of a label.
59
+ # @return [Gitlab::ObjectifiedHash] Information about deleted label.
60
+ def delete_label(project, name)
61
+ delete("/projects/#{url_encode project}/labels/#{name}")
62
+ end
63
+
64
+ # Subscribes the user to a label to receive notifications
65
+ #
66
+ # @example
67
+ # Gitlab.subscribe_to_label(2, 'Backlog')
68
+ #
69
+ # @param [Integer, String] project The ID or name of a project.
70
+ # @param [String] name The name of a label.
71
+ # @return [Gitlab::ObjectifiedHash] Information about the label subscribed to.
72
+ def subscribe_to_label(project, name)
73
+ post("/projects/#{url_encode project}/labels/#{url_encode name}/subscribe")
74
+ end
75
+
76
+ # Unsubscribes the user from a label to not receive notifications from it
77
+ #
78
+ # @example
79
+ # Gitlab.unsubscribe_from_label(2, 'Backlog')
80
+ #
81
+ # @param [Integer, String] project The ID or name of a project.
82
+ # @param [String] name The name of a label.
83
+ # @return [Gitlab::ObjectifiedHash] Information about the label unsubscribed from.
84
+ def unsubscribe_from_label(project, name)
85
+ post("/projects/#{url_encode project}/labels/#{url_encode name}/unsubscribe")
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Gitlab::Client
4
+ # Defines methods related to lint/validations.
5
+ # @see https://docs.gitlab.com/ce/api/lint.html
6
+ module Lint
7
+ # Checks if your .gitlab-ci.yml file is valid.
8
+ #
9
+ # @example
10
+ # Gitlab.validate_gitlab_ci_yml("{ \"image\": \"ruby:2.6\", \"services\": [\"postgres\"], \"before_script\": [\"bundle install\", \"bundle exec rake db:create\"], \"variables\": {\"DB_NAME\": \"postgres\"}, \"types\": [\"test\", \"deploy\", \"notify\"], \"rspec\": { \"script\": \"rake spec\", \"tags\": [\"ruby\", \"postgres\"], \"only\": [\"branches\"]}}")
11
+ #
12
+ # @param [String] content the .gitlab-ci.yaml content.
13
+ # @return <Gitlab::ObjectifiedHash> Returns information about validity of the yml.
14
+ def validate_gitlab_ci_yml(content)
15
+ body = { content: content }
16
+ post('/lint', body: body)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Gitlab::Client
4
+ # Defines methods related to markdown.
5
+ # @see https://docs.gitlab.com/ce/api/markdown.html
6
+ module Markdown
7
+ # Render an arbitrary Markdown document
8
+ #
9
+ # @example
10
+ # Gitlab.markdown('Hello world! :tada:')
11
+ # Gitlab.markdown('Hello world! :tada:', gfm: true, project: 'group_example/project_example')
12
+ #
13
+ # @param [String] text The markdown text to render.
14
+ # @param [Hash] options A customizable set of options.
15
+ # @option options [Boolean] :gfm(optional) Render text using GitLab Flavored Markdown. Default is false.
16
+ # @option options [String] :project(optional) Use project as a context when creating references using GitLab Flavored Markdown. Authentication is required if a project is not public.
17
+ # @return <Gitlab::ObjectifiedHash> Returns the rendered markdown as response
18
+ def markdown(text, options = {})
19
+ body = { text: text }.merge(options)
20
+ post('/markdown', body: body)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,265 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Gitlab::Client
4
+ # Defines methods related to MR Approvals.
5
+ # @see https://docs.gitlab.com/ee/api/merge_request_approvals.html
6
+ module MergeRequestApprovals
7
+ # Gets MR Approval Configuration for a project
8
+ #
9
+ # @example
10
+ # Gitlab.project_merge_request_approvals(1)
11
+ #
12
+ # @param [Integer] project The ID of a project.
13
+ # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
14
+ def project_merge_request_approvals(project)
15
+ get("/projects/#{url_encode project}/approvals")
16
+ end
17
+
18
+ # Change MR Approval Configuration for a project
19
+ #
20
+ # @example
21
+ # Gitlab.edit_project_merge_request_approvals(1, {approvals_before_merge: 3})
22
+ # Gitlab.edit_project_merge_request_approvals(1, {approvals_before_merge: 3, reset_approvals_on_push: true})
23
+ # Gitlab.edit_project_merge_request_approvals(1, {approvals_before_merge: 3, disable_overriding_approvers_per_merge_request: false})
24
+ #
25
+ # @param [Integer] project(required) The ID of a project.
26
+ # @option options [Integer] :approvals_before_merge(optional) How many approvals are required before an MR can be merged
27
+ # @option options [Boolean] :reset_approvals_on_push(optional) Reset approvals on a new push
28
+ # @option options [Boolean] :disable_overriding_approvers_per_merge_request(optional) Allow/Disallow overriding approvers per MR
29
+ # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
30
+ def edit_project_merge_request_approvals(project, options = {})
31
+ post("/projects/#{url_encode project}/approvals", body: options)
32
+ end
33
+
34
+ # Gets MR Approval Rules for a project
35
+ #
36
+ # @example
37
+ # Gitlab.project_merge_request_approval_rules(1)
38
+ #
39
+ # @param [Integer] project The ID of a project.
40
+ # @return [Gitlab::ObjectifiedHash] MR approval rules for the project
41
+ def project_merge_request_approval_rules(project)
42
+ get("/projects/#{url_encode project}/approval_rules")
43
+ end
44
+
45
+ # Create MR Approval Rule for a project
46
+ #
47
+ # @example
48
+ # Gitlab.create_project_merge_request_approval_rule(1, {name: "security", approvals_required: 1})
49
+ #
50
+ # @param [Integer] project(required) The ID of a project.
51
+ # @option options [String] :name(required) The name of the approval rule
52
+ # @option options [Integer] :approvals_required(required) The number of required approvals for this rule
53
+ # @option options [Array] :user_ids(optional) The ids of users as approvers
54
+ # @option options [Array] :group_ids(optional) The ids of groups as approvers
55
+ # @option options [Array] :protected_branch_ids(optional) The ids of protected branches to scope the rule by
56
+ # @return [Gitlab::ObjectifiedHash] New MR approval rule
57
+ def create_project_merge_request_approval_rule(project, options = {})
58
+ post("/projects/#{url_encode project}/approval_rules", body: options)
59
+ end
60
+
61
+ # Update MR Approval Rule for a project
62
+ #
63
+ # @example
64
+ # Gitlab.update_project_merge_request_approval_rule(1, {name: "security", approvals_required: 2})
65
+ #
66
+ # @param [Integer] project(required) The ID of a project.
67
+ # @param [Integer] approval_rule_id(required) The ID of a project Approval Rule
68
+ # @option options [String] :name(required) The name of the approval rule
69
+ # @option options [Integer] :approvals_required(required) The number of required approvals for this rule
70
+ # @option options [Array] :user_ids(optional) The ids of users as approvers
71
+ # @option options [Array] :group_ids(optional) The ids of groups as approvers
72
+ # @option options [Array] :protected_branch_ids(optional) The ids of protected branches to scope the rule by
73
+ # @return [Gitlab::ObjectifiedHash] Updated MR approval rule
74
+ def update_project_merge_request_approval_rule(project, approval_rule_id, options = {})
75
+ put("/projects/#{url_encode project}/approval_rules/#{approval_rule_id}", body: options)
76
+ end
77
+
78
+ # Delete MR Approval Rule for a project
79
+ #
80
+ # @example
81
+ # Gitlab.delete_project_merge_request_approval_rule(1, 1)
82
+ #
83
+ # @param [Integer] project(required) The ID of a project.
84
+ # @param [Integer] approval_rule_id(required) The ID of a approval rule
85
+ # @return [void] This API call returns an empty response body
86
+ def delete_project_merge_request_approval_rule(project, approval_rule_id)
87
+ delete("/projects/#{url_encode project}/approval_rules/#{approval_rule_id}")
88
+ end
89
+
90
+ # Change allowed approvers and approver groups for a project
91
+ # @deprecated Since Gitlab 13.12 /approvers endpoints are removed!!!
92
+ # See Gitlab.create_project_merge_request_approval_rule
93
+ #
94
+ # @example
95
+ # Gitlab.edit_project_approvers(1, {approver_ids: [5], approver_groups: [1]})
96
+ #
97
+ # @param [Integer] project(required) The ID of a project.
98
+ # @option options [Array] :approver_ids(required, nil if none) An array of User IDs that can approve MRs
99
+ # @option options [Array] :approver_group_ids(required, nil if none) An array of Group IDs whose members can approve MRs
100
+ # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
101
+ def edit_project_approvers(project, options = {})
102
+ put("/projects/#{url_encode project}/approvers", body: options)
103
+ end
104
+
105
+ # Get Configuration for approvals on a specific Merge Request.
106
+ #
107
+ # @example
108
+ # Gitlab.merge_request_approvals(1, 5)
109
+ #
110
+ # @param [Integer] project(required) The ID of a project.
111
+ # @param [Integer] merge_request(required) The IID of a merge_request.
112
+ # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the merge request
113
+ def merge_request_approvals(project, merge_request)
114
+ get("/projects/#{url_encode project}/merge_requests/#{merge_request}/approvals")
115
+ end
116
+
117
+ # Change configuration for approvals on a specific merge request.
118
+ #
119
+ # @example
120
+ # Gitlab.edit_merge_request_approvals(1, 5, approvals_required: 2)
121
+ #
122
+ # @param [Integer] project(required) The ID of a project.
123
+ # @param [Integer] merge_request(required) The IID of a merge_request.
124
+ # @option options [Integer] :approvals_required(required) Approvals required before MR can be merged
125
+ # @return [Gitlab::ObjectifiedHash] Updated MR approval configuration information about the merge request
126
+ def edit_merge_request_approvals(project, merge_request, options = {})
127
+ post("/projects/#{url_encode project}/merge_requests/#{merge_request}/approvals", body: options)
128
+ end
129
+
130
+ # Change allowed approvers and approver groups for a merge request
131
+ # @deprecated Since Gitlab 13.12 /approvers endpoints are removed!!!
132
+ # See Gitlab.create_merge_request_level_rule
133
+ #
134
+ # @example
135
+ # Gitlab.edit_merge_request_approvers(1, 5, {approver_ids: [5], approver_groups: [1]})
136
+ #
137
+ # @param [Integer] project(required) The ID of a project.
138
+ # @param [Integer] merge_request(required) The IID of a merge_request.
139
+ # @option options [Array] :approver_ids(required, nil if none) An array of User IDs that can approve MRs
140
+ # @option options [Array] :approver_group_ids(required, nil if none) An array of Group IDs whose members can approve MRs
141
+ # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
142
+ def edit_merge_request_approvers(project, merge_request, options = {})
143
+ put("/projects/#{url_encode project}/merge_requests/#{merge_request}/approvers", body: options)
144
+ end
145
+
146
+ # Create merge request level rule
147
+ #
148
+ # @example
149
+ # Gitlab.create_merge_request_level_rule(1, 2, {
150
+ # name: "devs",
151
+ # approvals_required: 2,
152
+ # approval_project_rule_id: 99,
153
+ # user_ids: [3, 4],
154
+ # group_ids: [5, 6],
155
+ # })
156
+ #
157
+ # Important: When approval_project_rule_id is set, the name, users and groups of project-level rule are copied.
158
+ # The approvals_required specified is used.
159
+ #
160
+ # @param [Integer] project(required) The ID of a project.
161
+ # @param [Integer] merge_request(required) The IID of a merge request.
162
+ # @option options [String] :name(required) The name of the approval rule
163
+ # @option options [Integer] :approvals_required(required) The number of required approvals for this rule
164
+ # @option options [Integer] :approval_project_rule_id(optional) The ID of a project-level approval rule
165
+ # @option options [Array] :user_ids(optional) The ids of users as approvers
166
+ # @option options [Array] :group_ids(optional) The ids of groups as approvers
167
+ # @return [Gitlab::ObjectifiedHash] New MR level approval rule
168
+ def create_merge_request_level_rule(project, merge_request, options = {})
169
+ post("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules", body: options)
170
+ end
171
+
172
+ # Get merge request level rule
173
+ #
174
+ # @example
175
+ # Gitlab.merge_request_level_rule(1, 2)
176
+ #
177
+ # @param [Integer] project(required) The ID of a project.
178
+ # @param [Integer] merge_request(required) The IID of a merge request.
179
+ # @return [Gitlab::ObjectifiedHash] New MR level approval rule
180
+ def merge_request_level_rule(project, merge_request)
181
+ get("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules")
182
+ end
183
+
184
+ # Update merge request level rule
185
+ #
186
+ # @example
187
+ # Gitlab.update_merge_request_level_rule(1, 2, 69, {
188
+ # name: "devs",
189
+ # approvals_required: 2,
190
+ # user_ids: [3, 4],
191
+ # group_ids: [5, 6],
192
+ # })
193
+ #
194
+ # Important: Approvers and groups not in the users/groups parameters are removed
195
+ # Important: Updating a report_approver or code_owner rule is not allowed.
196
+ # These are system generated rules.
197
+ #
198
+ # @param [Integer] project(required) The ID of a project.
199
+ # @param [Integer] merge_request(required) The IID of a merge request.
200
+ # @param [Integer] appr_rule_id(required) The ID of a approval rule
201
+ # @option options [String] :name(required) The name of the approval rule
202
+ # @option options [Integer] :approvals_required(required) The number of required approvals for this rule
203
+ # @option options [Array] :user_ids(optional) The ids of users as approvers
204
+ # @option options [Array] :group_ids(optional) The ids of groups as approvers
205
+ # @return [Gitlab::ObjectifiedHash] Updated MR level approval rule
206
+ def update_merge_request_level_rule(project, merge_request, appr_rule_id, options = {})
207
+ put("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules/#{appr_rule_id}", body: options)
208
+ end
209
+
210
+ # Delete merge request level rule
211
+ #
212
+ # @example
213
+ # Gitlab.delete_merge_request_level_rule(1, 2, 69)
214
+ #
215
+ # Important: Deleting a report_approver or code_owner rule is not allowed.
216
+ # These are system generated rules.
217
+ #
218
+ # @param [Integer] project(required) The ID of a project.
219
+ # @param [Integer] merge_request(required) The IID of a merge request.
220
+ # @param [Integer] appr_rule_id(required) The ID of a approval rule
221
+ # @return [void] This API call returns an empty response body
222
+ def delete_merge_request_level_rule(project, merge_request, appr_rule_id)
223
+ delete("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules/#{appr_rule_id}")
224
+ end
225
+
226
+ # Approve a merge request
227
+ #
228
+ # @example
229
+ # Gitlab.approve_merge_request(1, 5)
230
+ # Gitlab.approve_merge_request(1, 5, sha: 'fe678da')
231
+ #
232
+ # @param [Integer] project(required) The ID of a project.
233
+ # @param [Integer] merge_request(required) The IID of a merge request.
234
+ # @option options [String] :sha(optional) The HEAD of the MR
235
+ # @return [Gitlab::ObjectifiedHash] MR approval configuration information about the project
236
+ def approve_merge_request(project, merge_request, options = {})
237
+ post("/projects/#{url_encode project}/merge_requests/#{merge_request}/approve", body: options)
238
+ end
239
+
240
+ # Unapprove a merge request
241
+ #
242
+ # @example
243
+ # Gitlab.unapprove_merge_request(1, 5)
244
+ #
245
+ # @param [Integer] project(required) The ID of a project.
246
+ # @param [Integer] merge_request(required) The IID of a merge request.
247
+ # @option options [String] :sudo(optional) The username of the user you want to remove the approval for
248
+ # @return [void] This API call returns an empty response body.
249
+ def unapprove_merge_request(project, merge_request, options = {})
250
+ post("/projects/#{url_encode project}/merge_requests/#{merge_request}/unapprove", body: options)
251
+ end
252
+
253
+ # Get the approval state of merge requests
254
+ #
255
+ # @example
256
+ # Gitlab.merge_request_approval_state(5, 36)
257
+ #
258
+ # @param [Integer, String] project The ID or name of a project.
259
+ # @param [Integer] id The ID of a merge request.
260
+ # @return [Array<Gitlab::ObjectifiedHash>]
261
+ def merge_request_approval_state(project, id)
262
+ get("/projects/#{url_encode project}/merge_requests/#{id}/approval_state")
263
+ end
264
+ end
265
+ end