From 3a720bee044d0e401f54d2de6534477a2be6b42d Mon Sep 17 00:00:00 2001
From: Hordur Freyr Yngvason <hfyngvason@gitlab.com>
Date: Fri, 6 Oct 2023 12:29:47 +0000
Subject: [PATCH] Enable semi-linear merge trains (behind feature flag)

This expands the feature flag `fast_forward_merge_trains_support` to
also include semi-linear merge trains.

Feature issue: https://gitlab.com/gitlab-org/gitlab/-/issues/26996
Rollout issue: https://gitlab.com/gitlab-org/gitlab/-/issues/282442

Changelog: changed
EE: true
---
 .../merge_trains/refresh_merge_request_service.rb      |  6 ++++--
 .../merge_trains/refresh_merge_request_service_spec.rb | 10 ++++++++--
 2 files changed, 12 insertions(+), 4 deletions(-)

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 97eabe5f4bf96..cdd0b885963e1 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 f539ec8f61bc6..dd3a5bf089e5c 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
 
-- 
GitLab