1# frozen_string_literal: true 2 3module MergeRequests 4 class MergeOrchestrationService < ::BaseService 5 def execute(merge_request) 6 return unless can_merge?(merge_request) 7 8 merge_request.update(merge_error: nil) 9 10 if can_merge_automatically?(merge_request) 11 auto_merge_service.execute(merge_request) 12 else 13 merge_request.merge_async(current_user.id, params) 14 end 15 end 16 17 def can_merge?(merge_request) 18 can_merge_automatically?(merge_request) || can_merge_immediately?(merge_request) 19 end 20 21 def preferred_auto_merge_strategy(merge_request) 22 auto_merge_service.preferred_strategy(merge_request) 23 end 24 25 private 26 27 def can_merge_immediately?(merge_request) 28 merge_request.can_be_merged_by?(current_user) && 29 merge_request.mergeable_state? 30 end 31 32 def can_merge_automatically?(merge_request) 33 auto_merge_service.available_strategies(merge_request).any? 34 end 35 36 def auto_merge_service 37 @auto_merge_service ||= AutoMergeService.new(project, current_user, params) 38 end 39 end 40end 41