diff options
Diffstat (limited to 'app/models/merge_request.rb')
-rw-r--r-- | app/models/merge_request.rb | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 29540cbde2f..854325e1fcd 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -1016,8 +1016,24 @@ class MergeRequest < ApplicationRecord merge_request_diff.persisted? || create_merge_request_diff end - def create_merge_request_diff + def eager_fetch_ref! + return unless valid? + + # has_internal_id normally attempts to allocate the iid in the + # before_create hook, but we need the iid to be available before + # that to fetch the ref into the target project. + track_target_project_iid! + ensure_target_project_iid! + fetch_ref! + # Prevent the after_create hook from fetching the source branch again. + @skip_fetch_ref = true + end + + def create_merge_request_diff + # Callers such as MergeRequests::BuildService may not call eager_fetch_ref!. Just + # in case they haven't, we fetch the ref. + fetch_ref! unless skip_fetch_ref # n+1: https://gitlab.com/gitlab-org/gitlab/-/issues/19377 Gitlab::GitalyClient.allow_n_plus_1_calls do @@ -1136,15 +1152,20 @@ class MergeRequest < ApplicationRecord # rubocop: disable CodeReuse/ServiceClass def mergeable_state?(skip_ci_check: false, skip_discussions_check: false) - return false unless open? - return false if work_in_progress? - return false if broken? - return false unless skip_discussions_check || mergeable_discussions_state? - if Feature.enabled?(:improved_mergeability_checks, self.project, default_enabled: :yaml) - additional_checks = MergeRequests::Mergeability::RunChecksService.new(merge_request: self, params: { skip_ci_check: skip_ci_check }) + additional_checks = MergeRequests::Mergeability::RunChecksService.new( + merge_request: self, + params: { + skip_ci_check: skip_ci_check, + skip_discussions_check: skip_discussions_check + } + ) additional_checks.execute.all?(&:success?) else + return false unless open? + return false if draft? + return false if broken? + return false unless skip_discussions_check || mergeable_discussions_state? return false unless skip_ci_check || mergeable_ci_state? true @@ -1921,10 +1942,18 @@ class MergeRequest < ApplicationRecord merge_request_assignees.find_by(user_id: user.id) end + def merge_request_assignees_with(user_ids) + merge_request_assignees.where(user_id: user_ids) + end + def find_reviewer(user) merge_request_reviewers.find_by(user_id: user.id) end + def merge_request_reviewers_with(user_ids) + merge_request_reviewers.where(user_id: user_ids) + end + def enabled_reports { sast: report_type_enabled?(:sast), @@ -1950,6 +1979,8 @@ class MergeRequest < ApplicationRecord private + attr_accessor :skip_fetch_ref + def set_draft_status self.draft = draft? end |