150 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
module Gitlab
 | 
						|
  module QuickActions
 | 
						|
    module MergeRequestActions
 | 
						|
      extend ActiveSupport::Concern
 | 
						|
      include Gitlab::QuickActions::Dsl
 | 
						|
 | 
						|
      included do
 | 
						|
        # MergeRequest only quick actions definitions
 | 
						|
        desc do
 | 
						|
          if Feature.enabled?(:merge_orchestration_service, quick_action_target.project, default_enabled: true)
 | 
						|
            if preferred_strategy = preferred_auto_merge_strategy(quick_action_target)
 | 
						|
              _("Merge automatically (%{strategy})") % { strategy: preferred_strategy.humanize }
 | 
						|
            else
 | 
						|
              _("Merge immediately")
 | 
						|
            end
 | 
						|
          else
 | 
						|
            _('Merge (when the pipeline succeeds)')
 | 
						|
          end
 | 
						|
        end
 | 
						|
        explanation do
 | 
						|
          if Feature.enabled?(:merge_orchestration_service, quick_action_target.project, default_enabled: true)
 | 
						|
            if preferred_strategy = preferred_auto_merge_strategy(quick_action_target)
 | 
						|
              _("Schedules to merge this merge request (%{strategy}).") % { strategy: preferred_strategy.humanize }
 | 
						|
            else
 | 
						|
              _('Merges this merge request immediately.')
 | 
						|
            end
 | 
						|
          else
 | 
						|
            _('Merges this merge request when the pipeline succeeds.')
 | 
						|
          end
 | 
						|
        end
 | 
						|
        execution_message do
 | 
						|
          if Feature.enabled?(:merge_orchestration_service, quick_action_target.project, default_enabled: true)
 | 
						|
            if preferred_strategy = preferred_auto_merge_strategy(quick_action_target)
 | 
						|
              _("Scheduled to merge this merge request (%{strategy}).") % { strategy: preferred_strategy.humanize }
 | 
						|
            else
 | 
						|
              _('Merged this merge request.')
 | 
						|
            end
 | 
						|
          else
 | 
						|
            _('Scheduled to merge this merge request when the pipeline succeeds.')
 | 
						|
          end
 | 
						|
        end
 | 
						|
        types MergeRequest
 | 
						|
        condition do
 | 
						|
          if Feature.enabled?(:merge_orchestration_service, quick_action_target.project, default_enabled: true)
 | 
						|
            quick_action_target.persisted? &&
 | 
						|
              merge_orchestration_service.can_merge?(quick_action_target)
 | 
						|
          else
 | 
						|
            last_diff_sha = params && params[:merge_request_diff_head_sha]
 | 
						|
            quick_action_target.persisted? &&
 | 
						|
              quick_action_target.mergeable_with_quick_action?(current_user, autocomplete_precheck: !last_diff_sha, last_diff_sha: last_diff_sha)
 | 
						|
          end
 | 
						|
        end
 | 
						|
        command :merge do
 | 
						|
          @updates[:merge] = params[:merge_request_diff_head_sha]
 | 
						|
        end
 | 
						|
 | 
						|
        desc 'Toggle the Draft status'
 | 
						|
        explanation do
 | 
						|
          noun = quick_action_target.to_ability_name.humanize(capitalize: false)
 | 
						|
          if quick_action_target.work_in_progress?
 | 
						|
            _("Unmarks this %{noun} as a draft.")
 | 
						|
          else
 | 
						|
            _("Marks this %{noun} as a draft.")
 | 
						|
          end % { noun: noun }
 | 
						|
        end
 | 
						|
        execution_message do
 | 
						|
          noun = quick_action_target.to_ability_name.humanize(capitalize: false)
 | 
						|
          if quick_action_target.work_in_progress?
 | 
						|
            _("Unmarked this %{noun} as a draft.")
 | 
						|
          else
 | 
						|
            _("Marked this %{noun} as a draft.")
 | 
						|
          end % { noun: noun }
 | 
						|
        end
 | 
						|
 | 
						|
        types MergeRequest
 | 
						|
        condition do
 | 
						|
          quick_action_target.respond_to?(:work_in_progress?) &&
 | 
						|
            # Allow it to mark as WIP on MR creation page _or_ through MR notes.
 | 
						|
            (quick_action_target.new_record? || current_user.can?(:"update_#{quick_action_target.to_ability_name}", quick_action_target))
 | 
						|
        end
 | 
						|
        command :draft, :wip do
 | 
						|
          @updates[:wip_event] = quick_action_target.work_in_progress? ? 'unwip' : 'wip'
 | 
						|
        end
 | 
						|
 | 
						|
        desc _('Set target branch')
 | 
						|
        explanation do |branch_name|
 | 
						|
          _('Sets target branch to %{branch_name}.') % { branch_name: branch_name }
 | 
						|
        end
 | 
						|
        execution_message do |branch_name|
 | 
						|
          _('Set target branch to %{branch_name}.') % { branch_name: branch_name }
 | 
						|
        end
 | 
						|
        params '<Local branch name>'
 | 
						|
        types MergeRequest
 | 
						|
        condition do
 | 
						|
          quick_action_target.respond_to?(:target_branch) &&
 | 
						|
            (current_user.can?(:"update_#{quick_action_target.to_ability_name}", quick_action_target) ||
 | 
						|
              quick_action_target.new_record?)
 | 
						|
        end
 | 
						|
        parse_params do |target_branch_param|
 | 
						|
          target_branch_param.strip
 | 
						|
        end
 | 
						|
        command :target_branch do |branch_name|
 | 
						|
          @updates[:target_branch] = branch_name if project.repository.branch_exists?(branch_name)
 | 
						|
        end
 | 
						|
 | 
						|
        desc _('Submit a review')
 | 
						|
        explanation _('Submit the current review.')
 | 
						|
        types MergeRequest
 | 
						|
        condition do
 | 
						|
          quick_action_target.persisted?
 | 
						|
        end
 | 
						|
        command :submit_review do
 | 
						|
          next if params[:review_id]
 | 
						|
 | 
						|
          result = DraftNotes::PublishService.new(quick_action_target, current_user).execute
 | 
						|
          @execution_message[:submit_review] = if result[:status] == :success
 | 
						|
                                                 _('Submitted the current review.')
 | 
						|
                                               else
 | 
						|
                                                 result[:message]
 | 
						|
                                               end
 | 
						|
        end
 | 
						|
 | 
						|
        desc _('Approve a merge request')
 | 
						|
        explanation _('Approve the current merge request.')
 | 
						|
        types MergeRequest
 | 
						|
        condition do
 | 
						|
          quick_action_target.persisted? && quick_action_target.can_be_approved_by?(current_user)
 | 
						|
        end
 | 
						|
        command :approve do
 | 
						|
          success = MergeRequests::ApprovalService.new(quick_action_target.project, current_user).execute(quick_action_target)
 | 
						|
 | 
						|
          next unless success
 | 
						|
 | 
						|
          @execution_message[:approve] = _('Approved the current merge request.')
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      def merge_orchestration_service
 | 
						|
        @merge_orchestration_service ||= MergeRequests::MergeOrchestrationService.new(project, current_user)
 | 
						|
      end
 | 
						|
 | 
						|
      def preferred_auto_merge_strategy(merge_request)
 | 
						|
        merge_orchestration_service.preferred_auto_merge_strategy(merge_request)
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |