diff options
Diffstat (limited to 'app/services/merge_requests/merge_orchestration_service.rb')
-rw-r--r-- | app/services/merge_requests/merge_orchestration_service.rb | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/app/services/merge_requests/merge_orchestration_service.rb b/app/services/merge_requests/merge_orchestration_service.rb new file mode 100644 index 00000000000..24341ef1145 --- /dev/null +++ b/app/services/merge_requests/merge_orchestration_service.rb @@ -0,0 +1,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 |