summaryrefslogtreecommitdiff
path: root/app/models/merge_request.rb
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-08-20 18:42:06 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-08-20 18:42:06 +0000
commit6e4e1050d9dba2b7b2523fdd1768823ab85feef4 (patch)
tree78be5963ec075d80116a932011d695dd33910b4e /app/models/merge_request.rb
parent1ce776de4ae122aba3f349c02c17cebeaa8ecf07 (diff)
downloadgitlab-ce-6e4e1050d9dba2b7b2523fdd1768823ab85feef4.tar.gz
Add latest changes from gitlab-org/gitlab@13-3-stable-ee
Diffstat (limited to 'app/models/merge_request.rb')
-rw-r--r--app/models/merge_request.rb40
1 files changed, 25 insertions, 15 deletions
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index b7885771781..f4c2d568b4d 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -40,7 +40,7 @@ class MergeRequest < ApplicationRecord
has_internal_id :iid, scope: :target_project, track_if: -> { !importing? }, init: ->(s) { s&.target_project&.merge_requests&.maximum(:iid) }
has_many :merge_request_diffs
- has_many :merge_request_context_commits
+ has_many :merge_request_context_commits, inverse_of: :merge_request
has_many :merge_request_context_commit_diff_files, through: :merge_request_context_commits, source: :diff_files
has_one :merge_request_diff,
@@ -251,17 +251,12 @@ class MergeRequest < ApplicationRecord
end
scope :join_project, -> { joins(:target_project) }
scope :references_project, -> { references(:target_project) }
-
- PROJECT_ROUTE_AND_NAMESPACE_ROUTE = [
- target_project: [:route, { namespace: :route }],
- source_project: [:route, { namespace: :route }]
- ].freeze
-
scope :with_api_entity_associations, -> {
- preload(:assignees, :author, :unresolved_notes, :labels, :milestone,
- :timelogs, :latest_merge_request_diff,
- *PROJECT_ROUTE_AND_NAMESPACE_ROUTE,
- metrics: [:latest_closed_by, :merged_by])
+ preload_routables
+ .preload(:assignees, :author, :unresolved_notes, :labels, :milestone,
+ :timelogs, :latest_merge_request_diff,
+ target_project: :project_feature,
+ metrics: [:latest_closed_by, :merged_by])
}
scope :by_target_branch_wildcard, ->(wildcard_branch_name) do
@@ -269,6 +264,14 @@ class MergeRequest < ApplicationRecord
end
scope :by_target_branch, ->(branch_name) { where(target_branch: branch_name) }
scope :preload_source_project, -> { preload(:source_project) }
+ scope :preload_target_project, -> { preload(:target_project) }
+ scope :preload_routables, -> do
+ preload(target_project: [:route, { namespace: :route }],
+ source_project: [:route, { namespace: :route }])
+ end
+ scope :preload_author, -> { preload(:author) }
+ scope :preload_approved_by_users, -> { preload(:approved_by_users) }
+ scope :preload_metrics, -> (relation) { preload(metrics: relation) }
scope :with_auto_merge_enabled, -> do
with_state(:opened).where(auto_merge_enabled: true)
@@ -428,7 +431,7 @@ class MergeRequest < ApplicationRecord
end
def context_commits(limit: nil)
- @context_commits ||= merge_request_context_commits.limit(limit).map(&:to_commit)
+ @context_commits ||= merge_request_context_commits.order_by_committed_date_desc.limit(limit).map(&:to_commit)
end
def recent_context_commits
@@ -1181,12 +1184,12 @@ class MergeRequest < ApplicationRecord
end
def can_be_merged_by?(user)
- access = ::Gitlab::UserAccess.new(user, project: project)
+ access = ::Gitlab::UserAccess.new(user, container: project)
access.can_update_branch?(target_branch)
end
def can_be_merged_via_command_line_by?(user)
- access = ::Gitlab::UserAccess.new(user, project: project)
+ access = ::Gitlab::UserAccess.new(user, container: project)
access.can_push_to_branch?(target_branch)
end
@@ -1608,7 +1611,12 @@ class MergeRequest < ApplicationRecord
override :ensure_metrics
def ensure_metrics
- MergeRequest::Metrics.safe_find_or_create_by(merge_request_id: id).tap do |metrics_record|
+ # Backward compatibility: some merge request metrics records will not have target_project_id filled in.
+ # In that case the first `safe_find_or_create_by` will return false.
+ # The second finder call will be eliminated in https://gitlab.com/gitlab-org/gitlab/-/issues/233507
+ metrics_record = MergeRequest::Metrics.safe_find_or_create_by(merge_request_id: id, target_project_id: target_project_id) || MergeRequest::Metrics.safe_find_or_create_by(merge_request_id: id)
+
+ metrics_record.tap do |metrics_record|
# Make sure we refresh the loaded association object with the newly created/loaded item.
# This is needed in order to have the exact functionality than before.
#
@@ -1618,6 +1626,8 @@ class MergeRequest < ApplicationRecord
# merge_request.ensure_metrics
# merge_request.metrics # should return the metrics record and not nil
# merge_request.metrics.merge_request # should return the same MR record
+
+ metrics_record.target_project_id = target_project_id
metrics_record.association(:merge_request).target = self
association(:metrics).target = metrics_record
end