Skip to content
Snippets Groups Projects

Resolve Merge conflicts in editor

Merged Alfredo Sumaran requested to merge merge-conflicts-editor-2 into master
All threads resolved!
11 files
+ 395
42
Compare changes
  • Side-by-side
  • Inline
Files
11
  • 3f71c43e
    Allow setting content for resolutions · 3f71c43e
    Sean McGivern authored
    When reading conflicts:
    
    1. Add a `type` field. `text` works as before, and has `sections`;
       `text-editor` is a file with ambiguous conflict markers that can only
       be resolved in an editor.
    2. Add a `content_path` field pointing to a JSON representation of the
       file's content for a single file.
    3. Hitting `content_path` returns a similar datastructure to the `file`,
       but without the `content_path` and `sections` fields, and with a
       `content` field containing the full contents of the file (with
       conflict markers).
    
    When writing conflicts:
    
    1. Instead of `sections` being at the top level, they are now in a
       `files` array. This matches the read format better.
    2. The `files` array contains file hashes, each of which must contain:
       a. `new_path`
       b. `old_path`
       c. EITHER `sections` (which works as before) or `content` (with the
          full content of the resolved file).
@@ -9,15 +9,15 @@ class Projects::MergeRequestsController < Projects::ApplicationController
before_action :module_enabled
before_action :merge_request, only: [
:edit, :update, :show, :diffs, :commits, :conflicts, :builds, :pipelines, :merge, :merge_check,
:edit, :update, :show, :diffs, :commits, :conflicts, :conflict_for_path, :builds, :pipelines, :merge, :merge_check,
:ci_status, :toggle_subscription, :cancel_merge_when_build_succeeds, :remove_wip, :resolve_conflicts, :assign_related_issues
]
before_action :validates_merge_request, only: [:show, :diffs, :commits, :builds, :pipelines]
before_action :define_show_vars, only: [:show, :diffs, :commits, :conflicts, :builds, :pipelines]
before_action :define_show_vars, only: [:show, :diffs, :commits, :conflicts, :conflict_for_path, :builds, :pipelines]
before_action :define_widget_vars, only: [:merge, :cancel_merge_when_build_succeeds, :merge_check]
before_action :define_commit_vars, only: [:diffs]
before_action :define_diff_comment_vars, only: [:diffs]
before_action :ensure_ref_fetched, only: [:show, :diffs, :commits, :builds, :conflicts, :pipelines]
before_action :ensure_ref_fetched, only: [:show, :diffs, :commits, :builds, :conflicts, :conflict_for_path, :pipelines]
before_action :close_merge_request_without_source_project, only: [:show, :diffs, :commits, :builds, :pipelines]
before_action :apply_diff_view_cookie!, only: [:new_diffs]
before_action :build_merge_request, only: [:new, :new_diffs]
@@ -33,7 +33,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
before_action :authenticate_user!, only: [:assign_related_issues]
before_action :authorize_can_resolve_conflicts!, only: [:conflicts, :resolve_conflicts]
before_action :authorize_can_resolve_conflicts!, only: [:conflicts, :conflict_for_path, :resolve_conflicts]
def index
@merge_requests = merge_requests_collection
@@ -170,6 +170,16 @@ def conflicts
end
end
def conflict_for_path
return render_404 unless @merge_request.conflicts_can_be_resolved_in_ui?
file = @merge_request.conflicts.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 @merge_request.conflicts_can_be_resolved_in_ui?
@@ -184,7 +194,7 @@ def resolve_conflicts
flash[:notice] = 'All merge conflicts were resolved. The merge request can now be merged.'
render json: { redirect_to: namespace_project_merge_request_url(@project.namespace, @project, @merge_request, resolved_conflicts: true) }
rescue Gitlab::Conflict::File::MissingResolution => e
rescue Gitlab::Conflict::ResolutionError => e
render status: :bad_request, json: { message: e.message }
end
end
Loading