diff --git a/ee/app/services/merge_trains/refresh_merge_request_service.rb b/ee/app/services/merge_trains/refresh_merge_request_service.rb index 97eabe5f4bf9637b97957628044a0728373678ce..cdd0b885963e13d590854fe904e3d44ace3fee21 100644 --- a/ee/app/services/merge_trains/refresh_merge_request_service.rb +++ b/ee/app/services/merge_trains/refresh_merge_request_service.rb @@ -47,8 +47,10 @@ def validate! end def merge_from_train_ref? - # For now, we only enable this for fast-forward merge trains - return false unless project.merge_requests_ff_only_enabled && Feature.enabled?(:fast_forward_merge_trains_support, project) + # Although it should be technically safe to merge from any mergeable train + # ref, do so for fast-forward and semi-linear merge trains to avoid + # disruption to standard merge commit merge trains. + return false unless project.ff_merge_must_be_possible? && Feature.enabled?(:fast_forward_merge_trains_support, project) mergeable_sha_and_message?(merge_train_car) end diff --git a/ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb b/ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb index f539ec8f61bc6c1843da2aa07800faf92dcef872..dd3a5bf089e5ccde43888c2bb866a0e4f6de934a 100644 --- a/ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb +++ b/ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb @@ -259,9 +259,15 @@ context 'when the merge request is the first queue' do it_behaves_like 'merges the merge request' - context 'when the merge method is fast forward' do + using RSpec::Parameterized::TableSyntax + + where(:merge_method) do + [:ff, :rebase_merge] + end + + with_them do before do - project.update!(merge_method: :ff) + project.update!(merge_method: merge_method) project.repository.raw_repository.write_ref(merge_request.train_ref_path, pipeline.sha) end