summaryrefslogtreecommitdiff
path: root/app/models/repository.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/repository.rb
parent1ce776de4ae122aba3f349c02c17cebeaa8ecf07 (diff)
downloadgitlab-ce-6e4e1050d9dba2b7b2523fdd1768823ab85feef4.tar.gz
Add latest changes from gitlab-org/gitlab@13-3-stable-ee
Diffstat (limited to 'app/models/repository.rb')
-rw-r--r--app/models/repository.rb52
1 files changed, 41 insertions, 11 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 48e96d4c193..07122db36b3 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -43,7 +43,7 @@ class Repository
gitlab_ci_yml branch_names tag_names branch_count
tag_count avatar exists? root_ref merged_branch_names
has_visible_content? issue_template_names merge_request_template_names
- metrics_dashboard_paths xcode_project?).freeze
+ user_defined_metrics_dashboard_paths xcode_project? has_ambiguous_refs?).freeze
# Methods that use cache_method but only memoize the value
MEMOIZED_CACHED_METHODS = %i(license).freeze
@@ -61,7 +61,7 @@ class Repository
avatar: :avatar,
issue_template: :issue_template_names,
merge_request_template: :merge_request_template_names,
- metrics_dashboard: :metrics_dashboard_paths,
+ metrics_dashboard: :user_defined_metrics_dashboard_paths,
xcode_config: :xcode_project?
}.freeze
@@ -196,6 +196,32 @@ class Repository
tag_exists?(ref) && branch_exists?(ref)
end
+ # It's possible for a tag name to be a prefix (including slash) of a branch
+ # name, or vice versa. For instance, a tag named `foo` means we can't create a
+ # tag `foo/bar`, but we _can_ create a branch `foo/bar`.
+ #
+ # If we know a repository has no refs of this type (which is the common case)
+ # then separating refs from paths - as in ExtractsRef - can be faster.
+ #
+ # This method only checks one level deep, so only prefixes that contain no
+ # slashes are considered. If a repository has a tag `foo/bar` and a branch
+ # `foo/bar/baz`, it will return false.
+ def has_ambiguous_refs?
+ return false unless branch_names.present? && tag_names.present?
+
+ with_slash, no_slash = (branch_names + tag_names).partition { |ref| ref.include?('/') }
+
+ return false if with_slash.empty?
+
+ prefixes = no_slash.map { |ref| Regexp.escape(ref) }.join('|')
+ prefix_regex = %r{^#{prefixes}/}
+
+ with_slash.any? do |ref|
+ prefix_regex.match?(ref)
+ end
+ end
+ cache_method :has_ambiguous_refs?
+
def expand_ref(ref)
if tag_exists?(ref)
Gitlab::Git::TAG_REF_PREFIX + ref
@@ -286,14 +312,16 @@ class Repository
end
def expire_tags_cache
- expire_method_caches(%i(tag_names tag_count))
+ expire_method_caches(%i(tag_names tag_count has_ambiguous_refs?))
@tags = nil
+ @tag_names_include = nil
end
def expire_branches_cache
- expire_method_caches(%i(branch_names merged_branch_names branch_count has_visible_content?))
+ expire_method_caches(%i(branch_names merged_branch_names branch_count has_visible_content? has_ambiguous_refs?))
@local_branches = nil
@branch_exists_memo = nil
+ @branch_names_include = nil
end
def expire_statistics_caches
@@ -576,10 +604,10 @@ class Repository
end
cache_method :merge_request_template_names, fallback: []
- def metrics_dashboard_paths
- Gitlab::Metrics::Dashboard::Finder.find_all_paths_from_source(project)
+ def user_defined_metrics_dashboard_paths
+ Gitlab::Metrics::Dashboard::RepoDashboardFinder.list_dashboards(project)
end
- cache_method :metrics_dashboard_paths
+ cache_method :user_defined_metrics_dashboard_paths, fallback: []
def readme
head_tree&.readme
@@ -852,7 +880,7 @@ class Repository
def revert(
user, commit, branch_name, message,
- start_branch_name: nil, start_project: project)
+ start_branch_name: nil, start_project: project, dry_run: false)
with_cache_hooks do
raw_repository.revert(
@@ -861,14 +889,15 @@ class Repository
branch_name: branch_name,
message: message,
start_branch_name: start_branch_name,
- start_repository: start_project.repository.raw_repository
+ start_repository: start_project.repository.raw_repository,
+ dry_run: dry_run
)
end
end
def cherry_pick(
user, commit, branch_name, message,
- start_branch_name: nil, start_project: project)
+ start_branch_name: nil, start_project: project, dry_run: false)
with_cache_hooks do
raw_repository.cherry_pick(
@@ -877,7 +906,8 @@ class Repository
branch_name: branch_name,
message: message,
start_branch_name: start_branch_name,
- start_repository: start_project.repository.raw_repository
+ start_repository: start_project.repository.raw_repository,
+ dry_run: dry_run
)
end
end