diff options
Diffstat (limited to 'app/presenters')
-rw-r--r-- | app/presenters/blob_presenter.rb | 29 | ||||
-rw-r--r-- | app/presenters/ci/pipeline_presenter.rb | 26 | ||||
-rw-r--r-- | app/presenters/merge_request_presenter.rb | 4 | ||||
-rw-r--r-- | app/presenters/ml/candidate_details_presenter.rb | 5 | ||||
-rw-r--r-- | app/presenters/packages/conan/package_presenter.rb | 5 | ||||
-rw-r--r-- | app/presenters/packages/nuget/packages_metadata_presenter.rb | 7 | ||||
-rw-r--r-- | app/presenters/packages/nuget/presenter_helpers.rb | 11 | ||||
-rw-r--r-- | app/presenters/packages/nuget/search_results_presenter.rb | 37 | ||||
-rw-r--r-- | app/presenters/packages/nuget/service_index_presenter.rb | 21 | ||||
-rw-r--r-- | app/presenters/packages/nuget/version_helpers.rb | 88 | ||||
-rw-r--r-- | app/presenters/tree_entry_presenter.rb | 17 | ||||
-rw-r--r-- | app/presenters/work_item_presenter.rb | 4 |
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 |