diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 6772672992c..1fbdc73cabe 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -10,7 +10,8 @@ class Projects::MergeRequestsController < Projects::ApplicationController before_action :module_enabled before_action :merge_request, only: [ :edit, :update, :show, :diffs, :commits, :conflicts, :builds, :merge, :merge_check, - :ci_status, :toggle_subscription, :cancel_merge_when_build_succeeds, :remove_wip, :resolve_conflicts + :ci_status, :toggle_subscription, :cancel_merge_when_build_succeeds, :remove_wip, :resolve_conflicts, + :undo_last_resolution ] before_action :validates_merge_request, only: [:show, :diffs, :commits, :builds] before_action :define_show_vars, only: [:show, :diffs, :commits, :conflicts, :builds] @@ -160,6 +161,16 @@ class Projects::MergeRequestsController < Projects::ApplicationController end end + def undo_last_resolution + rugged = @merge_request.project.repository.rugged + ref = Gitlab::Git::BRANCH_REF_PREFIX + @merge_request.source_branch + prev = rugged.ref(ref).target + + rugged.references.update(ref, prev.parents.first.oid) if prev.parents.length == 2 + + head :ok + end + def builds respond_to do |format| format.html do diff --git a/config/routes.rb b/config/routes.rb index 93da084b64a..91d33ea43e9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -729,6 +729,7 @@ Rails.application.routes.draw do post :remove_wip get :diff_for_path post :resolve_conflicts + post :undo_last_resolution end collection do diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb index bca5d8c0655..226650399cc 100644 --- a/spec/controllers/projects/merge_requests_controller_spec.rb +++ b/spec/controllers/projects/merge_requests_controller_spec.rb @@ -638,6 +638,19 @@ describe Projects::MergeRequestsController do it 'redirects to the MR show page' do expect(response).to redirect_to([merge_request_with_conflicts.target_project.namespace.becomes(Namespace), merge_request_with_conflicts.target_project, merge_request_with_conflicts]) end + + context 'undoing the resolution' do + before do + post :undo_last_resolution, + namespace_id: merge_request_with_conflicts.project.namespace.to_param, + project_id: merge_request_with_conflicts.project.to_param, + id: merge_request_with_conflicts.iid + end + + it 'undoes the commit' do + expect(original_head_sha).to eq(merge_request_with_conflicts.source_branch_head.sha) + end + end end context 'when sections are missing' do