summaryrefslogtreecommitdiff
path: root/app/services/merge_requests/merge_when_build_succeeds_service.rb
blob: dc159de00581d2dd9608db3794b7cc99ea1f99fe (plain)
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
module MergeRequests
  class MergeWhenBuildSucceedsService < 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