Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
4bb7b91adf
commit
fda0e422a7
|
@ -12,6 +12,8 @@ module Types
|
||||||
|
|
||||||
field :id, ::Types::GlobalIDType[::Packages::Package], null: false, description: 'ID of the package.'
|
field :id, ::Types::GlobalIDType[::Packages::Package], null: false, description: 'ID of the package.'
|
||||||
|
|
||||||
|
field :_links, Types::Packages::PackageLinksType, null: false, method: :itself,
|
||||||
|
description: 'Map of links to perform actions on the package.'
|
||||||
field :can_destroy, GraphQL::Types::Boolean, null: false, description: 'Whether the user can destroy the package.'
|
field :can_destroy, GraphQL::Types::Boolean, null: false, description: 'Whether the user can destroy the package.'
|
||||||
field :created_at, Types::TimeType, null: false, description: 'Date of creation.'
|
field :created_at, Types::TimeType, null: false, description: 'Date of creation.'
|
||||||
field :metadata, Types::Packages::MetadataType,
|
field :metadata, Types::Packages::MetadataType,
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Types
|
||||||
|
module Packages
|
||||||
|
class PackageLinksType < BaseObject
|
||||||
|
graphql_name 'PackageLinks'
|
||||||
|
description 'Represents links to perform actions on the package'
|
||||||
|
authorize :read_package
|
||||||
|
|
||||||
|
include ::Routing::PackagesHelper
|
||||||
|
|
||||||
|
field :web_path, GraphQL::Types::String, null: true, description: 'Path to the package details page.'
|
||||||
|
|
||||||
|
def web_path
|
||||||
|
package_path(object)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -17,6 +17,7 @@ module GitlabRoutingHelper
|
||||||
include ::Routing::WikiHelper
|
include ::Routing::WikiHelper
|
||||||
include ::Routing::GraphqlHelper
|
include ::Routing::GraphqlHelper
|
||||||
include ::Routing::PseudonymizationHelper
|
include ::Routing::PseudonymizationHelper
|
||||||
|
include ::Routing::PackagesHelper
|
||||||
included do
|
included do
|
||||||
Gitlab::Routing.includes_helpers(self)
|
Gitlab::Routing.includes_helpers(self)
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Routing
|
||||||
|
module PackagesHelper
|
||||||
|
def package_path(package, **options)
|
||||||
|
Gitlab::UrlBuilder.build(package, only_path: true, **options)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -5,6 +5,7 @@ module Ci
|
||||||
include Ci::HasVariable
|
include Ci::HasVariable
|
||||||
include Presentable
|
include Presentable
|
||||||
include Ci::Maskable
|
include Ci::Maskable
|
||||||
|
include Ci::RawVariable
|
||||||
prepend HasEnvironmentScope
|
prepend HasEnvironmentScope
|
||||||
|
|
||||||
belongs_to :group, class_name: "::Group"
|
belongs_to :group, class_name: "::Group"
|
||||||
|
|
|
@ -5,6 +5,7 @@ module Ci
|
||||||
extend Gitlab::ProcessMemoryCache::Helper
|
extend Gitlab::ProcessMemoryCache::Helper
|
||||||
include Ci::NewHasVariable
|
include Ci::NewHasVariable
|
||||||
include Ci::Maskable
|
include Ci::Maskable
|
||||||
|
include Ci::RawVariable
|
||||||
include Limitable
|
include Limitable
|
||||||
|
|
||||||
self.limit_name = 'ci_instance_level_variables'
|
self.limit_name = 'ci_instance_level_variables'
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
module Ci
|
module Ci
|
||||||
class JobVariable < Ci::ApplicationRecord
|
class JobVariable < Ci::ApplicationRecord
|
||||||
include Ci::NewHasVariable
|
include Ci::NewHasVariable
|
||||||
|
include Ci::RawVariable
|
||||||
include BulkInsertSafe
|
include BulkInsertSafe
|
||||||
|
|
||||||
belongs_to :job, class_name: "Ci::Build", foreign_key: :job_id
|
belongs_to :job, class_name: "Ci::Build", foreign_key: :job_id
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
module Ci
|
module Ci
|
||||||
class PipelineScheduleVariable < Ci::ApplicationRecord
|
class PipelineScheduleVariable < Ci::ApplicationRecord
|
||||||
include Ci::HasVariable
|
include Ci::HasVariable
|
||||||
|
include Ci::RawVariable
|
||||||
|
|
||||||
belongs_to :pipeline_schedule
|
belongs_to :pipeline_schedule
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ module Ci
|
||||||
class PipelineVariable < Ci::ApplicationRecord
|
class PipelineVariable < Ci::ApplicationRecord
|
||||||
include Ci::Partitionable
|
include Ci::Partitionable
|
||||||
include Ci::HasVariable
|
include Ci::HasVariable
|
||||||
|
include Ci::RawVariable
|
||||||
|
|
||||||
belongs_to :pipeline
|
belongs_to :pipeline
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ module Ci
|
||||||
include Ci::HasVariable
|
include Ci::HasVariable
|
||||||
include Presentable
|
include Presentable
|
||||||
include Ci::Maskable
|
include Ci::Maskable
|
||||||
|
include Ci::RawVariable
|
||||||
prepend HasEnvironmentScope
|
prepend HasEnvironmentScope
|
||||||
|
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Ci
|
||||||
|
module RawVariable
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
validates :raw, inclusion: { in: [true, false] }
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def uncached_runner_variable
|
||||||
|
super.merge(raw: raw?)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -54,7 +54,7 @@
|
||||||
= hidden_field_tag "filter", h(params[:filter])
|
= hidden_field_tag "filter", h(params[:filter])
|
||||||
.search-holder
|
.search-holder
|
||||||
.search-field-holder.gl-mb-4
|
.search-field-holder.gl-mb-4
|
||||||
= search_field_tag :search_query, params[:search_query], placeholder: s_('AdminUsers|Search by name, email or username'), class: 'form-control search-text-input js-search-input', spellcheck: false, data: { qa_selector: 'user_search_field' }
|
= search_field_tag :search_query, params[:search_query], placeholder: s_('AdminUsers|Search by name, email, or username'), class: 'form-control search-text-input js-search-input', spellcheck: false, data: { qa_selector: 'user_search_field' }
|
||||||
- if @sort.present?
|
- if @sort.present?
|
||||||
= hidden_field_tag :sort, @sort
|
= hidden_field_tag :sort, @sort
|
||||||
= sprite_icon('search', css_class: 'search-icon')
|
= sprite_icon('search', css_class: 'search-icon')
|
||||||
|
|
|
@ -15696,6 +15696,7 @@ Represents a package with pipelines in the Package Registry.
|
||||||
|
|
||||||
| Name | Type | Description |
|
| Name | Type | Description |
|
||||||
| ---- | ---- | ----------- |
|
| ---- | ---- | ----------- |
|
||||||
|
| <a id="package_links"></a>`_links` | [`PackageLinks!`](#packagelinks) | Map of links to perform actions on the package. |
|
||||||
| <a id="packagecandestroy"></a>`canDestroy` | [`Boolean!`](#boolean) | Whether the user can destroy the package. |
|
| <a id="packagecandestroy"></a>`canDestroy` | [`Boolean!`](#boolean) | Whether the user can destroy the package. |
|
||||||
| <a id="packagecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. |
|
| <a id="packagecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. |
|
||||||
| <a id="packageid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
|
| <a id="packageid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
|
||||||
|
@ -15717,6 +15718,7 @@ Represents a package in the Package Registry.
|
||||||
|
|
||||||
| Name | Type | Description |
|
| Name | Type | Description |
|
||||||
| ---- | ---- | ----------- |
|
| ---- | ---- | ----------- |
|
||||||
|
| <a id="packagebase_links"></a>`_links` | [`PackageLinks!`](#packagelinks) | Map of links to perform actions on the package. |
|
||||||
| <a id="packagebasecandestroy"></a>`canDestroy` | [`Boolean!`](#boolean) | Whether the user can destroy the package. |
|
| <a id="packagebasecandestroy"></a>`canDestroy` | [`Boolean!`](#boolean) | Whether the user can destroy the package. |
|
||||||
| <a id="packagebasecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. |
|
| <a id="packagebasecreatedat"></a>`createdAt` | [`Time!`](#time) | Date of creation. |
|
||||||
| <a id="packagebaseid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
|
| <a id="packagebaseid"></a>`id` | [`PackagesPackageID!`](#packagespackageid) | ID of the package. |
|
||||||
|
@ -15775,6 +15777,7 @@ Represents a package details in the Package Registry.
|
||||||
|
|
||||||
| Name | Type | Description |
|
| Name | Type | Description |
|
||||||
| ---- | ---- | ----------- |
|
| ---- | ---- | ----------- |
|
||||||
|
| <a id="packagedetailstype_links"></a>`_links` | [`PackageLinks!`](#packagelinks) | Map of links to perform actions on the package. |
|
||||||
| <a id="packagedetailstypecandestroy"></a>`canDestroy` | [`Boolean!`](#boolean) | Whether the user can destroy the package. |
|
| <a id="packagedetailstypecandestroy"></a>`canDestroy` | [`Boolean!`](#boolean) | Whether the user can destroy the package. |
|
||||||
| <a id="packagedetailstypecomposerconfigrepositoryurl"></a>`composerConfigRepositoryUrl` | [`String`](#string) | Url of the Composer setup endpoint. |
|
| <a id="packagedetailstypecomposerconfigrepositoryurl"></a>`composerConfigRepositoryUrl` | [`String`](#string) | Url of the Composer setup endpoint. |
|
||||||
| <a id="packagedetailstypecomposerurl"></a>`composerUrl` | [`String`](#string) | Url of the Composer endpoint. |
|
| <a id="packagedetailstypecomposerurl"></a>`composerUrl` | [`String`](#string) | Url of the Composer endpoint. |
|
||||||
|
@ -15893,6 +15896,16 @@ Represents the contents of a Helm Chart.yml file.
|
||||||
| <a id="packagehelmmetadatatypetype"></a>`type` | [`String`](#string) | Type of the chart. |
|
| <a id="packagehelmmetadatatypetype"></a>`type` | [`String`](#string) | Type of the chart. |
|
||||||
| <a id="packagehelmmetadatatypeversion"></a>`version` | [`String!`](#string) | Version of the chart. |
|
| <a id="packagehelmmetadatatypeversion"></a>`version` | [`String!`](#string) | Version of the chart. |
|
||||||
|
|
||||||
|
### `PackageLinks`
|
||||||
|
|
||||||
|
Represents links to perform actions on the package.
|
||||||
|
|
||||||
|
#### Fields
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ---- | ---- | ----------- |
|
||||||
|
| <a id="packagelinkswebpath"></a>`webPath` | [`String`](#string) | Path to the package details page. |
|
||||||
|
|
||||||
### `PackageSettings`
|
### `PackageSettings`
|
||||||
|
|
||||||
Namespace-level Package Registry settings.
|
Namespace-level Package Registry settings.
|
||||||
|
|
|
@ -215,6 +215,42 @@ def down
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Indexes for partitioned tables
|
||||||
|
|
||||||
|
Indexes [cannot be created](https://www.postgresql.org/docs/15/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE-MAINTENANCE)
|
||||||
|
**concurrently** on a partitioned table. You must use `CONCURRENTLY` to avoid service disruption in a hot system.
|
||||||
|
|
||||||
|
To create an index on a partitioned table, use `add_concurrent_partitioned_index`, provided by the database team.
|
||||||
|
|
||||||
|
Under the hood, `add_concurrent_partitioned_index`:
|
||||||
|
|
||||||
|
1. Creates indexes on each partition using `CONCURRENTLY`.
|
||||||
|
1. Creates an index on the parent table.
|
||||||
|
|
||||||
|
A Rails migration example:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
# in db/post_migrate/
|
||||||
|
|
||||||
|
class AddIndexToPartitionedTable < Gitlab::Database::Migration[2.0]
|
||||||
|
include Gitlab::Database::PartitioningMigrationHelpers
|
||||||
|
|
||||||
|
disable_ddl_transaction!
|
||||||
|
|
||||||
|
TABLE_NAME = :table_name
|
||||||
|
COLUMN_NAMES = [:partition_id, :id]
|
||||||
|
INDEX_NAME = :index_name
|
||||||
|
|
||||||
|
def up
|
||||||
|
add_concurrent_partitioned_index(TABLE_NAME, COLUMN_NAMES, name: INDEX_NAME)
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
remove_concurrent_partitioned_index_by_name(TABLE_NAME, INDEX_NAME)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
## Create indexes asynchronously
|
## Create indexes asynchronously
|
||||||
|
|
||||||
For very large tables, index creation can be a challenge to manage.
|
For very large tables, index creation can be a challenge to manage.
|
||||||
|
|
|
@ -376,6 +376,8 @@ Upgrading across multiple GitLab versions in one go is *only possible by accepti
|
||||||
The following examples assume downtime is acceptable while upgrading.
|
The following examples assume downtime is acceptable while upgrading.
|
||||||
If you don't want any downtime, read how to [upgrade with zero downtime](zero_downtime.md).
|
If you don't want any downtime, read how to [upgrade with zero downtime](zero_downtime.md).
|
||||||
|
|
||||||
|
For a dynamic view of examples of supported upgrade paths, try the [Upgrade Path tool](https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/) maintained by the [GitLab Support team](https://about.gitlab.com/handbook/support/#about-the-support-team). To share feedback and help improve the tool, create an issue or MR in the [upgrade-path project](https://gitlab.com/gitlab-com/support/toolbox/upgrade-path).
|
||||||
|
|
||||||
Find where your version sits in the upgrade path below, and upgrade GitLab
|
Find where your version sits in the upgrade path below, and upgrade GitLab
|
||||||
accordingly, while also consulting the
|
accordingly, while also consulting the
|
||||||
[version-specific upgrade instructions](#version-specific-upgrading-instructions):
|
[version-specific upgrade instructions](#version-specific-upgrading-instructions):
|
||||||
|
@ -392,8 +394,6 @@ The following table, while not exhaustive, shows some examples of the supported
|
||||||
upgrade paths.
|
upgrade paths.
|
||||||
Additional steps between the mentioned versions are possible. We list the minimally necessary steps only.
|
Additional steps between the mentioned versions are possible. We list the minimally necessary steps only.
|
||||||
|
|
||||||
For a dynamic view of examples of supported upgrade paths, try the [Upgrade Path tool](https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/). The Upgrade Path tool is maintained by the [GitLab Support team](https://about.gitlab.com/handbook/support/#about-the-support-team). Share feedback and help improve the tool by raising an issue or MR in the [upgrade-path project](https://gitlab.com/gitlab-com/support/toolbox/upgrade-path).
|
|
||||||
|
|
||||||
| Target version | Your version | Supported upgrade path | Note |
|
| Target version | Your version | Supported upgrade path | Note |
|
||||||
| -------------- | ------------ | ---------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
| -------------- | ------------ | ---------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| `15.1.0` | `14.6.2` | `14.6.2` -> `14.9.5` -> `14.10.5` -> `15.0.2` -> `15.1.0` | Three intermediate versions are required: `14.9` and `14.10`, `15.0`, then `15.1.0`. |
|
| `15.1.0` | `14.6.2` | `14.6.2` -> `14.9.5` -> `14.10.5` -> `15.0.2` -> `15.1.0` | Three intermediate versions are required: `14.9` and `14.10`, `15.0`, then `15.1.0`. |
|
||||||
|
|
|
@ -4,6 +4,7 @@ module API
|
||||||
module Entities
|
module Entities
|
||||||
class Package < Grape::Entity
|
class Package < Grape::Entity
|
||||||
include ::API::Helpers::RelatedResourcesHelpers
|
include ::API::Helpers::RelatedResourcesHelpers
|
||||||
|
include ::Routing::PackagesHelper
|
||||||
extend ::API::Entities::EntityHelpers
|
extend ::API::Entities::EntityHelpers
|
||||||
|
|
||||||
expose :id
|
expose :id
|
||||||
|
@ -25,12 +26,8 @@ module API
|
||||||
expose :status
|
expose :status
|
||||||
|
|
||||||
expose :_links do
|
expose :_links do
|
||||||
expose :web_path do |package, opts|
|
expose :web_path do |package|
|
||||||
if package.infrastructure_package?
|
package_path(package)
|
||||||
::Gitlab::Routing.url_helpers.namespace_project_infrastructure_registry_path(opts[:namespace], package.project, package)
|
|
||||||
else
|
|
||||||
::Gitlab::Routing.url_helpers.project_package_path(package.project, package)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
expose :delete_api_path, if: can_destroy(:package, &:project) do |package|
|
expose :delete_api_path, if: can_destroy(:package, &:project) do |package|
|
||||||
|
|
|
@ -48,9 +48,8 @@ module Gitlab
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# If `file: true` has been provided we expose it, otherwise we
|
# If `file: true` or `raw: true` has been provided we expose it, otherwise we
|
||||||
# don't expose `file` attribute at all (stems from what the runner
|
# don't expose `file` and `raw` attributes at all (stems from what the runner expects).
|
||||||
# expects).
|
|
||||||
#
|
#
|
||||||
def to_runner_variable
|
def to_runner_variable
|
||||||
@variable.reject do |hash_key, hash_value|
|
@variable.reject do |hash_key, hash_value|
|
||||||
|
|
|
@ -52,6 +52,8 @@ module Gitlab
|
||||||
wiki_page_url(object.wiki, object, **options)
|
wiki_page_url(object.wiki, object, **options)
|
||||||
when ::DesignManagement::Design
|
when ::DesignManagement::Design
|
||||||
design_url(object, **options)
|
design_url(object, **options)
|
||||||
|
when ::Packages::Package
|
||||||
|
package_url(object, **options)
|
||||||
else
|
else
|
||||||
raise NotImplementedError, "No URL builder defined for #{object.inspect}"
|
raise NotImplementedError, "No URL builder defined for #{object.inspect}"
|
||||||
end
|
end
|
||||||
|
@ -133,6 +135,17 @@ module Gitlab
|
||||||
instance.project_design_management_designs_raw_image_url(design.project, design, ref, **options)
|
instance.project_design_management_designs_raw_image_url(design.project, design, ref, **options)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def package_url(package, **options)
|
||||||
|
project = package.project
|
||||||
|
|
||||||
|
if package.infrastructure_package?
|
||||||
|
return instance.project_infrastructure_registry_url(project, package,
|
||||||
|
**options)
|
||||||
|
end
|
||||||
|
|
||||||
|
instance.project_package_url(project, package, **options)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3301,7 +3301,7 @@ msgstr ""
|
||||||
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
|
msgid "AdminUsers|Restore user access to the account, including web, Git and API."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "AdminUsers|Search by name, email or username"
|
msgid "AdminUsers|Search by name, email, or username"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "AdminUsers|Search users"
|
msgid "AdminUsers|Search users"
|
||||||
|
|
|
@ -14,7 +14,8 @@
|
||||||
"versions",
|
"versions",
|
||||||
"status",
|
"status",
|
||||||
"canDestroy",
|
"canDestroy",
|
||||||
"lastDownloadedAt"
|
"lastDownloadedAt",
|
||||||
|
"_links"
|
||||||
],
|
],
|
||||||
"properties": {
|
"properties": {
|
||||||
"id": {
|
"id": {
|
||||||
|
@ -177,6 +178,15 @@
|
||||||
},
|
},
|
||||||
"lastDownloadedAt": {
|
"lastDownloadedAt": {
|
||||||
"type": ["string", "null"]
|
"type": ["string", "null"]
|
||||||
|
},
|
||||||
|
"_links": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"webPath": {
|
||||||
|
"type": ["string", "null"]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
RSpec.describe ::Routing::PackagesHelper do
|
||||||
|
describe '#package_path' do
|
||||||
|
let(:package) { build_stubbed(:package) }
|
||||||
|
|
||||||
|
it "creates package's path" do
|
||||||
|
expect(helper.package_path(package)).to eq("/#{package.project.full_path}/-/packages/#{package.id}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -56,6 +56,7 @@ RSpec.describe Gitlab::UrlBuilder do
|
||||||
:discussion_note_on_project_snippet | ->(note) { "/#{note.project.full_path}/-/snippets/#{note.noteable_id}#note_#{note.id}" }
|
:discussion_note_on_project_snippet | ->(note) { "/#{note.project.full_path}/-/snippets/#{note.noteable_id}#note_#{note.id}" }
|
||||||
:discussion_note_on_personal_snippet | ->(note) { "/-/snippets/#{note.noteable_id}#note_#{note.id}" }
|
:discussion_note_on_personal_snippet | ->(note) { "/-/snippets/#{note.noteable_id}#note_#{note.id}" }
|
||||||
:note_on_personal_snippet | ->(note) { "/-/snippets/#{note.noteable_id}#note_#{note.id}" }
|
:note_on_personal_snippet | ->(note) { "/-/snippets/#{note.noteable_id}#note_#{note.id}" }
|
||||||
|
:package | ->(package) { "/#{package.project.full_path}/-/packages/#{package.id}" }
|
||||||
end
|
end
|
||||||
|
|
||||||
with_them do
|
with_them do
|
||||||
|
@ -196,6 +197,18 @@ RSpec.describe Gitlab::UrlBuilder do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when passing Packages::Package' do
|
||||||
|
let(:package) { build_stubbed(:terraform_module_package) }
|
||||||
|
|
||||||
|
context 'with infrastructure package' do
|
||||||
|
it 'returns the url for infrastucture registry' do
|
||||||
|
url = subject.build(package)
|
||||||
|
|
||||||
|
expect(url).to eq "#{Gitlab.config.gitlab.url}/#{package.project.full_path}/-/infrastructure_registry/#{package.id}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'when passing a DesignManagement::Design' do
|
context 'when passing a DesignManagement::Design' do
|
||||||
let(:design) { build_stubbed(:design) }
|
let(:design) { build_stubbed(:design) }
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,7 @@ RSpec.describe Ci::HasVariable do
|
||||||
key: subject.key,
|
key: subject.key,
|
||||||
value: subject.value,
|
value: subject.value,
|
||||||
public: false,
|
public: false,
|
||||||
|
raw: false,
|
||||||
masked: false
|
masked: false
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -206,5 +206,25 @@ RSpec.describe 'package details' do
|
||||||
expect(graphql_data_at(:package, :composer_config_repository_url)).to eq("localhost/#{group.id}")
|
expect(graphql_data_at(:package, :composer_config_repository_url)).to eq("localhost/#{group.id}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'web_path' do
|
||||||
|
before do
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns web_path correctly' do
|
||||||
|
expect(graphql_data_at(:package, :_links, :web_path)).to eq("/#{project.full_path}/-/packages/#{composer_package.id}")
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with terraform module' do
|
||||||
|
let_it_be(:terraform_package) { create(:terraform_module_package, project: project) }
|
||||||
|
|
||||||
|
let(:package_global_id) { global_id_of(terraform_package) }
|
||||||
|
|
||||||
|
it 'returns web_path correctly' do
|
||||||
|
expect(graphql_data_at(:package, :_links, :web_path)).to eq("/#{project.full_path}/-/infrastructure_registry/#{terraform_package.id}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue