diff options
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.rb | 45 |
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 |