summaryrefslogtreecommitdiff
path: root/app/services/merge_requests/merge_orchestration_service.rb
blob: 24341ef114500245e3cdf32c26be80007906c3f6 (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
# frozen_string_literal: true

module MergeRequests
  class MergeOrchestrationService < ::BaseService
    def execute(merge_request)
      return unless can_merge?(merge_request)

      merge_request.update(merge_error: nil)

      if can_merge_automatically?(merge_request)
        auto_merge_service.execute(merge_request)
      else
        merge_request.merge_async(current_user.id, params)
      end
    end

    def can_merge?(merge_request)
      can_merge_automatically?(merge_request) || can_merge_immediately?(merge_request)
    end

    def preferred_auto_merge_strategy(merge_request)
      auto_merge_service.preferred_strategy(merge_request)
    end

    private

    def can_merge_immediately?(merge_request)
      merge_request.can_be_merged_by?(current_user) &&
        merge_request.mergeable_state?
    end

    def can_merge_automatically?(merge_request)
      auto_merge_service.available_strategies(merge_request).any?
    end

    def auto_merge_service
      @auto_merge_service ||= AutoMergeService.new(project, current_user, params)
    end
  end
end