From defeeba1a8d6fa8784db1c50ca4ff9e8b56f539c Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 7 Mar 2023 00:07:42 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- app/models/alert_management/alert.rb | 2 +- app/models/commit.rb | 3 ++- app/models/commit_range.rb | 2 +- app/models/concerns/noteable.rb | 1 + app/models/concerns/referable.rb | 6 ++++- app/models/design_management/design.rb | 4 +-- app/models/group.rb | 13 ---------- app/models/issue.rb | 10 ++++---- app/models/merge_request.rb | 2 +- app/models/milestone.rb | 2 +- app/models/namespace.rb | 45 ++++++++++++++++++++++++++++++++++ app/models/operations/feature_flag.rb | 2 +- app/models/project.rb | 13 +++++++--- app/models/snippet.rb | 2 +- 14 files changed, 76 insertions(+), 31 deletions(-) (limited to 'app/models') diff --git a/app/models/alert_management/alert.rb b/app/models/alert_management/alert.rb index 4af9b644362..74edcf12ac2 100644 --- a/app/models/alert_management/alert.rb +++ b/app/models/alert_management/alert.rb @@ -140,7 +140,7 @@ module AlertManagement end def self.link_reference_pattern - @link_reference_pattern ||= super("alert_management", %r{(?\d+)/details(\#)?}) + @link_reference_pattern ||= compose_link_reference_pattern('alert_management', %r{(?\d+)/details(\#)?}) end def self.reference_valid?(reference) diff --git a/app/models/commit.rb b/app/models/commit.rb index 4517b3ef216..ea90b4e4dda 100644 --- a/app/models/commit.rb +++ b/app/models/commit.rb @@ -206,7 +206,8 @@ class Commit def self.link_reference_pattern @link_reference_pattern ||= - super("commit", /(?#{COMMIT_SHA_PATTERN})?(\.(?#{LINK_EXTENSION_PATTERN}))?/o) + compose_link_reference_pattern('commit', + /(?#{COMMIT_SHA_PATTERN})?(\.(?#{LINK_EXTENSION_PATTERN}))?/o) end def to_reference(from = nil, full: false) diff --git a/app/models/commit_range.rb b/app/models/commit_range.rb index 87029cb2033..90cdd267cbd 100644 --- a/app/models/commit_range.rb +++ b/app/models/commit_range.rb @@ -50,7 +50,7 @@ class CommitRange end def self.link_reference_pattern - @link_reference_pattern ||= super("compare", /(?#{PATTERN})/o) + @link_reference_pattern ||= compose_link_reference_pattern('compare', /(?#{PATTERN})/o) end # Initialize a CommitRange diff --git a/app/models/concerns/noteable.rb b/app/models/concerns/noteable.rb index 7addcf9e2ec..0333cfc5f9e 100644 --- a/app/models/concerns/noteable.rb +++ b/app/models/concerns/noteable.rb @@ -169,6 +169,7 @@ module Noteable def expire_note_etag_cache return unless discussions_rendered_on_frontend? return unless etag_caching_enabled? + return unless project.present? Gitlab::EtagCaching::Store.new.touch(note_etag_key) end diff --git a/app/models/concerns/referable.rb b/app/models/concerns/referable.rb index 9a17131c91c..5303d110078 100644 --- a/app/models/concerns/referable.rb +++ b/app/models/concerns/referable.rb @@ -76,7 +76,11 @@ module Referable true end - def link_reference_pattern(route, pattern) + def link_reference_pattern + raise NotImplementedError, "#{self} does not implement #{__method__}" + end + + def compose_link_reference_pattern(route, pattern) %r{ (? #{Regexp.escape(Gitlab.config.gitlab.url)} diff --git a/app/models/design_management/design.rb b/app/models/design_management/design.rb index f9c748c299d..cb6d4e72c80 100644 --- a/app/models/design_management/design.rb +++ b/app/models/design_management/design.rb @@ -47,7 +47,7 @@ module DesignManagement # Pre-fetching scope to include the data necessary to construct a # reference using `to_reference`. - scope :for_reference, -> { includes(issue: [{ project: [:route, :namespace] }]) } + scope :for_reference, -> { includes(issue: [{ namespace: :project }, { project: [:route, :namespace] }]) } # A design can be uniquely identified by issue_id and filename # Takes one or more sets of composite IDs of the form: @@ -178,7 +178,7 @@ module DesignManagement (? #{valid_char}+ \. #{ext}) }x - super(path_segment, filename_pattern) + compose_link_reference_pattern(path_segment, filename_pattern) end end diff --git a/app/models/group.rb b/app/models/group.rb index 0dcc35b2a39..732e082c3af 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -7,7 +7,6 @@ class Group < Namespace include AfterCommitQueue include AccessRequestable include Avatarable - include Referable include SelectForProjectAuthorization include LoadedInGroupList include GroupDescendant @@ -242,14 +241,6 @@ class Group < Namespace end end - def reference_prefix - User.reference_prefix - end - - def reference_pattern - User.reference_pattern - end - # WARNING: This method should never be used on its own # please do make sure the number of rows you are filtering is small # enough for this query @@ -366,10 +357,6 @@ class Group < Namespace notification_settings.find { |n| n.notification_email.present? }&.notification_email end - def to_reference(_from = nil, target_project: nil, full: nil) - "#{self.class.reference_prefix}#{full_path}" - end - def web_url(only_path: nil) Gitlab::UrlBuilder.build(self, only_path: only_path) end diff --git a/app/models/issue.rb b/app/models/issue.rb index 7fdededb8aa..352aa89b4c8 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -163,15 +163,15 @@ class Issue < ApplicationRecord scope :order_closed_at_desc, -> { reorder(arel_table[:closed_at].desc.nulls_last) } scope :preload_associated_models, -> { preload(:assignees, :labels, project: :namespace) } - scope :with_web_entity_associations, -> { preload(:author, project: [:project_feature, :route, namespace: :route]) } + scope :with_web_entity_associations, -> { preload(:author, :namespace, project: [:project_feature, :route, namespace: :route]) } scope :preload_awardable, -> { preload(:award_emoji) } scope :with_alert_management_alerts, -> { joins(:alert_management_alert) } scope :with_prometheus_alert_events, -> { joins(:issues_prometheus_alert_events) } scope :with_self_managed_prometheus_alert_events, -> { joins(:issues_self_managed_prometheus_alert_events) } scope :with_api_entity_associations, -> { - preload(:timelogs, :closed_by, :assignees, :author, :labels, :issuable_severity, + preload(:timelogs, :closed_by, :assignees, :author, :labels, :issuable_severity, namespace: [{ parent: :route }, :route], milestone: { project: [:route, { namespace: :route }] }, - project: [:project_feature, :route, { namespace: :route }], + project: [:project_namespace, :project_feature, :route, { group: :route }, { namespace: :route }], duplicated_to: { project: [:project_feature] }) } scope :with_issue_type, ->(types) { where(issue_type: types) } @@ -346,7 +346,7 @@ class Issue < ApplicationRecord end def self.link_reference_pattern - @link_reference_pattern ||= super(%r{issues(?:\/incident)?}, Gitlab::Regex.issue) + @link_reference_pattern ||= compose_link_reference_pattern(%r{issues(?:\/incident)?}, Gitlab::Regex.issue) end def self.reference_valid?(reference) @@ -451,7 +451,7 @@ class Issue < ApplicationRecord def to_reference(from = nil, full: false) reference = "#{self.class.reference_prefix}#{iid}" - "#{project.to_reference_base(from, full: full)}#{reference}" + "#{namespace.to_reference_base(from, full: full)}#{reference}" end def suggested_branch_name diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index e59393f7533..dd810b924a1 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -563,7 +563,7 @@ class MergeRequest < ApplicationRecord end def self.link_reference_pattern - @link_reference_pattern ||= super("merge_requests", Gitlab::Regex.merge_request) + @link_reference_pattern ||= compose_link_reference_pattern('merge_requests', Gitlab::Regex.merge_request) end def self.reference_valid?(reference) diff --git a/app/models/milestone.rb b/app/models/milestone.rb index 8ae1fab963f..10d70eaa24e 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -114,7 +114,7 @@ class Milestone < ApplicationRecord end def self.link_reference_pattern - @link_reference_pattern ||= super("milestones", /(?\d+)/) + @link_reference_pattern ||= compose_link_reference_pattern('milestones', /(?\d+)/) end def self.upcoming_ids(projects, groups) diff --git a/app/models/namespace.rb b/app/models/namespace.rb index cfe5f927e33..13466f147bd 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -16,6 +16,7 @@ class Namespace < ApplicationRecord include EachBatch include BlocksUnsafeSerialization include Ci::NamespaceSettings + include Referable # Tells ActiveRecord not to store the full class name, in order to save some space # https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69794 @@ -266,6 +267,23 @@ class Namespace < ApplicationRecord def top_most by_parent(nil) end + + def reference_prefix + User.reference_prefix + end + + def reference_pattern + User.reference_pattern + end + end + + def to_reference_base(from = nil, full: false) + return full_path if full || cross_namespace_reference?(from) + return path if cross_project_reference?(from) + end + + def to_reference(*) + "#{self.class.reference_prefix}#{full_path}" end def container_registry_namespace_path_validation @@ -619,6 +637,33 @@ class Namespace < ApplicationRecord private + def cross_namespace_reference?(from) + return false if from == self + + comparable_namespace_id = project_namespace? ? parent_id : id + + case from + when Project + from.namespace_id != comparable_namespace_id + when Namespaces::ProjectNamespace + from.parent_id != comparable_namespace_id + when Namespace + parent != from + when User + true + end + end + + # Check if a reference is being done cross-project + def cross_project_reference?(from) + case from + when Project + from.project_namespace_id != id + else + from && self != from + end + end + def update_new_emails_created_column return if namespace_settings.nil? return if namespace_settings.emails_enabled == !emails_disabled diff --git a/app/models/operations/feature_flag.rb b/app/models/operations/feature_flag.rb index 0df8c87f73f..6876af09c2c 100644 --- a/app/models/operations/feature_flag.rb +++ b/app/models/operations/feature_flag.rb @@ -72,7 +72,7 @@ module Operations end def link_reference_pattern - @link_reference_pattern ||= super("feature_flags", %r{(?\d+)/edit}) + @link_reference_pattern ||= compose_link_reference_pattern('feature_flags', %r{(?\d+)/edit}) end def reference_postfix diff --git a/app/models/project.rb b/app/models/project.rb index e2f5e51453d..21f81f70f18 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -3243,6 +3243,8 @@ class Project < ApplicationRecord case from when Project namespace_id != from.namespace_id + when Namespaces::ProjectNamespace + namespace_id != from.parent_id when Namespace namespace != from when User @@ -3252,9 +3254,14 @@ class Project < ApplicationRecord # Check if a reference is being done cross-project def cross_project_reference?(from) - return true if from.is_a?(Namespace) - - from && self != from + case from + when Namespaces::ProjectNamespace + project_namespace_id != from.id + when Namespace + true + else + from && self != from + end end def update_project_statistics diff --git a/app/models/snippet.rb b/app/models/snippet.rb index 9ec685c5580..66d5c3ac801 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -183,7 +183,7 @@ class Snippet < ApplicationRecord end def link_reference_pattern - @link_reference_pattern ||= super("snippets", /(?\d+)/) + @link_reference_pattern ||= compose_link_reference_pattern('snippets', /(?\d+)/) end def find_by_id_and_project(id:, project:) -- cgit v1.2.1