Prevent fast forward merge when rebase is required
This commit is contained in:
parent
65faebb955
commit
bddbb90fd9
|
@ -18,15 +18,7 @@ module MergeRequests
|
|||
|
||||
@merge_request = merge_request
|
||||
|
||||
unless @merge_request.mergeable?
|
||||
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
|
||||
error_check!
|
||||
|
||||
merge_request.in_locked_state do
|
||||
if commit
|
||||
|
@ -41,6 +33,19 @@ module MergeRequests
|
|||
|
||||
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
|
||||
message = params[:commit_message] || merge_request.merge_commit_message
|
||||
|
||||
|
@ -91,8 +96,8 @@ module MergeRequests
|
|||
merge_request.to_reference(full: true)
|
||||
end
|
||||
|
||||
def find_merge_source
|
||||
merge_request.diff_head_sha
|
||||
def source
|
||||
@source ||= @merge_request.diff_head_sha
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Show error message when fast-forward merge is not possible
|
||||
merge_request:
|
||||
author:
|
||||
type: fixed
|
|
@ -248,6 +248,28 @@ describe MergeRequests::MergeService do
|
|||
expect(merge_request.merge_error).to include(error_message)
|
||||
expect(Rails.logger).to have_received(:error).with(a_string_matching(error_message))
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue