summaryrefslogtreecommitdiff
path: root/app/services/merge_requests/merge_when_pipeline_succeeds_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/merge_requests/merge_when_pipeline_succeeds_service.rb')
-rw-r--r--app/services/merge_requests/merge_when_pipeline_succeeds_service.rb45
1 files changed, 45 insertions, 0 deletions
diff --git a/app/services/merge_requests/merge_when_pipeline_succeeds_service.rb b/app/services/merge_requests/merge_when_pipeline_succeeds_service.rb
new file mode 100644
index 00000000000..5616edf8b4a
--- /dev/null
+++ b/app/services/merge_requests/merge_when_pipeline_succeeds_service.rb
@@ -0,0 +1,45 @@
+module MergeRequests
+ class MergeWhenPipelineSucceedsService < MergeRequests::BaseService
+ # Marks the passed `merge_request` to be merged when the build succeeds or
+ # updates the params for the automatic merge
+ def execute(merge_request)
+ merge_request.merge_params.merge!(params)
+
+ # The service is also called when the merge params are updated.
+ already_approved = merge_request.merge_when_build_succeeds?
+
+ unless already_approved
+ merge_request.merge_when_build_succeeds = true
+ merge_request.merge_user = @current_user
+
+ SystemNoteService.merge_when_build_succeeds(merge_request, @project, @current_user, merge_request.diff_head_commit)
+ end
+
+ merge_request.save
+ end
+
+ # Triggers the automatic merge of merge_request once the pipeline succeeds
+ def trigger(pipeline)
+ return unless pipeline.success?
+
+ pipeline_merge_requests(pipeline) do |merge_request|
+ next unless merge_request.merge_when_build_succeeds?
+ next unless merge_request.mergeable?
+
+ MergeWorker.perform_async(merge_request.id, merge_request.merge_user_id, merge_request.merge_params)
+ end
+ end
+
+ # Cancels the automatic merge
+ def cancel(merge_request)
+ if merge_request.merge_when_build_succeeds? && merge_request.open?
+ merge_request.reset_merge_when_build_succeeds
+ SystemNoteService.cancel_merge_when_build_succeeds(merge_request, @project, @current_user)
+
+ success
+ else
+ error("Can't cancel the automatic merge", 406)
+ end
+ end
+ end
+end