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:
Diffstat (limited to 'app/presenters')
-rw-r--r--app/presenters/blob_presenter.rb29
-rw-r--r--app/presenters/ci/pipeline_presenter.rb26
-rw-r--r--app/presenters/merge_request_presenter.rb4
-rw-r--r--app/presenters/ml/candidate_details_presenter.rb5
-rw-r--r--app/presenters/packages/conan/package_presenter.rb5
-rw-r--r--app/presenters/packages/nuget/packages_metadata_presenter.rb7
-rw-r--r--app/presenters/packages/nuget/presenter_helpers.rb11
-rw-r--r--app/presenters/packages/nuget/search_results_presenter.rb37
-rw-r--r--app/presenters/packages/nuget/service_index_presenter.rb21
-rw-r--r--app/presenters/packages/nuget/version_helpers.rb88
-rw-r--r--app/presenters/tree_entry_presenter.rb17
-rw-r--r--app/presenters/work_item_presenter.rb4
12 files changed, 198 insertions, 56 deletions
diff --git a/app/presenters/blob_presenter.rb b/app/presenters/blob_presenter.rb
index f25436c54be..cd473152b41 100644
--- a/app/presenters/blob_presenter.rb
+++ b/app/presenters/blob_presenter.rb
@@ -56,23 +56,23 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
end
def web_url
- url_helpers.project_blob_url(project, ref_qualified_path)
+ url_helpers.project_blob_url(*path_params)
end
def web_path
- url_helpers.project_blob_path(project, ref_qualified_path)
+ url_helpers.project_blob_path(*path_params)
end
def edit_blob_path
- url_helpers.project_edit_blob_path(project, ref_qualified_path)
+ url_helpers.project_edit_blob_path(*path_params)
end
def raw_path
- url_helpers.project_raw_path(project, ref_qualified_path)
+ url_helpers.project_raw_path(*path_params)
end
def replace_path
- url_helpers.project_update_blob_path(project, ref_qualified_path)
+ url_helpers.project_update_blob_path(*path_params)
end
def pipeline_editor_path
@@ -164,6 +164,18 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
private
+ def path_params
+ if ref_type.present?
+ [project, ref_qualified_path, { ref_type: ref_type }]
+ else
+ [project, ref_qualified_path]
+ end
+ end
+
+ def ref_type
+ blob.ref_type
+ end
+
def url_helpers
Gitlab::Routing.url_helpers
end
@@ -179,7 +191,12 @@ class BlobPresenter < Gitlab::View::Presenter::Delegated
end
def ref_qualified_path
- File.join(blob.commit_id, blob.path)
+ # If `ref_type` is present the commit_id will include the ref qualifier e.g. `refs/heads/`.
+ # We only accept/return unqualified refs so we need to remove the qualifier from the `commit_id`.
+
+ commit_id = ExtractsRef.unqualify_ref(blob.commit_id, ref_type)
+
+ File.join(commit_id, blob.path)
end
def load_all_blob_data
diff --git a/app/presenters/ci/pipeline_presenter.rb b/app/presenters/ci/pipeline_presenter.rb
index 8c9ff49b0e7..3aba5a2c7ed 100644
--- a/app/presenters/ci/pipeline_presenter.rb
+++ b/app/presenters/ci/pipeline_presenter.rb
@@ -65,7 +65,7 @@ module Ci
'%.2f' % pipeline.coverage
end
- def ref_text
+ def ref_text_legacy
if pipeline.detached_merge_request_pipeline?
_("for %{link_to_merge_request} with %{link_to_merge_request_source_branch}")
.html_safe % {
@@ -87,6 +87,28 @@ module Ci
end
end
+ def ref_text
+ if pipeline.detached_merge_request_pipeline?
+ _("Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch}")
+ .html_safe % {
+ link_to_merge_request: link_to_merge_request,
+ link_to_merge_request_source_branch: link_to_merge_request_source_branch
+ }
+ elsif pipeline.merged_result_pipeline?
+ _("Related merge request %{link_to_merge_request} to merge %{link_to_merge_request_source_branch} into %{link_to_merge_request_target_branch}")
+ .html_safe % {
+ link_to_merge_request: link_to_merge_request,
+ link_to_merge_request_source_branch: link_to_merge_request_source_branch,
+ link_to_merge_request_target_branch: link_to_merge_request_target_branch
+ }
+ elsif pipeline.ref && pipeline.ref_exists?
+ _("For %{link_to_pipeline_ref}")
+ .html_safe % { link_to_pipeline_ref: link_to_pipeline_ref }
+ elsif pipeline.ref
+ _("For %{ref}").html_safe % { ref: plain_ref_name }
+ end
+ end
+
def all_related_merge_request_text(limit: nil)
if all_related_merge_requests.none?
_("No related merge requests found.")
@@ -106,7 +128,7 @@ module Ci
def link_to_pipeline_ref
ApplicationController.helpers.link_to(pipeline.ref,
project_commits_path(pipeline.project, pipeline.ref),
- class: "ref-name")
+ class: "ref-name gl-link gl-bg-blue-50 gl-rounded-base gl-px-2")
end
def link_to_merge_request
diff --git a/app/presenters/merge_request_presenter.rb b/app/presenters/merge_request_presenter.rb
index 12f4b0496e4..8d2baa6ee99 100644
--- a/app/presenters/merge_request_presenter.rb
+++ b/app/presenters/merge_request_presenter.rb
@@ -197,7 +197,7 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated
def source_branch_link
if source_branch_exists?
- link_to(source_branch, source_branch_commits_path, class: 'ref-name')
+ link_to(source_branch, source_branch_commits_path, class: 'ref-name gl-link gl-bg-blue-50 gl-rounded-base gl-px-2')
else
content_tag(:span, source_branch, class: 'ref-name')
end
@@ -205,7 +205,7 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated
def target_branch_link
if target_branch_exists?
- link_to(target_branch, target_branch_commits_path, class: 'ref-name')
+ link_to(target_branch, target_branch_commits_path, class: 'ref-name gl-link gl-bg-blue-50 gl-rounded-base gl-px-2')
else
content_tag(:span, target_branch, class: 'ref-name')
end
diff --git a/app/presenters/ml/candidate_details_presenter.rb b/app/presenters/ml/candidate_details_presenter.rb
index 58ec2aee471..7f0bd9d6c11 100644
--- a/app/presenters/ml/candidate_details_presenter.rb
+++ b/app/presenters/ml/candidate_details_presenter.rb
@@ -53,7 +53,9 @@ module Ml
{
user: {
path: user_path(user),
- username: user.username
+ username: user.username,
+ name: user.name,
+ avatar: user.avatar_url
}
}
end
@@ -64,6 +66,7 @@ module Ml
{
merge_request: {
path: project_merge_request_path(mr.project, mr),
+ iid: mr.iid,
title: mr.title
}
}
diff --git a/app/presenters/packages/conan/package_presenter.rb b/app/presenters/packages/conan/package_presenter.rb
index 0c7a81038dd..2fab074c69c 100644
--- a/app/presenters/packages/conan/package_presenter.rb
+++ b/app/presenters/packages/conan/package_presenter.rb
@@ -80,10 +80,9 @@ module Packages
def package_files
return unless @package
- strong_memoize(:package_files) do
- @package.installable_package_files.preload_conan_file_metadata
- end
+ @package.installable_package_files.preload_conan_file_metadata
end
+ strong_memoize_attr :package_files
def matching_reference?(package_file)
package_file.conan_file_metadatum.conan_package_reference == conan_package_reference
diff --git a/app/presenters/packages/nuget/packages_metadata_presenter.rb b/app/presenters/packages/nuget/packages_metadata_presenter.rb
index 9f1dee17cea..f87f447fb23 100644
--- a/app/presenters/packages/nuget/packages_metadata_presenter.rb
+++ b/app/presenters/packages/nuget/packages_metadata_presenter.rb
@@ -59,11 +59,10 @@ module Packages
end
def sorted_versions
- strong_memoize(:sorted_versions) do
- versions = @packages.map(&:version).compact
- VersionSorter.sort(versions)
- end
+ versions = @packages.filter_map(&:version)
+ sort_versions(versions)
end
+ strong_memoize_attr :sorted_versions
end
end
end
diff --git a/app/presenters/packages/nuget/presenter_helpers.rb b/app/presenters/packages/nuget/presenter_helpers.rb
index 82ed80d8372..16c32a9d0d0 100644
--- a/app/presenters/packages/nuget/presenter_helpers.rb
+++ b/app/presenters/packages/nuget/presenter_helpers.rb
@@ -4,8 +4,8 @@ module Packages
module Nuget
module PresenterHelpers
include ::API::Helpers::RelatedResourcesHelpers
+ include Packages::Nuget::VersionHelpers
- BLANK_STRING = ''
PACKAGE_DEPENDENCY_GROUP = 'PackageDependencyGroup'
PACKAGE_DEPENDENCY = 'PackageDependency'
@@ -45,14 +45,13 @@ module Packages
def catalog_entry_for(package)
{
json_url: json_url_for(package),
- authors: BLANK_STRING,
dependency_groups: dependency_groups_for(package),
package_name: package.name,
package_version: package.version,
archive_url: archive_url_for(package),
- summary: BLANK_STRING,
tags: tags_for(package),
- metadatum: metadatum_for(package)
+ metadatum: metadatum_for(package),
+ published: package.created_at.iso8601
}
end
@@ -98,8 +97,8 @@ module Packages
metadatum = package.nuget_metadatum
return {} unless metadatum
- metadatum.slice(:project_url, :license_url, :icon_url)
- .compact
+ metadatum.slice(:authors, :description, :project_url, :license_url, :icon_url)
+ .compact
end
def base_path_for(package)
diff --git a/app/presenters/packages/nuget/search_results_presenter.rb b/app/presenters/packages/nuget/search_results_presenter.rb
index dc391c380f3..020e8656a36 100644
--- a/app/presenters/packages/nuget/search_results_presenter.rb
+++ b/app/presenters/packages/nuget/search_results_presenter.rb
@@ -14,26 +14,23 @@ module Packages
end
def data
- strong_memoize(:data) do
- @search.results.group_by(&:name).map do |package_name, packages|
- latest_version = latest_version(packages)
- latest_package = packages.find { |pkg| pkg.version == latest_version }
-
- {
- type: 'Package',
- authors: '',
- name: package_name,
- version: latest_version,
- versions: build_package_versions(packages),
- summary: '',
- total_downloads: 0,
- verified: true,
- tags: tags_for(latest_package),
- metadatum: metadatum_for(latest_package)
- }
- end
+ @search.results.group_by(&:name).map do |package_name, packages|
+ latest_version = latest_version(packages)
+ latest_package = packages.find { |pkg| pkg.version == latest_version }
+
+ {
+ type: 'Package',
+ name: package_name,
+ version: latest_version,
+ versions: build_package_versions(packages),
+ total_downloads: 0,
+ verified: true,
+ tags: tags_for(latest_package),
+ metadatum: metadatum_for(latest_package)
+ }
end
end
+ strong_memoize_attr :data
private
@@ -48,8 +45,8 @@ module Packages
end
def latest_version(packages)
- versions = packages.map(&:version).compact
- VersionSorter.sort(versions).last # rubocop: disable Style/RedundantSort
+ versions = packages.filter_map(&:version)
+ sort_versions(versions).last
end
end
end
diff --git a/app/presenters/packages/nuget/service_index_presenter.rb b/app/presenters/packages/nuget/service_index_presenter.rb
index 033a1845c1c..b262735508c 100644
--- a/app/presenters/packages/nuget/service_index_presenter.rb
+++ b/app/presenters/packages/nuget/service_index_presenter.rb
@@ -35,12 +35,13 @@ module Packages
end
def resources
- available_services.map { |service| build_service(service) }
- .flatten
+ available_services.flat_map { |service| build_service(service) }
end
private
+ attr_reader :project_or_group
+
def available_services
case scope
when :group
@@ -77,13 +78,13 @@ module Packages
end
def scope
- return :project if @project_or_group.is_a?(::Project)
- return :group if @project_or_group.is_a?(::Group)
+ return :project if project_or_group.is_a?(::Project)
+ return :group if project_or_group.is_a?(::Group)
end
def download_service_url
params = {
- id: @project_or_group.id,
+ id: project_or_group.id,
package_name: nil,
package_version: nil,
package_filename: nil
@@ -97,7 +98,7 @@ module Packages
def metadata_service_url
params = {
- id: @project_or_group.id,
+ id: project_or_group.id,
package_name: nil,
package_version: nil
}
@@ -119,18 +120,18 @@ module Packages
def search_service_url
case scope
when :group
- api_v4_groups___packages_nuget_query_path(id: @project_or_group.id)
+ api_v4_groups___packages_nuget_query_path(id: project_or_group.id)
when :project
- api_v4_projects_packages_nuget_query_path(id: @project_or_group.id)
+ api_v4_projects_packages_nuget_query_path(id: project_or_group.id)
end
end
def publish_service_url
- api_v4_projects_packages_nuget_path(id: @project_or_group.id)
+ api_v4_projects_packages_nuget_path(id: project_or_group.id)
end
def symbol_service_url
- api_v4_projects_packages_nuget_symbolpackage_path(id: @project_or_group.id)
+ api_v4_projects_packages_nuget_symbolpackage_path(id: project_or_group.id)
end
end
end
diff --git a/app/presenters/packages/nuget/version_helpers.rb b/app/presenters/packages/nuget/version_helpers.rb
new file mode 100644
index 00000000000..8c9c82791b3
--- /dev/null
+++ b/app/presenters/packages/nuget/version_helpers.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+module Packages
+ module Nuget
+ module VersionHelpers
+ private
+
+ def sort_versions(versions)
+ versions.sort { |a, b| compare_versions(a, b) }
+ end
+
+ # NuGet version sorting algorithm as per https://semver.org/spec/v2.0.0.html#spec-item-11
+ def compare_versions(version_a, version_b)
+ return 0 if version_a == version_b
+ return 1 if version_b.nil?
+ return -1 if version_a.nil?
+
+ a_without_build_meta, a_build_meta = version_a.split('+', 2)
+ b_without_build_meta, b_build_meta = version_b.split('+', 2)
+
+ a_core, a_pre = a_without_build_meta.split(/-/, 2)
+ b_core, b_pre = b_without_build_meta.split(/-/, 2)
+
+ a_core_parts = a_core.split('.')
+ b_core_parts = b_core.split('.')
+
+ compare_core_parts(a_core_parts, b_core_parts) ||
+ compare_pre_release_parts(a_pre, b_pre) ||
+ pick_non_nil(a_pre, b_pre) ||
+ compare_build_meta_parts(a_build_meta, b_build_meta)
+ end
+
+ def compare_core_parts(a_core_parts, b_core_parts)
+ while a_core_parts.any? || b_core_parts.any?
+ a_part = a_core_parts.shift&.to_i || 0
+ b_part = b_core_parts.shift&.to_i || 0
+ return a_part <=> b_part if a_part != b_part
+ end
+ end
+
+ def compare_pre_release_parts(a_pre, b_pre)
+ return unless a_pre && b_pre
+
+ a_pre_parts = a_pre.split('.').map(&:downcase)
+ b_pre_parts = b_pre.split('.').map(&:downcase)
+
+ while a_pre_parts.any? || b_pre_parts.any?
+ a_pre_part = a_pre_parts.shift
+ b_pre_part = b_pre_parts.shift
+
+ # Empty parts are considered lower
+ return -1 if a_pre_part.nil?
+ return 1 if b_pre_part.nil?
+
+ a_num = a_pre_part.to_i
+ b_num = b_pre_part.to_i
+ next if a_num == b_num && a_pre_part.to_s == b_pre_part.to_s # Both are same numeric/alphanumeric parts
+
+ return select_numeric_before_alphanumeric(a_num, a_pre_part, b_num, b_pre_part) ||
+ compare_numeric_parts(a_pre_part, a_num, b_pre_part, b_num) ||
+ a_pre_part <=> b_pre_part
+ end
+ end
+
+ def compare_build_meta_parts(a_build_meta, b_build_meta)
+ (a_build_meta || '').casecmp(b_build_meta || '')
+ end
+
+ def select_numeric_before_alphanumeric(a_num, a_pre_part, b_num, b_pre_part)
+ return -1 if a_num != b_num && numeric?(a_pre_part) && !numeric?(b_pre_part)
+ return 1 if a_num != b_num && !numeric?(a_pre_part) && numeric?(b_pre_part)
+ end
+
+ def numeric?(pre_part)
+ !!Integer(pre_part, exception: false)
+ end
+
+ def compare_numeric_parts(a_pre_part, a_num, b_pre_part, b_num)
+ a_num <=> b_num if a_num != b_num && numeric?(a_pre_part) && numeric?(b_pre_part)
+ end
+
+ def pick_non_nil(var_a, var_b)
+ return -1 if var_a && !var_b
+ return 1 if !var_a && var_b
+ end
+ end
+ end
+end
diff --git a/app/presenters/tree_entry_presenter.rb b/app/presenters/tree_entry_presenter.rb
index 0b313d81360..3f4a9f13c36 100644
--- a/app/presenters/tree_entry_presenter.rb
+++ b/app/presenters/tree_entry_presenter.rb
@@ -4,10 +4,23 @@ class TreeEntryPresenter < Gitlab::View::Presenter::Delegated
presents nil, as: :tree
def web_url
- Gitlab::Routing.url_helpers.project_tree_url(tree.repository.project, File.join(tree.commit_id, tree.path))
+ Gitlab::Routing.url_helpers.project_tree_url(tree.repository.project, ref_qualified_path,
+ ref_type: tree.ref_type)
end
def web_path
- Gitlab::Routing.url_helpers.project_tree_path(tree.repository.project, File.join(tree.commit_id, tree.path))
+ Gitlab::Routing.url_helpers.project_tree_path(tree.repository.project, ref_qualified_path,
+ ref_type: tree.ref_type)
+ end
+
+ private
+
+ def ref_qualified_path
+ # If `ref_type` is present the commit_id will include the ref qualifier e.g. `refs/heads/`.
+ # We only accept/return unqualified refs so we need to remove the qualifier from the `commit_id`.
+
+ commit_id = ExtractsRef.unqualify_ref(tree.commit_id, ref_type)
+
+ File.join(commit_id, tree.path)
end
end
diff --git a/app/presenters/work_item_presenter.rb b/app/presenters/work_item_presenter.rb
new file mode 100644
index 00000000000..995f2d02156
--- /dev/null
+++ b/app/presenters/work_item_presenter.rb
@@ -0,0 +1,4 @@
+# frozen_string_literal: true
+
+class WorkItemPresenter < IssuePresenter # rubocop:todo Gitlab/NamespacedClass
+end