Commit f7537ce0 authored by Sean McGivern's avatar Sean McGivern

Merge branch 'issue_39773_be' into 'master'

Prevent fast forward merge when rebase is required

Closes #39773

See merge request gitlab-org/gitlab-ce!15296
parents 30e466b5 bddbb90f
...@@ -18,15 +18,7 @@ module MergeRequests ...@@ -18,15 +18,7 @@ module MergeRequests
@merge_request = merge_request @merge_request = merge_request
unless @merge_request.mergeable? error_check!
return handle_merge_error(log_message: 'Merge request is not mergeable', save_message_on_model: true)
end
@source = find_merge_source
unless @source
return handle_merge_error(log_message: 'No source for merge', save_message_on_model: true)
end
merge_request.in_locked_state do merge_request.in_locked_state do
if commit if commit
...@@ -41,6 +33,19 @@ module MergeRequests ...@@ -41,6 +33,19 @@ module MergeRequests
private private
def error_check!
error =
if @merge_request.should_be_rebased?
'Only fast-forward merge is allowed for your project. Please update your source branch'
elsif !@merge_request.mergeable?
'Merge request is not mergeable'
elsif !source
'No source for merge'
end
raise MergeError, error if error
end
def commit def commit
message = params[:commit_message] || merge_request.merge_commit_message message = params[:commit_message] || merge_request.merge_commit_message
...@@ -91,8 +96,8 @@ module MergeRequests ...@@ -91,8 +96,8 @@ module MergeRequests
merge_request.to_reference(full: true) merge_request.to_reference(full: true)
end end
def find_merge_source def source
merge_request.diff_head_sha @source ||= @merge_request.diff_head_sha
end end
end end
end end
---
title: Show error message when fast-forward merge is not possible
merge_request:
author:
type: fixed
...@@ -248,6 +248,28 @@ describe MergeRequests::MergeService do ...@@ -248,6 +248,28 @@ describe MergeRequests::MergeService do
expect(merge_request.merge_error).to include(error_message) expect(merge_request.merge_error).to include(error_message)
expect(Rails.logger).to have_received(:error).with(a_string_matching(error_message)) expect(Rails.logger).to have_received(:error).with(a_string_matching(error_message))
end end
context "when fast-forward merge is not allowed" do
before do
allow_any_instance_of(Repository).to receive(:ancestor?).and_return(nil)
end
%w(semi-linear ff).each do |merge_method|
it "logs and saves error if merge is #{merge_method} only" do
merge_method = 'rebase_merge' if merge_method == 'semi-linear'
merge_request.project.update(merge_method: merge_method)
error_message = 'Only fast-forward merge is allowed for your project. Please update your source branch'
allow(service).to receive(:execute_hooks)
service.execute(merge_request)
expect(merge_request).to be_open
expect(merge_request.merge_commit_sha).to be_nil
expect(merge_request.merge_error).to include(error_message)
expect(Rails.logger).to have_received(:error).with(a_string_matching(error_message))
end
end
end
end end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment