Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Speicher <rspeicher@gmail.com>2021-01-20 22:34:23 +0300
committerRobert Speicher <rspeicher@gmail.com>2021-01-20 22:34:23 +0300
commit6438df3a1e0fb944485cebf07976160184697d72 (patch)
tree00b09bfd170e77ae9391b1a2f5a93ef6839f2597 /app/finders
parent42bcd54d971da7ef2854b896a7b34f4ef8601067 (diff)
Add latest changes from gitlab-org/gitlab@13-8-stable-eev13.8.0-rc42
Diffstat (limited to 'app/finders')
-rw-r--r--app/finders/alert_management/alerts_finder.rb2
-rw-r--r--app/finders/autocomplete/group_finder.rb3
-rw-r--r--app/finders/autocomplete/project_finder.rb3
-rw-r--r--app/finders/ci/pipelines_for_merge_request_finder.rb18
-rw-r--r--app/finders/concerns/finder_methods.rb2
-rw-r--r--app/finders/concerns/packages/finder_helper.rb29
-rw-r--r--app/finders/concerns/time_frame_filter.rb2
-rw-r--r--app/finders/deployments_finder.rb4
-rw-r--r--app/finders/issuable_finder.rb8
-rw-r--r--app/finders/issuable_finder/params.rb33
-rw-r--r--app/finders/merge_requests_finder.rb4
-rw-r--r--app/finders/packages/debian/distributions_finder.rb52
-rw-r--r--app/finders/packages/group_packages_finder.rb8
-rw-r--r--app/finders/packages/maven/package_finder.rb16
-rw-r--r--app/finders/packages/nuget/package_finder.rb35
-rw-r--r--app/finders/packages/packages_finder.rb8
-rw-r--r--app/finders/projects_finder.rb2
-rw-r--r--app/finders/template_finder.rb1
-rw-r--r--app/finders/users_finder.rb7
19 files changed, 182 insertions, 55 deletions
diff --git a/app/finders/alert_management/alerts_finder.rb b/app/finders/alert_management/alerts_finder.rb
index be3b329fb6f..8e0444d324a 100644
--- a/app/finders/alert_management/alerts_finder.rb
+++ b/app/finders/alert_management/alerts_finder.rb
@@ -32,6 +32,8 @@ module AlertManagement
attr_reader :current_user, :project, :params
def by_domain(collection)
+ return collection if params[:iid].present?
+
collection.with_operations_alerts
end
diff --git a/app/finders/autocomplete/group_finder.rb b/app/finders/autocomplete/group_finder.rb
index dd97ac4c817..90fa48c2dc9 100644
--- a/app/finders/autocomplete/group_finder.rb
+++ b/app/finders/autocomplete/group_finder.rb
@@ -27,8 +27,7 @@ module Autocomplete
# This removes the need for using `return render_404` and similar patterns
# in controllers that use this finder.
unless Ability.allowed?(current_user, :read_group, group)
- raise ActiveRecord::RecordNotFound
- .new("Could not find a Group with ID #{group_id}")
+ raise ActiveRecord::RecordNotFound, "Could not find a Group with ID #{group_id}"
end
group
diff --git a/app/finders/autocomplete/project_finder.rb b/app/finders/autocomplete/project_finder.rb
index 3a4696f4c2e..6e51ae4c70d 100644
--- a/app/finders/autocomplete/project_finder.rb
+++ b/app/finders/autocomplete/project_finder.rb
@@ -25,8 +25,7 @@ module Autocomplete
# This removes the need for using `return render_404` and similar patterns
# in controllers that use this finder.
unless Ability.allowed?(current_user, :read_project, project)
- raise ActiveRecord::RecordNotFound
- .new("Could not find a Project with ID #{project_id}")
+ raise ActiveRecord::RecordNotFound, "Could not find a Project with ID #{project_id}"
end
project
diff --git a/app/finders/ci/pipelines_for_merge_request_finder.rb b/app/finders/ci/pipelines_for_merge_request_finder.rb
index da8dfc2579a..1f6ee9d75ad 100644
--- a/app/finders/ci/pipelines_for_merge_request_finder.rb
+++ b/app/finders/ci/pipelines_for_merge_request_finder.rb
@@ -34,11 +34,7 @@ module Ci
pipelines =
if merge_request.persisted?
- if Feature.enabled?(:ci_pipelines_for_merge_request_finder_new_cte, target_project)
- pipelines_using_cte
- else
- pipelines_using_legacy_cte
- end
+ pipelines_using_cte
else
triggered_for_branch.for_sha(commit_shas)
end
@@ -49,18 +45,6 @@ module Ci
private
- def pipelines_using_legacy_cte
- cte = Gitlab::SQL::CTE.new(:shas, merge_request.all_commits.select(:sha))
-
- source_sha_join = cte.table[:sha].eq(Ci::Pipeline.arel_table[:source_sha])
- merged_result_pipelines = filter_by(triggered_by_merge_request, cte, source_sha_join)
- detached_merge_request_pipelines = filter_by_sha(triggered_by_merge_request, cte)
- pipelines_for_branch = filter_by_sha(triggered_for_branch, cte)
-
- Ci::Pipeline.with(cte.to_arel) # rubocop: disable CodeReuse/ActiveRecord
- .from_union([merged_result_pipelines, detached_merge_request_pipelines, pipelines_for_branch])
- end
-
def pipelines_using_cte
cte = Gitlab::SQL::CTE.new(:shas, merge_request.all_commits.select(:sha))
diff --git a/app/finders/concerns/finder_methods.rb b/app/finders/concerns/finder_methods.rb
index 622cbcf4928..193b52b1694 100644
--- a/app/finders/concerns/finder_methods.rb
+++ b/app/finders/concerns/finder_methods.rb
@@ -22,7 +22,7 @@ module FinderMethods
def raise_not_found_unless_authorized(result)
result = if_authorized(result)
- raise ActiveRecord::RecordNotFound.new("Couldn't find #{model}") unless result
+ raise(ActiveRecord::RecordNotFound, "Couldn't find #{model}") unless result
result
end
diff --git a/app/finders/concerns/packages/finder_helper.rb b/app/finders/concerns/packages/finder_helper.rb
new file mode 100644
index 00000000000..524e7aa7ff9
--- /dev/null
+++ b/app/finders/concerns/packages/finder_helper.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+module Packages
+ module FinderHelper
+ extend ActiveSupport::Concern
+
+ private
+
+ def packages_visible_to_user(user, within_group:)
+ return ::Packages::Package.none unless within_group
+ return ::Packages::Package.none unless Ability.allowed?(user, :read_package, within_group)
+
+ projects = projects_visible_to_reporters(user, within_group.self_and_descendants.select(:id))
+ ::Packages::Package.for_projects(projects.select(:id))
+ end
+
+ def projects_visible_to_user(user, within_group:)
+ return ::Project.none unless within_group
+ return ::Project.none unless Ability.allowed?(user, :read_package, within_group)
+
+ projects_visible_to_reporters(user, within_group.self_and_descendants.select(:id))
+ end
+
+ def projects_visible_to_reporters(user, namespace_ids)
+ ::Project.in_namespace(namespace_ids)
+ .public_or_visible_to_user(user, ::Gitlab::Access::REPORTER)
+ end
+ end
+end
diff --git a/app/finders/concerns/time_frame_filter.rb b/app/finders/concerns/time_frame_filter.rb
index d1ebed730f6..7412bea340e 100644
--- a/app/finders/concerns/time_frame_filter.rb
+++ b/app/finders/concerns/time_frame_filter.rb
@@ -2,7 +2,7 @@
module TimeFrameFilter
def by_timeframe(items)
- return items unless params[:start_date] && params[:start_date]
+ return items unless params[:start_date] && params[:end_date]
start_date = params[:start_date].to_date
end_date = params[:end_date].to_date
diff --git a/app/finders/deployments_finder.rb b/app/finders/deployments_finder.rb
index 0bb8ce6b4da..4038f93cf2d 100644
--- a/app/finders/deployments_finder.rb
+++ b/app/finders/deployments_finder.rb
@@ -4,10 +4,10 @@ class DeploymentsFinder
attr_reader :project, :params
ALLOWED_SORT_VALUES = %w[id iid created_at updated_at ref].freeze
- DEFAULT_SORT_VALUE = 'id'.freeze
+ DEFAULT_SORT_VALUE = 'id'
ALLOWED_SORT_DIRECTIONS = %w[asc desc].freeze
- DEFAULT_SORT_DIRECTION = 'asc'.freeze
+ DEFAULT_SORT_DIRECTION = 'asc'
def initialize(project, params = {})
@project = project
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index 922b53b514d..fc03d5cd90c 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -4,6 +4,9 @@
#
# Used to filter Issues and MergeRequests collections by set of params
#
+# Note: This class is NOT meant to be instantiated. Instead you should
+# look at IssuesFinder or EpicsFinder, which inherit from this.
+#
# Arguments:
# klass - actual class like Issue or MergeRequest
# current_user - which user use
@@ -92,6 +95,10 @@ class IssuableFinder
IssuableFinder::Params
end
+ def klass
+ raise NotImplementedError
+ end
+
def initialize(current_user, params = {})
@current_user = current_user
@params = params_class.new(params, current_user, klass)
@@ -451,6 +458,7 @@ class IssuableFinder
def by_release(items)
return items unless params.releases?
+ return items if params.group? # don't allow release filtering at group level
if params.filter_by_no_release?
items.without_release
diff --git a/app/finders/issuable_finder/params.rb b/app/finders/issuable_finder/params.rb
index b481afee338..803b30e86ac 100644
--- a/app/finders/issuable_finder/params.rb
+++ b/app/finders/issuable_finder/params.rb
@@ -108,16 +108,8 @@ class IssuableFinder
project_id.present?
end
- def group
- strong_memoize(:group) do
- if params[:group_id].is_a?(Group)
- params[:group_id]
- elsif params[:group_id].present?
- Group.find(params[:group_id])
- else
- nil
- end
- end
+ def group?
+ group_id.present?
end
def related_groups
@@ -143,10 +135,25 @@ class IssuableFinder
end
end
+ def group
+ strong_memoize(:group) do
+ next nil unless group?
+
+ group = group_id.is_a?(Group) ? group_id : Group.find(group_id)
+ group = nil unless Ability.allowed?(current_user, :read_group, group)
+
+ group
+ end
+ end
+
def project_id
params[:project_id]
end
+ def group_id
+ params[:group_id]
+ end
+
def projects
strong_memoize(:projects) do
next [project] if project?
@@ -216,14 +223,14 @@ class IssuableFinder
strong_memoize(:milestones) do
if milestones?
if project?
- group_id = project.group&.id
+ project_group_id = project.group&.id
project_id = project.id
end
- group_id = group.id if group
+ project_group_id = group.id if group
search_params =
- { title: params[:milestone_title], project_ids: project_id, group_ids: group_id }
+ { title: params[:milestone_title], project_ids: project_id, group_ids: project_group_id }
MilestonesFinder.new(search_params).execute # rubocop: disable CodeReuse/Finder
else
diff --git a/app/finders/merge_requests_finder.rb b/app/finders/merge_requests_finder.rb
index 978550aedaf..9f9e2afa7fe 100644
--- a/app/finders/merge_requests_finder.rb
+++ b/app/finders/merge_requests_finder.rb
@@ -57,7 +57,7 @@ class MergeRequestsFinder < IssuableFinder
end
def params_class
- MergeRequestsFinder::Params
+ MergeRequestsFinder.const_get(:Params, false) # rubocop: disable CodeReuse/Finder
end
def filter_items(_items)
@@ -84,7 +84,7 @@ class MergeRequestsFinder < IssuableFinder
def by_commit(items)
return items unless params[:commit_sha].presence
- items.by_commit_sha(params[:commit_sha])
+ items.by_related_commit_sha(params[:commit_sha])
end
def source_branch
diff --git a/app/finders/packages/debian/distributions_finder.rb b/app/finders/packages/debian/distributions_finder.rb
new file mode 100644
index 00000000000..e64b6bdfec1
--- /dev/null
+++ b/app/finders/packages/debian/distributions_finder.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+module Packages
+ module Debian
+ class DistributionsFinder
+ def initialize(container, params = {})
+ @container, @params = container, params
+ end
+
+ def execute
+ collection = relation.with_container(container)
+ collection = by_codename(collection)
+ collection = by_suite(collection)
+ collection = by_codename_or_suite(collection)
+ collection
+ end
+
+ private
+
+ attr_reader :container, :params
+
+ def relation
+ case container
+ when Project
+ Packages::Debian::ProjectDistribution
+ when Group
+ Packages::Debian::GroupDistribution
+ else
+ raise ArgumentError, "Unexpected container type of '#{container.class}'"
+ end
+ end
+
+ def by_codename(collection)
+ return collection unless params[:codename].present?
+
+ collection.with_codename(params[:codename])
+ end
+
+ def by_suite(collection)
+ return collection unless params[:suite].present?
+
+ collection.with_suite(params[:suite])
+ end
+
+ def by_codename_or_suite(collection)
+ return collection unless params[:codename_or_suite].present?
+
+ collection.with_codename_or_suite(params[:codename_or_suite])
+ end
+ end
+ end
+end
diff --git a/app/finders/packages/group_packages_finder.rb b/app/finders/packages/group_packages_finder.rb
index a51057571f1..860c4068b31 100644
--- a/app/finders/packages/group_packages_finder.rb
+++ b/app/finders/packages/group_packages_finder.rb
@@ -27,9 +27,9 @@ module Packages
.including_tags
.for_projects(group_projects_visible_to_current_user.select(:id))
.processed
- .has_version
.sort_by_attribute("#{params[:order_by]}_#{params[:sort]}")
+ packages = filter_with_version(packages)
packages = filter_by_package_type(packages)
packages = filter_by_package_name(packages)
packages
@@ -72,5 +72,11 @@ module Packages
packages.search_by_name(params[:package_name])
end
+
+ def filter_with_version(packages)
+ return packages if params[:include_versionless].present?
+
+ packages.has_version
+ end
end
end
diff --git a/app/finders/packages/maven/package_finder.rb b/app/finders/packages/maven/package_finder.rb
index 775db12adb7..7e753705cbd 100644
--- a/app/finders/packages/maven/package_finder.rb
+++ b/app/finders/packages/maven/package_finder.rb
@@ -1,4 +1,5 @@
# frozen_string_literal: true
+
module Packages
module Maven
class PackageFinder
@@ -27,17 +28,22 @@ module Packages
elsif group
packages_for_multiple_projects
else
- packages
+ ::Packages::Package.none
end
end
def packages_with_path
- base.only_maven_packages_with_path(path)
+ matching_packages = base.only_maven_packages_with_path(path)
+ matching_packages = matching_packages.order_by_package_file if versionless_package?(matching_packages)
+
+ matching_packages
end
- # Produces a query that returns all packages.
- def packages
- ::Packages::Package.all
+ def versionless_package?(matching_packages)
+ return if matching_packages.empty?
+
+ # if one matching package is versionless, they all are.
+ matching_packages.first&.version.nil?
end
# Produces a query that retrieves packages from a single project.
diff --git a/app/finders/packages/nuget/package_finder.rb b/app/finders/packages/nuget/package_finder.rb
index e6fb6712d47..8f585f045a1 100644
--- a/app/finders/packages/nuget/package_finder.rb
+++ b/app/finders/packages/nuget/package_finder.rb
@@ -1,11 +1,15 @@
# frozen_string_literal: true
+
module Packages
module Nuget
class PackageFinder
+ include ::Packages::FinderHelper
+
MAX_PACKAGES_COUNT = 50
- def initialize(project, package_name:, package_version: nil, limit: MAX_PACKAGES_COUNT)
- @project = project
+ def initialize(current_user, project_or_group, package_name:, package_version: nil, limit: MAX_PACKAGES_COUNT)
+ @current_user = current_user
+ @project_or_group = project_or_group
@package_name = package_name
@package_version = package_version
@limit = limit
@@ -17,15 +21,32 @@ module Packages
private
+ def base
+ if project?
+ @project_or_group.packages
+ elsif group?
+ packages_visible_to_user(@current_user, within_group: @project_or_group)
+ else
+ ::Packages::Package.none
+ end
+ end
+
def packages
- result = @project.packages
- .nuget
- .has_version
- .processed
- .with_name_like(@package_name)
+ result = base.nuget
+ .has_version
+ .processed
+ .with_name_like(@package_name)
result = result.with_version(@package_version) if @package_version.present?
result
end
+
+ def project?
+ @project_or_group.is_a?(::Project)
+ end
+
+ def group?
+ @project_or_group.is_a?(::Group)
+ end
end
end
end
diff --git a/app/finders/packages/packages_finder.rb b/app/finders/packages/packages_finder.rb
index 519e8bf9c34..72a63224d2f 100644
--- a/app/finders/packages/packages_finder.rb
+++ b/app/finders/packages/packages_finder.rb
@@ -18,7 +18,7 @@ module Packages
.including_project_route
.including_tags
.processed
- .has_version
+ packages = filter_with_version(packages)
packages = filter_by_package_type(packages)
packages = filter_by_package_name(packages)
packages = order_packages(packages)
@@ -27,6 +27,12 @@ module Packages
private
+ def filter_with_version(packages)
+ return packages if params[:include_versionless].present?
+
+ packages.has_version
+ end
+
def filter_by_package_type(packages)
return packages unless params[:package_type]
diff --git a/app/finders/projects_finder.rb b/app/finders/projects_finder.rb
index 05dc69ebff6..f1df4fbb0d8 100644
--- a/app/finders/projects_finder.rb
+++ b/app/finders/projects_finder.rb
@@ -52,7 +52,7 @@ class ProjectsFinder < UnionFinder
collection = Project.wrap_with_cte(collection) if use_cte
collection = filter_projects(collection)
- if params[:sort] == 'similarity' && params[:search] && Feature.enabled?(:project_finder_similarity_sort)
+ if params[:sort] == 'similarity' && params[:search] && Feature.enabled?(:project_finder_similarity_sort, current_user)
collection.sorted_by_similarity_desc(params[:search])
else
sort(collection)
diff --git a/app/finders/template_finder.rb b/app/finders/template_finder.rb
index a35376e905e..dac7c526474 100644
--- a/app/finders/template_finder.rb
+++ b/app/finders/template_finder.rb
@@ -7,6 +7,7 @@ class TemplateFinder
dockerfiles: ::Gitlab::Template::DockerfileTemplate,
gitignores: ::Gitlab::Template::GitignoreTemplate,
gitlab_ci_ymls: ::Gitlab::Template::GitlabCiYmlTemplate,
+ gitlab_ci_syntax_ymls: ::Gitlab::Template::GitlabCiSyntaxYmlTemplate,
metrics_dashboard_ymls: ::Gitlab::Template::MetricsDashboardTemplate,
issues: ::Gitlab::Template::IssueTemplate,
merge_requests: ::Gitlab::Template::MergeRequestTemplate
diff --git a/app/finders/users_finder.rb b/app/finders/users_finder.rb
index cc94536bf79..42042406f3f 100644
--- a/app/finders/users_finder.rb
+++ b/app/finders/users_finder.rb
@@ -34,6 +34,7 @@ class UsersFinder
users = User.all.order_id_desc
users = by_username(users)
users = by_id(users)
+ users = by_admins(users)
users = by_search(users)
users = by_blocked(users)
users = by_active(users)
@@ -62,6 +63,12 @@ class UsersFinder
users.id_in(params[:id])
end
+ def by_admins(users)
+ return users unless params[:admins] && current_user&.can_read_all_resources?
+
+ users.admins
+ end
+
def by_search(users)
return users unless params[:search].present?