75 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
class Projects::MergeRequests::ConflictsController < Projects::MergeRequests::ApplicationController
 | 
						|
  include IssuableActions
 | 
						|
 | 
						|
  before_action :authorize_can_resolve_conflicts!
 | 
						|
 | 
						|
  def show
 | 
						|
    respond_to do |format|
 | 
						|
      format.html do
 | 
						|
        @issuable_sidebar = serializer.represent(@merge_request, serializer: 'sidebar')
 | 
						|
      end
 | 
						|
 | 
						|
      format.json do
 | 
						|
        if @conflicts_list.can_be_resolved_in_ui?
 | 
						|
          render json: @conflicts_list
 | 
						|
        elsif @merge_request.can_be_merged?
 | 
						|
          render json: {
 | 
						|
            message: _('The merge conflicts for this merge request have already been resolved. Please return to the merge request.'),
 | 
						|
            type: 'error'
 | 
						|
          }
 | 
						|
        else
 | 
						|
          render json: {
 | 
						|
            message: _('The merge conflicts for this merge request cannot be resolved through GitLab. Please try to resolve them locally.'),
 | 
						|
            type: 'error'
 | 
						|
          }
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def conflict_for_path
 | 
						|
    return render_404 unless @conflicts_list.can_be_resolved_in_ui?
 | 
						|
 | 
						|
    file = @conflicts_list.file_for_path(params[:old_path], params[:new_path])
 | 
						|
 | 
						|
    return render_404 unless file
 | 
						|
 | 
						|
    render json: file, full_content: true
 | 
						|
  end
 | 
						|
 | 
						|
  def resolve_conflicts
 | 
						|
    return render_404 unless @conflicts_list.can_be_resolved_in_ui?
 | 
						|
 | 
						|
    if @merge_request.can_be_merged?
 | 
						|
      render status: :bad_request, json: { message: _('The merge conflicts for this merge request have already been resolved.') }
 | 
						|
      return
 | 
						|
    end
 | 
						|
 | 
						|
    begin
 | 
						|
      ::MergeRequests::Conflicts::ResolveService
 | 
						|
        .new(merge_request)
 | 
						|
        .execute(current_user, params)
 | 
						|
 | 
						|
      flash[:notice] = _('All merge conflicts were resolved. The merge request can now be merged.')
 | 
						|
 | 
						|
      render json: { redirect_to: project_merge_request_url(@project, @merge_request, resolved_conflicts: true) }
 | 
						|
    rescue Gitlab::Git::Conflict::Resolver::ResolutionError => e
 | 
						|
      render status: :bad_request, json: { message: e.message }
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  private
 | 
						|
 | 
						|
  def authorize_can_resolve_conflicts!
 | 
						|
    @conflicts_list = ::MergeRequests::Conflicts::ListService.new(@merge_request)
 | 
						|
 | 
						|
    return render_404 unless @conflicts_list.can_be_resolved_by?(current_user)
 | 
						|
  end
 | 
						|
 | 
						|
  def serializer
 | 
						|
    MergeRequestSerializer.new(current_user: current_user, project: project)
 | 
						|
  end
 | 
						|
end
 |