Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
f73fa6daff
commit
eec96715e5
|
|
@ -468,7 +468,6 @@
|
|||
services:
|
||||
- docker:${DOCKER_VERSION}-dind
|
||||
variables:
|
||||
DOCKER_DRIVER: overlay2
|
||||
DOCKER_HOST: tcp://docker:2375
|
||||
DOCKER_TLS_CERTDIR: ""
|
||||
tags:
|
||||
|
|
|
|||
|
|
@ -39,9 +39,7 @@ export default {
|
|||
computed: {
|
||||
showAiActions() {
|
||||
return (
|
||||
this.resourceGlobalId &&
|
||||
(this.glFeatures.openaiExperimentation || this.glFeatures.aiGlobalSwitch) &&
|
||||
this.glFeatures.summarizeNotes
|
||||
this.resourceGlobalId && this.glFeatures.aiGlobalSwitch && this.glFeatures.summarizeNotes
|
||||
);
|
||||
},
|
||||
},
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import { sprintf } from '~/locale';
|
|||
import { updateRepositorySize } from '~/api/projects_api';
|
||||
import { numberToHumanSize } from '~/lib/utils/number_utils';
|
||||
import SectionedPercentageBar from '~/usage_quotas/components/sectioned_percentage_bar.vue';
|
||||
import getProjectStorageStatistics from 'ee_else_ce/usage_quotas/storage/queries/project_storage.query.graphql';
|
||||
import {
|
||||
ERROR_MESSAGE,
|
||||
LEARN_MORE_LABEL,
|
||||
|
|
@ -18,7 +19,6 @@ import {
|
|||
usageQuotasHelpPaths,
|
||||
storageTypeHelpPaths,
|
||||
} from '../constants';
|
||||
import getProjectStorageStatistics from '../queries/project_storage.query.graphql';
|
||||
import { getStorageTypesFromProjectStatistics, descendingStorageUsageSort } from '../utils';
|
||||
import ProjectStorageDetail from './project_storage_detail.vue';
|
||||
|
||||
|
|
|
|||
|
|
@ -512,6 +512,7 @@ class ProjectsController < Projects::ApplicationController
|
|||
:merge_method,
|
||||
:initialize_with_sast,
|
||||
:initialize_with_readme,
|
||||
:use_sha256_repository,
|
||||
:ci_separated_caches,
|
||||
:suggestion_commit_message,
|
||||
:packages_enabled,
|
||||
|
|
|
|||
|
|
@ -3,9 +3,6 @@
|
|||
module Ci
|
||||
class PipelineChatData < Ci::ApplicationRecord
|
||||
include Ci::NamespacedModelName
|
||||
include IgnorableColumns
|
||||
|
||||
ignore_column :pipeline_id_convert_to_bigint, remove_with: '16.5', remove_after: '2023-10-22'
|
||||
|
||||
self.table_name = 'ci_pipeline_chat_data'
|
||||
|
||||
|
|
|
|||
|
|
@ -1944,11 +1944,11 @@ class Project < ApplicationRecord
|
|||
cleanup if replicate_object_pool_on_move_ff_enabled?
|
||||
end
|
||||
|
||||
def create_repository(force: false, default_branch: nil)
|
||||
def create_repository(force: false, default_branch: nil, object_format: nil)
|
||||
# Forked import is handled asynchronously
|
||||
return if forked? && !force
|
||||
|
||||
repository.create_repository(default_branch)
|
||||
repository.create_repository(default_branch, object_format: object_format)
|
||||
repository.after_create
|
||||
|
||||
true
|
||||
|
|
|
|||
|
|
@ -28,6 +28,9 @@ class Repository
|
|||
#{REF_PIPELINES}
|
||||
].freeze
|
||||
|
||||
FORMAT_SHA1 = 'sha1'
|
||||
FORMAT_SHA256 = 'sha256'
|
||||
|
||||
include Gitlab::RepositoryCacheAdapter
|
||||
|
||||
attr_accessor :full_path, :shard, :disk_path, :container, :repo_type
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@ class Vulnerability < ApplicationRecord
|
|||
include EachBatch
|
||||
include IgnorableColumns
|
||||
|
||||
ignore_column %i[epic_id milestone_id last_edited_at start_date start_date_sourcing_milestone_id updated_by_id],
|
||||
ignore_column %i[epic_id milestone_id last_edited_at last_edited_by_id
|
||||
start_date start_date_sourcing_milestone_id updated_by_id],
|
||||
remove_with: '16.9',
|
||||
remove_after: '2024-01-19'
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ module Packages
|
|||
required_python: params[:requires_python] || '',
|
||||
metadata_version: params[:metadata_version],
|
||||
author_email: params[:author_email],
|
||||
description: params[:description],
|
||||
description: params[:description]&.truncate(::Packages::Pypi::Metadatum::MAX_DESCRIPTION_LENGTH),
|
||||
description_content_type: params[:description_content_type],
|
||||
summary: params[:summary],
|
||||
keywords: params[:keywords]
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ module Projects
|
|||
@skip_wiki = @params.delete(:skip_wiki)
|
||||
@initialize_with_sast = Gitlab::Utils.to_boolean(@params.delete(:initialize_with_sast))
|
||||
@initialize_with_readme = Gitlab::Utils.to_boolean(@params.delete(:initialize_with_readme))
|
||||
@use_sha256_repository = Gitlab::Utils.to_boolean(@params.delete(:use_sha256_repository)) && Feature.enabled?(:support_sha256_repositories, user)
|
||||
@import_data = @params.delete(:import_data)
|
||||
@relations_block = @params.delete(:relations_block)
|
||||
@default_branch = @params.delete(:default_branch)
|
||||
|
|
@ -212,6 +213,10 @@ module Projects
|
|||
::Security::CiConfiguration::SastCreateService.new(@project, current_user, { initialize_with_sast: true }, commit_on_default: true).execute
|
||||
end
|
||||
|
||||
def repository_object_format
|
||||
@use_sha256_repository ? Repository::FORMAT_SHA256 : Repository::FORMAT_SHA1
|
||||
end
|
||||
|
||||
def readme_content
|
||||
readme_attrs = {
|
||||
default_branch: default_branch
|
||||
|
|
@ -242,7 +247,7 @@ module Projects
|
|||
|
||||
next if @project.import?
|
||||
|
||||
unless @project.create_repository(default_branch: default_branch)
|
||||
unless @project.create_repository(default_branch: default_branch, object_format: repository_object_format)
|
||||
raise 'Failed to create repository'
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
- hide_init_with_readme = local_assigns.fetch(:hide_init_with_readme, false)
|
||||
- include_description = local_assigns.fetch(:include_description, true)
|
||||
- track_label = local_assigns.fetch(:track_label, 'blank_project')
|
||||
- display_sha256_repository = Feature.enabled?(:support_sha256_repositories, current_user)
|
||||
|
||||
.row{ id: project_name_id }
|
||||
= f.hidden_field :ci_cd_only, value: ci_cd_only
|
||||
|
|
@ -95,6 +96,14 @@
|
|||
= s_('ProjectsNew|Analyze your source code for known security vulnerabilities.')
|
||||
= link_to _('Learn more.'), help_page_path('user/application_security/sast/index'), target: '_blank', rel: 'noopener noreferrer', data: { track_action: 'followed' }
|
||||
|
||||
- if display_sha256_repository
|
||||
.form-group
|
||||
= render Pajamas::CheckboxTagComponent.new(name: 'project[use_sha256_repository]') do |c|
|
||||
- c.with_label do
|
||||
= s_('ProjectsNew|Use SHA-256 as the repository hashing algorithm')
|
||||
- c.with_help_text do
|
||||
= s_('ProjectsNew|Default hashing algorithm is SHA-1.')
|
||||
|
||||
-# this partial is from JiHu, see details in https://jihulab.com/gitlab-cn/gitlab/-/merge_requests/675
|
||||
= render_if_exists 'shared/other_project_options', f: f, visibility_level: visibility_level, track_label: track_label
|
||||
= f.submit _('Create project'), class: "js-create-project-button", data: { testid: 'project-create-button', track_label: "#{track_label}", track_action: "click_button", track_property: "create_project", track_value: "" }, pajamas_button: true
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
name: ci_parallel_remote_includes
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/136715
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/413770
|
||||
milestone: '16.7'
|
||||
type: development
|
||||
group: group::pipeline authoring
|
||||
default_enabled: false
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
name: support_sha256_repositories
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/136681
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/431864
|
||||
milestone: '16.7'
|
||||
type: development
|
||||
group: group::source code
|
||||
default_enabled: false
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
- title: "Deprecate GraphQL fields related to the temporary storage increase" # (required) Clearly explain the change, or planned change. For example, "The `confidential` field for a `Note` is deprecated" or "CI/CD job names will be limited to 250 characters."
|
||||
removal_milestone: "17.0" # (required) The milestone when this feature is planned to be removed
|
||||
announcement_milestone: "16.7" # (required) The milestone when this feature was first announced as deprecated.
|
||||
breaking_change: false # (required) Change to false if this is not a breaking change.
|
||||
reporter: aalakkad # (required) GitLab username of the person reporting the change
|
||||
stage: fulfillment # (required) String value of the stage that the feature was created in. e.g., Growth
|
||||
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/385720 # (required) Link to the deprecation issue in GitLab
|
||||
body: | # (required) Do not modify this line, instead modify the lines below.
|
||||
The GraphQL fields, `isTemporaryStorageIncreaseEnabled` and `temporaryStorageIncreaseEndsOn`, have been deprecated. These GraphQL fields are related to the temporary storage increase project. The project has been cancelled and the fields were not used.
|
||||
|
|
@ -261,11 +261,8 @@ To delete Google Cloud Logging streaming destinations to a top-level group:
|
|||
|
||||
### AWS S3 destinations
|
||||
|
||||
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/132603) in GitLab 16.6 [with a flag](../feature_flags.md) named `allow_streaming_audit_events_to_amazon_s3`. Enabled by default.
|
||||
|
||||
FLAG:
|
||||
On self-managed GitLab, by default this feature is available. To hide the feature per group, an administrator can [disable the feature flag](../feature_flags.md) named `allow_streaming_audit_events_to_amazon_s3`.
|
||||
On GitLab.com, this feature is available.
|
||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/132603) in GitLab 16.6 [with a flag](../feature_flags.md) named `allow_streaming_audit_events_to_amazon_s3`. Enabled by default.
|
||||
> - [Feature flag `allow_streaming_audit_events_to_amazon_s3`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/137391) removed in GitLab 16.7.
|
||||
|
||||
Manage AWS S3 destinations for top-level groups.
|
||||
|
||||
|
|
|
|||
|
|
@ -18500,7 +18500,7 @@ GPG signature for a signed commit.
|
|||
| <a id="groupfullpath"></a>`fullPath` | [`ID!`](#id) | Full path of the namespace. |
|
||||
| <a id="groupgooglecloudloggingconfigurations"></a>`googleCloudLoggingConfigurations` | [`GoogleCloudLoggingConfigurationTypeConnection`](#googlecloudloggingconfigurationtypeconnection) | Google Cloud logging configurations that receive audit events belonging to the group. (see [Connections](#connections)) |
|
||||
| <a id="groupid"></a>`id` | [`ID!`](#id) | ID of the namespace. |
|
||||
| <a id="groupistemporarystorageincreaseenabled"></a>`isTemporaryStorageIncreaseEnabled` | [`Boolean!`](#boolean) | Status of the temporary storage increase. |
|
||||
| <a id="groupistemporarystorageincreaseenabled"></a>`isTemporaryStorageIncreaseEnabled` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in 16.7. Feature removal, will be completely removed in 17.0. |
|
||||
| <a id="grouplfsenabled"></a>`lfsEnabled` | [`Boolean`](#boolean) | Indicates if Large File Storage (LFS) is enabled for namespace. |
|
||||
| <a id="groupmentionsdisabled"></a>`mentionsDisabled` | [`Boolean`](#boolean) | Indicates if a group is disabled from getting mentioned. |
|
||||
| <a id="groupname"></a>`name` | [`String!`](#string) | Name of the namespace. |
|
||||
|
|
@ -18519,7 +18519,7 @@ GPG signature for a signed commit.
|
|||
| <a id="groupstats"></a>`stats` | [`GroupStats`](#groupstats) | Group statistics. |
|
||||
| <a id="groupstoragesizelimit"></a>`storageSizeLimit` | [`Float`](#float) | The storage limit (in bytes) included with the root namespace plan. This limit only applies to namespaces under namespace limit enforcement. |
|
||||
| <a id="groupsubgroupcreationlevel"></a>`subgroupCreationLevel` | [`String`](#string) | Permission level required to create subgroups within the group. |
|
||||
| <a id="grouptemporarystorageincreaseendson"></a>`temporaryStorageIncreaseEndsOn` | [`Time`](#time) | Date until the temporary storage increase is active. |
|
||||
| <a id="grouptemporarystorageincreaseendson"></a>`temporaryStorageIncreaseEndsOn` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 16.7. Feature removal, will be completely removed in 17.0. |
|
||||
| <a id="grouptimelogcategories"></a>`timelogCategories` **{warning-solid}** | [`TimeTrackingTimelogCategoryConnection`](#timetrackingtimelogcategoryconnection) | **Introduced** in 15.3. This feature is an Experiment. It can be changed or removed at any time. Timelog categories for the namespace. |
|
||||
| <a id="grouptotalrepositorysize"></a>`totalRepositorySize` | [`Float`](#float) | Total repository size of all projects in the root namespace in bytes. |
|
||||
| <a id="grouptotalrepositorysizeexcess"></a>`totalRepositorySizeExcess` | [`Float`](#float) | Total excess repository size of all projects in the root namespace in bytes. This only applies to namespaces under Project limit enforcement. |
|
||||
|
|
@ -22133,7 +22133,7 @@ Version of a machine learning model.
|
|||
| <a id="namespacefullname"></a>`fullName` | [`String!`](#string) | Full name of the namespace. |
|
||||
| <a id="namespacefullpath"></a>`fullPath` | [`ID!`](#id) | Full path of the namespace. |
|
||||
| <a id="namespaceid"></a>`id` | [`ID!`](#id) | ID of the namespace. |
|
||||
| <a id="namespaceistemporarystorageincreaseenabled"></a>`isTemporaryStorageIncreaseEnabled` | [`Boolean!`](#boolean) | Status of the temporary storage increase. |
|
||||
| <a id="namespaceistemporarystorageincreaseenabled"></a>`isTemporaryStorageIncreaseEnabled` **{warning-solid}** | [`Boolean!`](#boolean) | **Deprecated** in 16.7. Feature removal, will be completely removed in 17.0. |
|
||||
| <a id="namespacelfsenabled"></a>`lfsEnabled` | [`Boolean`](#boolean) | Indicates if Large File Storage (LFS) is enabled for namespace. |
|
||||
| <a id="namespacename"></a>`name` | [`String!`](#string) | Name of the namespace. |
|
||||
| <a id="namespacepackagesettings"></a>`packageSettings` | [`PackageSettings`](#packagesettings) | Package settings for the namespace. |
|
||||
|
|
@ -22143,7 +22143,7 @@ Version of a machine learning model.
|
|||
| <a id="namespacerootstoragestatistics"></a>`rootStorageStatistics` | [`RootStorageStatistics`](#rootstoragestatistics) | Aggregated storage statistics of the namespace. Only available for root namespaces. |
|
||||
| <a id="namespacesharedrunnerssetting"></a>`sharedRunnersSetting` | [`SharedRunnersSetting`](#sharedrunnerssetting) | Shared runners availability for the namespace and its descendants. |
|
||||
| <a id="namespacestoragesizelimit"></a>`storageSizeLimit` | [`Float`](#float) | The storage limit (in bytes) included with the root namespace plan. This limit only applies to namespaces under namespace limit enforcement. |
|
||||
| <a id="namespacetemporarystorageincreaseendson"></a>`temporaryStorageIncreaseEndsOn` | [`Time`](#time) | Date until the temporary storage increase is active. |
|
||||
| <a id="namespacetemporarystorageincreaseendson"></a>`temporaryStorageIncreaseEndsOn` **{warning-solid}** | [`Time`](#time) | **Deprecated** in 16.7. Feature removal, will be completely removed in 17.0. |
|
||||
| <a id="namespacetimelogcategories"></a>`timelogCategories` **{warning-solid}** | [`TimeTrackingTimelogCategoryConnection`](#timetrackingtimelogcategoryconnection) | **Introduced** in 15.3. This feature is an Experiment. It can be changed or removed at any time. Timelog categories for the namespace. |
|
||||
| <a id="namespacetotalrepositorysize"></a>`totalRepositorySize` | [`Float`](#float) | Total repository size of all projects in the root namespace in bytes. |
|
||||
| <a id="namespacetotalrepositorysizeexcess"></a>`totalRepositorySizeExcess` | [`Float`](#float) | Total excess repository size of all projects in the root namespace in bytes. This only applies to namespaces under Project limit enforcement. |
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ type: reference, api
|
|||
> - `last_edited_at` [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/268154) in GitLab 16.7.
|
||||
> - `start_date` [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/268154) in GitLab 16.7.
|
||||
> - `updated_by_id` [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/268154) in GitLab 16.7.
|
||||
> - `last_edited_by_id` [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/268154) in GitLab 16.7.
|
||||
|
||||
WARNING:
|
||||
This API is in the process of being deprecated and considered unstable.
|
||||
|
|
@ -82,7 +83,6 @@ Example response:
|
|||
"vulnerability_id": 103
|
||||
},
|
||||
"id": 103,
|
||||
"last_edited_by_id": null,
|
||||
"project": {
|
||||
"created_at": "2020-04-07T13:54:25.634Z",
|
||||
"description": "",
|
||||
|
|
@ -167,7 +167,6 @@ Example response:
|
|||
"vulnerability_id": 103
|
||||
},
|
||||
"id": 103,
|
||||
"last_edited_by_id": null,
|
||||
"project": {
|
||||
"created_at": "2020-04-07T13:54:25.634Z",
|
||||
"description": "",
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
|
|||
> - `last_edited_at` [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/268154) in GitLab 16.7.
|
||||
> - `start_date` [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/268154) in GitLab 16.7.
|
||||
> - `updated_by_id` [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/268154) in GitLab 16.7.
|
||||
> - `last_edited_by_id` [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/268154) in GitLab 16.7.
|
||||
|
||||
NOTE:
|
||||
The former Vulnerabilities API was renamed to Vulnerability Findings API
|
||||
|
|
@ -63,7 +64,6 @@ Example response:
|
|||
"full_name": "gitlab-examples / security / security-reports"
|
||||
},
|
||||
"author_id": 1,
|
||||
"last_edited_by_id": null,
|
||||
"closed_by_id": null,
|
||||
"due_date": null,
|
||||
"created_at": "2019-10-13T15:08:40.219Z",
|
||||
|
|
@ -110,7 +110,6 @@ Example response:
|
|||
"full_name": "gitlab-examples / security / security-reports"
|
||||
},
|
||||
"author_id": 1,
|
||||
"last_edited_by_id": null,
|
||||
"closed_by_id": null,
|
||||
"due_date": null,
|
||||
"created_at": "2019-10-13T15:08:40.219Z",
|
||||
|
|
@ -157,7 +156,6 @@ Example response:
|
|||
"full_name": "gitlab-examples / security / security-reports"
|
||||
},
|
||||
"author_id": 1,
|
||||
"last_edited_by_id": null,
|
||||
"closed_by_id": null,
|
||||
"due_date": null,
|
||||
"created_at": "2019-10-13T15:08:40.219Z",
|
||||
|
|
@ -204,7 +202,6 @@ Example response:
|
|||
"full_name": "gitlab-examples / security / security-reports"
|
||||
},
|
||||
"author_id": 1,
|
||||
"last_edited_by_id": null,
|
||||
"closed_by_id": null,
|
||||
"due_date": null,
|
||||
"created_at": "2019-10-13T15:08:40.219Z",
|
||||
|
|
@ -251,7 +248,6 @@ Example response:
|
|||
"full_name": "gitlab-examples / security / security-reports"
|
||||
},
|
||||
"author_id": 1,
|
||||
"last_edited_by_id": null,
|
||||
"closed_by_id": null,
|
||||
"due_date": null,
|
||||
"created_at": "2019-10-13T15:08:40.219Z",
|
||||
|
|
|
|||
|
|
@ -337,7 +337,7 @@ The Cells architecture has long lasting implications to data processing, locatio
|
|||
This section links all different technical proposals that are being evaluated.
|
||||
|
||||
- [Stateless Router That Uses a Cache to Pick Cell and Is Redirected When Wrong Cell Is Reached](proposal-stateless-router-with-buffering-requests.md)
|
||||
- [Stateless Router That Uses a Cache to Pick Cell and pre-flight `/api/v4/cells/learn`](proposal-stateless-router-with-routes-learning.md)
|
||||
- [Stateless Router That Uses a Cache to Pick Cell and pre-flight `/api/v4/internal/cells/learn`](proposal-stateless-router-with-routes-learning.md)
|
||||
|
||||
## Impacted features
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ Organization can only be on a single Cell.
|
|||
## Differences
|
||||
|
||||
The main difference between this proposal and one [with buffering requests](proposal-stateless-router-with-buffering-requests.md)
|
||||
is that this proposal uses a pre-flight API request (`/api/v4/cells/learn`) to redirect the request body to the correct Cell.
|
||||
is that this proposal uses a pre-flight API request (`/pi/v4/internal/cells/learn`) to redirect the request body to the correct Cell.
|
||||
This means that each request is sent exactly once to be processed, but the URI is used to decode which Cell it should be directed.
|
||||
|
||||
## Summary in diagrams
|
||||
|
|
@ -157,11 +157,11 @@ graph TD;
|
|||
1. The `application_settings` (and probably a few other instance level tables) are decomposed into `gitlab_admin` schema
|
||||
1. A new column `routes.cell_id` is added to `routes` table
|
||||
1. A new Router service exists to choose which cell to route a request to.
|
||||
1. If a router receives a new request it will send `/api/v4/cells/learn?method=GET&path_info=/group-org/project` to learn which Cell can process it
|
||||
1. If a router receives a new request it will send `/api/v4/internal/cells/learn?method=GET&path_info=/group-org/project` to learn which Cell can process it
|
||||
1. A new concept will be introduced in GitLab called an organization
|
||||
1. We require all existing endpoints to be routable by URI, or be fixed to a specific Cell for processing. This requires changing ambiguous endpoints like `/dashboard` to be scoped like `/organizations/my-organization/-/dashboard`
|
||||
1. Endpoints like `/admin` would be routed always to the specific Cell, like `cell_0`
|
||||
1. Each Cell can respond to `/api/v4/cells/learn` and classify each endpoint
|
||||
1. Each Cell can respond to `/api/v4/internal/cells/learn` and classify each endpoint
|
||||
1. Writes to `gitlab_users` and `gitlab_routes` are sent to a primary PostgreSQL server in our `US` region but reads can come from replicas in the same region. This will add latency for these writes but we expect they are infrequent relative to the rest of GitLab.
|
||||
|
||||
## Pre-flight request learning
|
||||
|
|
@ -174,7 +174,7 @@ the routable path. GitLab Rails will decode `path_info` and match it to
|
|||
an existing endpoint and find a routable entity (like project). The router will
|
||||
treat this as short-lived cache information.
|
||||
|
||||
1. Prefix match: `/api/v4/cells/learn?method=GET&path_info=/gitlab-org/gitlab-test/-/issues`
|
||||
1. Prefix match: `/api/v4/internal/cells/learn?method=GET&path_info=/gitlab-org/gitlab-test/-/issues`
|
||||
|
||||
```json
|
||||
{
|
||||
|
|
@ -184,7 +184,7 @@ treat this as short-lived cache information.
|
|||
}
|
||||
```
|
||||
|
||||
1. Some endpoints might require an exact match: `/api/v4/cells/learn?method=GET&path_info=/-/profile`
|
||||
1. Some endpoints might require an exact match: `/api/v4/internal/cells/learn?method=GET&path_info=/-/profile`
|
||||
|
||||
```json
|
||||
{
|
||||
|
|
@ -283,7 +283,7 @@ keeping settings in sync for all cells.
|
|||
to aggregate information from many Cells.
|
||||
1. All unknown routes are sent to the latest deployment which we assume to be `Cell US0`.
|
||||
This is required as newly added endpoints will be only decodable by latest cell.
|
||||
Likely this is not a problem for the `/cells/learn` is it is lightweight
|
||||
Likely this is not a problem for the `/internal/cells/learn` is it is lightweight
|
||||
to process and this should not cause a performance impact.
|
||||
|
||||
## Example database configuration
|
||||
|
|
@ -361,7 +361,7 @@ this limitation.
|
|||
|
||||
1. User is in Europe so DNS resolves to the router in Europe
|
||||
1. They request `/my-company/my-project` without the router cache, so the router chooses randomly `Cell EU1`
|
||||
1. The `/cells/learn` is sent to `Cell EU1`, which responds that resource lives on `Cell EU0`
|
||||
1. The `/internal/cells/learn` is sent to `Cell EU1`, which responds that resource lives on `Cell EU0`
|
||||
1. `Cell EU0` returns the correct response
|
||||
1. The router now caches and remembers any request paths matching `/my-company/*` should go to `Cell EU0`
|
||||
|
||||
|
|
@ -372,7 +372,7 @@ sequenceDiagram
|
|||
participant cell_eu0 as Cell EU0
|
||||
participant cell_eu1 as Cell EU1
|
||||
user->>router_eu: GET /my-company/my-project
|
||||
router_eu->>cell_eu1: /api/v4/cells/learn?method=GET&path_info=/my-company/my-project
|
||||
router_eu->>cell_eu1: /api/v4/internal/cells/learn?method=GET&path_info=/my-company/my-project
|
||||
cell_eu1->>router_eu: {path: "/my-company", cell: "cell_eu0", source: "routable"}
|
||||
router_eu->>cell_eu0: GET /my-company/my-project
|
||||
cell_eu0->>user: <h1>My Project...
|
||||
|
|
@ -382,9 +382,9 @@ sequenceDiagram
|
|||
|
||||
1. User is in Europe so DNS resolves to the router in Europe
|
||||
1. The router does not have `/my-company/*` cached yet so it chooses randomly `Cell EU1`
|
||||
1. The `/cells/learn` is sent to `Cell EU1`, which responds that resource lives on `Cell EU0`
|
||||
1. The `/internal/cells/learn` is sent to `Cell EU1`, which responds that resource lives on `Cell EU0`
|
||||
1. `Cell EU0` redirects them through a login flow
|
||||
1. User requests `/users/sign_in`, uses random Cell to run `/cells/learn`
|
||||
1. User requests `/users/sign_in`, uses random Cell to run `/internal/cells/learn`
|
||||
1. The `Cell EU1` responds with `cell_0` as a fixed route
|
||||
1. User after login requests `/my-company/my-project` which is cached and stored in `Cell EU0`
|
||||
1. `Cell EU0` returns the correct response
|
||||
|
|
@ -396,12 +396,12 @@ sequenceDiagram
|
|||
participant cell_eu0 as Cell EU0
|
||||
participant cell_eu1 as Cell EU1
|
||||
user->>router_eu: GET /my-company/my-project
|
||||
router_eu->>cell_eu1: /api/v4/cells/learn?method=GET&path_info=/my-company/my-project
|
||||
router_eu->>cell_eu1: /api/v4/internal/cells/learn?method=GET&path_info=/my-company/my-project
|
||||
cell_eu1->>router_eu: {path: "/my-company", cell: "cell_eu0", source: "routable"}
|
||||
router_eu->>cell_eu0: GET /my-company/my-project
|
||||
cell_eu0->>user: 302 /users/sign_in?redirect=/my-company/my-project
|
||||
user->>router_eu: GET /users/sign_in?redirect=/my-company/my-project
|
||||
router_eu->>cell_eu1: /api/v4/cells/learn?method=GET&path_info=/users/sign_in
|
||||
router_eu->>cell_eu1: /api/v4/internal/cells/learn?method=GET&path_info=/users/sign_in
|
||||
cell_eu1->>router_eu: {path: "/users", cell: "cell_eu0", source: "fixed"}
|
||||
router_eu->>cell_eu0: GET /users/sign_in?redirect=/my-company/my-project
|
||||
cell_eu0-->>user: <h1>Sign in...
|
||||
|
|
@ -445,7 +445,7 @@ sequenceDiagram
|
|||
participant cell_eu0 as Cell EU0
|
||||
participant cell_us0 as Cell US0
|
||||
user->>router_eu: GET /gitlab-org/gitlab
|
||||
router_eu->>cell_eu0: /api/v4/cells/learn?method=GET&path_info=/gitlab-org/gitlab
|
||||
router_eu->>cell_eu0: /api/v4/internal/cells/learn?method=GET&path_info=/gitlab-org/gitlab
|
||||
cell_eu0->>router_eu: {path: "/gitlab-org", cell: "cell_us0", source: "routable"}
|
||||
router_eu->>cell_us0: GET /gitlab-org/gitlab
|
||||
cell_us0->>user: <h1>GitLab.org...
|
||||
|
|
@ -569,7 +569,7 @@ sequenceDiagram
|
|||
router_us->>cell_us1: GET /
|
||||
cell_us1->>user: 302 /dashboard
|
||||
user->>router_us: GET /dashboard
|
||||
router_us->>cell_us1: /api/v4/cells/learn?method=GET&path_info=/dashboard
|
||||
router_us->>cell_us1: /api/v4/internal/cells/learn?method=GET&path_info=/dashboard
|
||||
cell_us1->>router_us: {path: "/dashboard", cell: "cell_us0", source: "routable"}
|
||||
router_us->>cell_us0: GET /dashboard
|
||||
cell_us0->>user: <h1>Dashboard...
|
||||
|
|
|
|||
|
|
@ -182,6 +182,7 @@ Include in the MR description:
|
|||
- To produce a query plan with enough data, you can use the IDs of:
|
||||
- The `gitlab-org` namespace (`namespace_id = 9970`), for queries involving a group.
|
||||
- The `gitlab-org/gitlab-foss` (`project_id = 13083`) or the `gitlab-org/gitlab` (`project_id = 278964`) projects, for queries involving a project.
|
||||
- For queries involving memebrship of projects, `project_namespace_id` of these projects may be required to create a query plan. These are `15846663` (for `gitlab-org/gitlab`) and `15846626` (for `gitlab-org/gitlab-foss`)
|
||||
- The `gitlab-qa` user (`user_id = 1614863`), for queries involving a user.
|
||||
- Optionally, you can also use your own `user_id`, or the `user_id` of a user with a long history within the project or group being used to generate the query plan.
|
||||
- That means that no query plan should return 0 records or less records than the provided limit (if a limit is included). If a query is used in batching, a proper example batch with adequate included results should be identified and provided.
|
||||
|
|
|
|||
|
|
@ -55,8 +55,8 @@ A user is not counted as a billable user if:
|
|||
the user is included in the number of [maximum users](#maximum-users).
|
||||
- They are [pending approval](../../administration/moderate_users.md#users-pending-approval).
|
||||
- They have only the [Minimal Access role](../../user/permissions.md#users-with-minimal-access) on self-managed Ultimate subscriptions or any GitLab.com subscriptions.
|
||||
- They have the [Guest or Minimal Access roles on an Ultimate subscription](#free-guest-users).
|
||||
- They have project or group memberships on an Ultimate subscription.
|
||||
- They have only the [Guest or Minimal Access roles on an Ultimate subscription](#free-guest-users).
|
||||
- They do not have project or group memberships on an Ultimate subscription.
|
||||
- The account is a GitLab-created service account:
|
||||
- [Ghost User](../../user/profile/account/delete_account.md#associated-records).
|
||||
- Bots such as:
|
||||
|
|
|
|||
|
|
@ -315,6 +315,20 @@ In 16.3, the names of these settings were changed to clarify their meanings: the
|
|||
|
||||
</div>
|
||||
|
||||
<div class="deprecation " data-milestone="17.0">
|
||||
|
||||
### Deprecate GraphQL fields related to the temporary storage increase
|
||||
|
||||
<div class="deprecation-notes">
|
||||
- Announced in GitLab <span class="milestone">16.7</span>
|
||||
- Removal in GitLab <span class="milestone">17.0</span>
|
||||
- To discuss this change or learn more, see the [deprecation issue](https://gitlab.com/gitlab-org/gitlab/-/issues/385720).
|
||||
</div>
|
||||
|
||||
The GraphQL fields, `isTemporaryStorageIncreaseEnabled` and `temporaryStorageIncreaseEndsOn`, have been deprecated. These GraphQL fields are related to the temporary storage increase project. The project has been cancelled and the fields were not used.
|
||||
|
||||
</div>
|
||||
|
||||
<div class="deprecation breaking-change" data-milestone="17.0">
|
||||
|
||||
### Deprecate Windows CMD in GitLab Runner
|
||||
|
|
|
|||
|
|
@ -71,6 +71,21 @@ For example, if a project has a high score for Deployment Frequency (Velocity),
|
|||
|
||||
These scoring are based on Google's classifications in the [DORA 2022 Accelerate State of DevOps Report](https://cloud.google.com/blog/products/devops-sre/dora-2022-accelerate-state-of-devops-report-now-out).
|
||||
|
||||
### Filter by project topics
|
||||
|
||||
When used in combination with a [YAML configuration](#using-yaml-configuration), you can filter the projects shown based on their assigned [topics](../project/working_with_projects.md#organizing-projects-with-topics).
|
||||
|
||||
```yaml
|
||||
panels:
|
||||
- data:
|
||||
namespace: group/my-custom-group
|
||||
filter_project_topics:
|
||||
- JavaScript
|
||||
- Vue.js
|
||||
```
|
||||
|
||||
If multiple topics are provided, all topics will need to match for the project to be included in the results.
|
||||
|
||||
## Enable or disable overview background aggregation **(ULTIMATE SELF)**
|
||||
|
||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120610) in GitLab 16.1 [with a flag](../../administration/feature_flags.md) named `modify_value_stream_dashboard_settings`. Disabled by default.
|
||||
|
|
|
|||
|
|
@ -14,10 +14,21 @@ module Gitlab
|
|||
super
|
||||
end
|
||||
|
||||
def content
|
||||
strong_memoize(:content) { fetch_remote_content }
|
||||
def preload_content
|
||||
fetch_async_content
|
||||
end
|
||||
|
||||
def content
|
||||
fetch_with_error_handling do
|
||||
if fetch_async_content
|
||||
fetch_async_content.value
|
||||
else
|
||||
fetch_sync_content
|
||||
end
|
||||
end
|
||||
end
|
||||
strong_memoize_attr :content
|
||||
|
||||
def metadata
|
||||
super.merge(
|
||||
type: :remote,
|
||||
|
|
@ -42,11 +53,23 @@ module Gitlab
|
|||
|
||||
private
|
||||
|
||||
def fetch_remote_content
|
||||
def fetch_async_content
|
||||
return if ::Feature.disabled?(:ci_parallel_remote_includes, context.project)
|
||||
|
||||
# It starts fetching the remote content in a separate thread and returns a promise immediately.
|
||||
Gitlab::HTTP.get(location, async: true).execute
|
||||
end
|
||||
strong_memoize_attr :fetch_async_content
|
||||
|
||||
def fetch_sync_content
|
||||
context.logger.instrument(:config_file_fetch_remote_content) do
|
||||
Gitlab::HTTP.get(location)
|
||||
end
|
||||
end
|
||||
|
||||
def fetch_with_error_handling
|
||||
begin
|
||||
response = context.logger.instrument(:config_file_fetch_remote_content) do
|
||||
Gitlab::HTTP.get(location)
|
||||
end
|
||||
response = yield
|
||||
rescue SocketError
|
||||
errors.push("Remote file `#{masked_location}` could not be fetched because of a socket error!")
|
||||
rescue Timeout::Error
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ module Gitlab
|
|||
file.preload_context if file.valid?
|
||||
end
|
||||
|
||||
# We do not combine the loops because we need to load the context of all files via `BatchLoader`.
|
||||
# We do not combine the loops because we need to preload the context of all files via `BatchLoader`.
|
||||
files.each do |file| # rubocop:disable Style/CombinableLoops
|
||||
verify_execution_time!
|
||||
|
||||
|
|
@ -33,7 +33,8 @@ module Gitlab
|
|||
file.preload_content if file.valid?
|
||||
end
|
||||
|
||||
# We do not combine the loops because we need to load the content of all files via `BatchLoader`.
|
||||
# We do not combine the loops because we need to preload the content of all files via `BatchLoader`
|
||||
# or `Concurrent::Promise`.
|
||||
files.each do |file| # rubocop:disable Style/CombinableLoops
|
||||
verify_execution_time!
|
||||
|
||||
|
|
|
|||
|
|
@ -102,9 +102,9 @@ module Gitlab
|
|||
gitaly_repository_client.exists?
|
||||
end
|
||||
|
||||
def create_repository(default_branch = nil)
|
||||
def create_repository(default_branch = nil, object_format: nil)
|
||||
wrapped_gitaly_errors do
|
||||
gitaly_repository_client.create_repository(default_branch)
|
||||
gitaly_repository_client.create_repository(default_branch, object_format: object_format)
|
||||
rescue GRPC::AlreadyExists => e
|
||||
raise RepositoryExists, e.message
|
||||
end
|
||||
|
|
|
|||
|
|
@ -114,8 +114,8 @@ module Gitlab
|
|||
end
|
||||
# rubocop: enable Metrics/ParameterLists
|
||||
|
||||
def create_repository(default_branch = nil)
|
||||
request = Gitaly::CreateRepositoryRequest.new(repository: @gitaly_repo, default_branch: encode_binary(default_branch))
|
||||
def create_repository(default_branch = nil, object_format: nil)
|
||||
request = Gitaly::CreateRepositoryRequest.new(repository: @gitaly_repo, default_branch: encode_binary(default_branch), object_format: gitaly_object_format(object_format))
|
||||
gitaly_client_call(@storage, :repository_service, :create_repository, request, timeout: GitalyClient.fast_timeout)
|
||||
end
|
||||
|
||||
|
|
@ -449,6 +449,15 @@ module Gitlab
|
|||
|
||||
entry
|
||||
end
|
||||
|
||||
def gitaly_object_format(format)
|
||||
case format
|
||||
when Repository::FORMAT_SHA1
|
||||
Gitaly::ObjectFormat::OBJECT_FORMAT_SHA1
|
||||
when Repository::FORMAT_SHA256
|
||||
Gitaly::ObjectFormat::OBJECT_FORMAT_SHA256
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -46,21 +46,6 @@ namespace :gitlab do
|
|||
task setup: :gitlab_environment do
|
||||
setup_gitlab_shell
|
||||
end
|
||||
|
||||
desc "GitLab | Shell | Build missing projects"
|
||||
task build_missing_projects: :gitlab_environment do
|
||||
Project.find_each(batch_size: 1000) do |project|
|
||||
path_to_repo = project.repository.path_to_repo
|
||||
if File.exist?(path_to_repo)
|
||||
print '-'
|
||||
elsif Gitlab::Shell.new.create_repository(project.repository_storage,
|
||||
project.disk_path)
|
||||
print '.'
|
||||
else
|
||||
print 'F'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def setup_gitlab_shell
|
||||
|
|
|
|||
|
|
@ -15074,6 +15074,9 @@ msgstr ""
|
|||
msgid "DORA4Metrics|All labels"
|
||||
msgstr ""
|
||||
|
||||
msgid "DORA4Metrics|All topics"
|
||||
msgstr ""
|
||||
|
||||
msgid "DORA4Metrics|Average (last %{days}d)"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -38317,6 +38320,9 @@ msgstr ""
|
|||
msgid "ProjectsNew|Create new project"
|
||||
msgstr ""
|
||||
|
||||
msgid "ProjectsNew|Default hashing algorithm is SHA-1."
|
||||
msgstr ""
|
||||
|
||||
msgid "ProjectsNew|Description format"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -38380,6 +38386,9 @@ msgstr ""
|
|||
msgid "ProjectsNew|Unable to suggest a path. Please refresh and try again."
|
||||
msgstr ""
|
||||
|
||||
msgid "ProjectsNew|Use SHA-256 as the repository hashing algorithm"
|
||||
msgstr ""
|
||||
|
||||
msgid "ProjectsNew|Visibility Level"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
|||
|
|
@ -190,7 +190,7 @@
|
|||
"remark-rehype": "^10.1.0",
|
||||
"scrollparent": "^2.0.1",
|
||||
"semver": "^7.3.4",
|
||||
"sentrybrowser": "npm:@sentry/browser@7.80.1",
|
||||
"sentrybrowser": "npm:@sentry/browser@7.81.0",
|
||||
"sentrybrowser5": "npm:@sentry/browser@5.30.0",
|
||||
"sortablejs": "^1.10.2",
|
||||
"string-hash": "1.1.3",
|
||||
|
|
@ -299,7 +299,8 @@
|
|||
},
|
||||
"resolutions": {
|
||||
"chokidar": "^3.5.3",
|
||||
"@types/node": "14.17.5"
|
||||
"@types/node": "14.17.5",
|
||||
"tough-cookie": "4.1.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.22.1",
|
||||
|
|
|
|||
|
|
@ -40,10 +40,6 @@ module QA
|
|||
element :project_creation_level_dropdown
|
||||
end
|
||||
|
||||
view 'ee/app/views/groups/settings/_experimental_settings.haml' do
|
||||
element 'use-experimental-features-checkbox'
|
||||
end
|
||||
|
||||
view 'app/views/groups/settings/_transfer.html.haml' do
|
||||
element 'transfer-group-content'
|
||||
end
|
||||
|
|
@ -67,12 +63,6 @@ module QA
|
|||
click_element(:save_permissions_changes_button)
|
||||
end
|
||||
|
||||
def set_experimental_features_enabled
|
||||
expand_content(:permission_lfs_2fa_content)
|
||||
check_element('use-experimental-features-checkbox', true)
|
||||
click_element(:save_permissions_changes_button)
|
||||
end
|
||||
|
||||
def set_lfs_disabled
|
||||
expand_content(:permission_lfs_2fa_content)
|
||||
uncheck_element(:lfs_checkbox, true)
|
||||
|
|
|
|||
|
|
@ -235,10 +235,11 @@ FactoryBot.define do
|
|||
trait :custom_repo do
|
||||
transient do
|
||||
files { {} }
|
||||
object_format { Repository::FORMAT_SHA1 }
|
||||
end
|
||||
|
||||
after :create do |project, evaluator|
|
||||
raise "Failed to create repository!" unless project.repository.exists? || project.create_repository
|
||||
raise "Failed to create repository!" unless project.repository.exists? || project.create_repository(object_format: evaluator.object_format)
|
||||
|
||||
evaluator.files.each do |filename, content|
|
||||
project.repository.create_file(
|
||||
|
|
@ -375,8 +376,12 @@ FactoryBot.define do
|
|||
end
|
||||
|
||||
trait :empty_repo do
|
||||
after(:create) do |project|
|
||||
raise "Failed to create repository!" unless project.create_repository
|
||||
transient do
|
||||
object_format { Repository::FORMAT_SHA1 }
|
||||
end
|
||||
|
||||
after(:create) do |project, evaluator|
|
||||
raise "Failed to create repository!" unless project.create_repository(object_format: evaluator.object_format)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -55,6 +55,45 @@ RSpec.describe 'User creates a project', :js, feature_category: :groups_and_proj
|
|||
expect(page).to have_content('README.md Initial commit')
|
||||
end
|
||||
|
||||
context 'when creating a project with SHA256 repository' do
|
||||
let(:sha256_field) { 'Use SHA-256 as the repository hashing algorithm' }
|
||||
|
||||
it 'creates a new project' do
|
||||
visit(new_project_path)
|
||||
|
||||
click_link 'Create blank project'
|
||||
fill_in(:project_name, with: 'With initial commits')
|
||||
|
||||
expect(page).to have_checked_field 'Initialize repository with a README'
|
||||
expect(page).to have_unchecked_field sha256_field
|
||||
|
||||
check sha256_field
|
||||
|
||||
page.within('#content-body') do
|
||||
click_button('Create project')
|
||||
end
|
||||
|
||||
project = Project.last
|
||||
|
||||
expect(page).to have_current_path(project_path(project), ignore_query: true)
|
||||
expect(page).to have_content('With initial commits')
|
||||
end
|
||||
|
||||
context 'when "support_sha256_repositories" feature flag is disabled' do
|
||||
before do
|
||||
stub_feature_flags(support_sha256_repositories: false)
|
||||
end
|
||||
|
||||
it 'does not display a SHA256 option' do
|
||||
visit(new_project_path)
|
||||
|
||||
click_link 'Create blank project'
|
||||
|
||||
expect(page).not_to have_content(sha256_field)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'in a subgroup they do not own' do
|
||||
let(:parent) { create(:group) }
|
||||
let!(:subgroup) { create(:group, parent: parent) }
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ import {
|
|||
NAMESPACE_STORAGE_TYPES,
|
||||
TOTAL_USAGE_DEFAULT_TEXT,
|
||||
} from '~/usage_quotas/storage/constants';
|
||||
import getProjectStorageStatistics from '~/usage_quotas/storage/queries/project_storage.query.graphql';
|
||||
import getProjectStorageStatistics from 'ee_else_ce/usage_quotas/storage/queries/project_storage.query.graphql';
|
||||
import { numberToHumanSize } from '~/lib/utils/number_utils';
|
||||
import {
|
||||
mockGetProjectStorageStatisticsGraphQLResponse,
|
||||
|
|
|
|||
|
|
@ -75,7 +75,9 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote, feature_category: :pi
|
|||
|
||||
context 'with a timeout' do
|
||||
before do
|
||||
allow(Gitlab::HTTP).to receive(:get).and_raise(Timeout::Error)
|
||||
allow_next_instance_of(HTTParty::Request) do |instance|
|
||||
allow(instance).to receive(:perform).and_raise(Timeout::Error)
|
||||
end
|
||||
end
|
||||
|
||||
it { is_expected.to be_falsy }
|
||||
|
|
@ -94,24 +96,33 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote, feature_category: :pi
|
|||
end
|
||||
end
|
||||
|
||||
describe "#content" do
|
||||
# When the FF ci_parallel_remote_includes is removed,
|
||||
# convert this `shared_context` to `describe` and remove `rubocop:disable`.
|
||||
shared_context "#content" do # rubocop:disable RSpec/ContextWording -- This is temporary until the FF is removed.
|
||||
subject(:content) do
|
||||
remote_file.preload_content
|
||||
remote_file.content
|
||||
end
|
||||
|
||||
context 'with a valid remote file' do
|
||||
before do
|
||||
stub_full_request(location).to_return(body: remote_file_content)
|
||||
end
|
||||
|
||||
it 'returns the content of the file' do
|
||||
expect(remote_file.content).to eql(remote_file_content)
|
||||
expect(content).to eql(remote_file_content)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with a timeout' do
|
||||
before do
|
||||
allow(Gitlab::HTTP).to receive(:get).and_raise(Timeout::Error)
|
||||
allow_next_instance_of(HTTParty::Request) do |instance|
|
||||
allow(instance).to receive(:perform).and_raise(Timeout::Error)
|
||||
end
|
||||
end
|
||||
|
||||
it 'is falsy' do
|
||||
expect(remote_file.content).to be_falsy
|
||||
expect(content).to be_falsy
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -123,7 +134,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote, feature_category: :pi
|
|||
end
|
||||
|
||||
it 'is nil' do
|
||||
expect(remote_file.content).to be_nil
|
||||
expect(content).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -131,11 +142,21 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote, feature_category: :pi
|
|||
let(:location) { 'http://localhost:8080' }
|
||||
|
||||
it 'is nil' do
|
||||
expect(remote_file.content).to be_nil
|
||||
expect(content).to be_nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it_behaves_like "#content"
|
||||
|
||||
context 'when the FF ci_parallel_remote_includes is disabled' do
|
||||
before do
|
||||
stub_feature_flags(ci_parallel_remote_includes: false)
|
||||
end
|
||||
|
||||
it_behaves_like "#content"
|
||||
end
|
||||
|
||||
describe "#error_message" do
|
||||
subject(:error_message) do
|
||||
Gitlab::Ci::Config::External::Mapper::Verifier.new(context).process([remote_file])
|
||||
|
|
@ -234,13 +255,18 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote, feature_category: :pi
|
|||
end
|
||||
|
||||
describe '#to_hash' do
|
||||
subject(:to_hash) do
|
||||
remote_file.preload_content
|
||||
remote_file.to_hash
|
||||
end
|
||||
|
||||
before do
|
||||
stub_full_request(location).to_return(body: remote_file_content)
|
||||
end
|
||||
|
||||
context 'with a valid remote file' do
|
||||
it 'returns the content as a hash' do
|
||||
expect(remote_file.to_hash).to eql(
|
||||
expect(to_hash).to eql(
|
||||
before_script: ["apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs",
|
||||
"ruby -v",
|
||||
"which ruby",
|
||||
|
|
@ -260,7 +286,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote, feature_category: :pi
|
|||
end
|
||||
|
||||
it 'returns the content as a hash' do
|
||||
expect(remote_file.to_hash).to eql(
|
||||
expect(to_hash).to eql(
|
||||
include: [
|
||||
{ local: 'another-file.yml',
|
||||
rules: [{ exists: ['Dockerfile'] }] }
|
||||
|
|
@ -293,7 +319,7 @@ RSpec.describe Gitlab::Ci::Config::External::File::Remote, feature_category: :pi
|
|||
|
||||
it 'returns the content as a hash' do
|
||||
expect(remote_file).to be_valid
|
||||
expect(remote_file.to_hash).to eql(
|
||||
expect(to_hash).to eql(
|
||||
include: [
|
||||
{ local: 'some-file.yml',
|
||||
rules: [{ exists: ['Dockerfile'] }] }
|
||||
|
|
|
|||
|
|
@ -85,7 +85,13 @@ RSpec.describe Gitlab::Ci::Config::External::Mapper, feature_category: :pipeline
|
|||
an_instance_of(Gitlab::Ci::Config::External::File::Remote))
|
||||
end
|
||||
|
||||
it_behaves_like 'logging config file fetch', 'config_file_fetch_remote_content_duration_s', 1
|
||||
context 'when the FF ci_parallel_remote_includes is disabled' do
|
||||
before do
|
||||
stub_feature_flags(ci_parallel_remote_includes: false)
|
||||
end
|
||||
|
||||
it_behaves_like 'logging config file fetch', 'config_file_fetch_remote_content_duration_s', 1
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the key is a remote file hash' do
|
||||
|
|
|
|||
|
|
@ -355,6 +355,40 @@ RSpec.describe Gitlab::GitalyClient::RepositoryService, feature_category: :gital
|
|||
|
||||
client.create_repository('feature/新機能')
|
||||
end
|
||||
|
||||
context 'when object format is provided' do
|
||||
before do
|
||||
expect_any_instance_of(Gitaly::RepositoryService::Stub)
|
||||
.to receive(:create_repository)
|
||||
.with(gitaly_request_with_path(storage_name, relative_path)
|
||||
.and(gitaly_request_with_params(default_branch: '', object_format: expected_format)), kind_of(Hash))
|
||||
.and_return(double)
|
||||
end
|
||||
|
||||
context 'with SHA1 format' do
|
||||
let(:expected_format) { :OBJECT_FORMAT_SHA1 }
|
||||
|
||||
it 'sends a create_repository message with object format' do
|
||||
client.create_repository(object_format: Repository::FORMAT_SHA1)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with SHA256 format' do
|
||||
let(:expected_format) { :OBJECT_FORMAT_SHA256 }
|
||||
|
||||
it 'sends a create_repository message with object format' do
|
||||
client.create_repository(object_format: Repository::FORMAT_SHA256)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with unknown format' do
|
||||
let(:expected_format) { :OBJECT_FORMAT_UNSPECIFIED }
|
||||
|
||||
it 'sends a create_repository message with object format' do
|
||||
client.create_repository(object_format: 'unknown')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#raw_changes_between' do
|
||||
|
|
|
|||
|
|
@ -3141,7 +3141,7 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
|
|||
end
|
||||
|
||||
it 'passes through default branch' do
|
||||
expect(project.repository).to receive(:create_repository).with('pineapple')
|
||||
expect(project.repository).to receive(:create_repository).with('pineapple', object_format: nil)
|
||||
|
||||
expect(project.create_repository(default_branch: 'pineapple')).to eq(true)
|
||||
end
|
||||
|
|
@ -3155,6 +3155,13 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr
|
|||
project.create_repository
|
||||
end
|
||||
end
|
||||
|
||||
context 'using a SHA256 repository' do
|
||||
it 'creates the repository' do
|
||||
expect(project.repository).to receive(:create_repository).with(nil, object_format: Repository::FORMAT_SHA256)
|
||||
expect(project.create_repository(object_format: Repository::FORMAT_SHA256)).to eq(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#ensure_repository' do
|
||||
|
|
|
|||
|
|
@ -330,6 +330,19 @@ RSpec.describe API::PypiPackages, feature_category: :package_registry do
|
|||
it_behaves_like 'process PyPI api request', :developer, :bad_request, true
|
||||
end
|
||||
|
||||
context 'with description too big' do
|
||||
let(:description) { 'x' * ::Packages::Pypi::Metadatum::MAX_DESCRIPTION_LENGTH + 1 }
|
||||
let(:token) { personal_access_token.token }
|
||||
let(:user_headers) { basic_auth_header(user.username, token) }
|
||||
let(:headers) { user_headers.merge(workhorse_headers) }
|
||||
|
||||
before do
|
||||
project.update_column(:visibility_level, Gitlab::VisibilityLevel::PRIVATE)
|
||||
end
|
||||
|
||||
it_behaves_like 'process PyPI api request', :developer, :created, true
|
||||
end
|
||||
|
||||
context 'with an invalid package' do
|
||||
let(:token) { personal_access_token.token }
|
||||
let(:user_headers) { basic_auth_header(user.username, token) }
|
||||
|
|
|
|||
|
|
@ -93,6 +93,23 @@ RSpec.describe Packages::Pypi::CreatePackageService, :aggregate_failures, featur
|
|||
end
|
||||
end
|
||||
|
||||
context 'with a very long metadata description field' do
|
||||
let(:max_length) { ::Packages::Pypi::Metadatum::MAX_DESCRIPTION_LENGTH }
|
||||
let(:truncated_description) { ('x' * (max_length + 1)).truncate(max_length) }
|
||||
|
||||
before do
|
||||
params.merge!(
|
||||
description: 'x' * (max_length + 1)
|
||||
)
|
||||
end
|
||||
|
||||
it 'truncates the description field' do
|
||||
expect { subject }.to change { Packages::Package.pypi.count }.by(1)
|
||||
|
||||
expect(created_package.pypi_metadatum.description).to eq(truncated_description)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with an invalid metadata' do
|
||||
let(:requires_python) { 'x' * 256 }
|
||||
|
||||
|
|
|
|||
|
|
@ -812,6 +812,31 @@ RSpec.describe Projects::CreateService, '#execute', feature_category: :groups_an
|
|||
end
|
||||
end
|
||||
|
||||
context 'when SHA256 format is requested' do
|
||||
let(:project) { create_project(user, opts) }
|
||||
let(:opts) { super().merge(initialize_with_readme: true, use_sha256_repository: true) }
|
||||
|
||||
before do
|
||||
allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return('main')
|
||||
end
|
||||
|
||||
it 'creates a repository with SHA256 commit hashes', :aggregate_failures do
|
||||
expect(project.repository.commit_count).to be(1)
|
||||
expect(project.commit.id.size).to eq 64
|
||||
end
|
||||
|
||||
context 'when "support_sha256_repositories" feature flag is disabled' do
|
||||
before do
|
||||
stub_feature_flags(support_sha256_repositories: false)
|
||||
end
|
||||
|
||||
it 'creates a repository with default SHA1 commit hash' do
|
||||
expect(project.repository.commit_count).to be(1)
|
||||
expect(project.commit.id.size).to eq 40
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'create integration for the project' do
|
||||
subject(:project) { create_project(user, opts) }
|
||||
|
||||
|
|
|
|||
110
yarn.lock
110
yarn.lock
|
|
@ -1913,14 +1913,14 @@
|
|||
estree-walker "^2.0.2"
|
||||
picomatch "^2.3.1"
|
||||
|
||||
"@sentry-internal/tracing@7.80.1":
|
||||
version "7.80.1"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.80.1.tgz#b0e993265aa75743787d84e6c0655ed17e4bac0f"
|
||||
integrity sha512-5gZ4LPIj2vpQl2/dHBM4uXMi9OI5E0VlOhJQt0foiuN6JJeiOjdpJFcfVqJk69wrc0deVENTtgKKktxqMwVeWQ==
|
||||
"@sentry-internal/tracing@7.81.0":
|
||||
version "7.81.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.81.0.tgz#bf63b817f8471462432fcfe466d3e021e84aef1f"
|
||||
integrity sha512-mc3tdOEvAE6kaCvT3BpMwCgfTT2yfXjWpC7g+3N8U/yuQEmQSCDZA/ut7EkzU0DyhG3t8HzT0c+CAG3HtilEAQ==
|
||||
dependencies:
|
||||
"@sentry/core" "7.80.1"
|
||||
"@sentry/types" "7.80.1"
|
||||
"@sentry/utils" "7.80.1"
|
||||
"@sentry/core" "7.81.0"
|
||||
"@sentry/types" "7.81.0"
|
||||
"@sentry/utils" "7.81.0"
|
||||
|
||||
"@sentry/core@5.30.0":
|
||||
version "5.30.0"
|
||||
|
|
@ -1933,13 +1933,13 @@
|
|||
"@sentry/utils" "5.30.0"
|
||||
tslib "^1.9.3"
|
||||
|
||||
"@sentry/core@7.80.1":
|
||||
version "7.80.1"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.80.1.tgz#ccb85e15495bf0c8b142ca1713408c64e38c9f4c"
|
||||
integrity sha512-3Yh+O9Q86MxwIuJFYtuSSoUCpdx99P1xDAqL0FIPTJ+ekaVMiUJq9NmyaNh9uN2myPSmxvEXW6q3z37zta9ZHg==
|
||||
"@sentry/core@7.81.0":
|
||||
version "7.81.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.81.0.tgz#e72e02dcb175ada154a71cf89599287f9393e787"
|
||||
integrity sha512-FCAKlqo9Z6fku69bkahw1AN+eBfAgRgOL1RpBLZgyG7YBW12vtSkHb5SDvZZTkm541Fo3hhepUTLtX0qmpA4yw==
|
||||
dependencies:
|
||||
"@sentry/types" "7.80.1"
|
||||
"@sentry/utils" "7.80.1"
|
||||
"@sentry/types" "7.81.0"
|
||||
"@sentry/utils" "7.81.0"
|
||||
|
||||
"@sentry/hub@5.30.0":
|
||||
version "5.30.0"
|
||||
|
|
@ -1959,25 +1959,25 @@
|
|||
"@sentry/types" "5.30.0"
|
||||
tslib "^1.9.3"
|
||||
|
||||
"@sentry/replay@7.80.1":
|
||||
version "7.80.1"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.80.1.tgz#1f47d3e52bfd0ad531f3032ae1eda8528c947c44"
|
||||
integrity sha512-yjpftIyybQeWD2i0Nd7C96tZwjNbSMRW515EL9jwlNxYbQtGtMs0HavP9Y7uQvQrzwSHY0Wp+ooe9PMuvzqbHw==
|
||||
"@sentry/replay@7.81.0":
|
||||
version "7.81.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.81.0.tgz#d8b841e3a8e473a5f4f50d552ec74138245b7e9e"
|
||||
integrity sha512-kJRWjEzby1015Ds5TTNNVe9EkzfwPfPcM06ycba+DIXPJ2LiaSXvH3OU0s2HEJ9Vo/+jcpFMlODXFF/wrYIn9w==
|
||||
dependencies:
|
||||
"@sentry-internal/tracing" "7.80.1"
|
||||
"@sentry/core" "7.80.1"
|
||||
"@sentry/types" "7.80.1"
|
||||
"@sentry/utils" "7.80.1"
|
||||
"@sentry-internal/tracing" "7.81.0"
|
||||
"@sentry/core" "7.81.0"
|
||||
"@sentry/types" "7.81.0"
|
||||
"@sentry/utils" "7.81.0"
|
||||
|
||||
"@sentry/types@5.30.0":
|
||||
version "5.30.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402"
|
||||
integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==
|
||||
|
||||
"@sentry/types@7.80.1":
|
||||
version "7.80.1"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.80.1.tgz#dc720d6f2da0b510d586814451a04a2cdd2f4a9d"
|
||||
integrity sha512-CVu4uPVTOI3U9kYiOdA085R7jX5H1oVODbs9y+A8opJ0dtJTMueCXgZyE8oXQ0NjGVs6HEeaLkOuiV0mj8X3yw==
|
||||
"@sentry/types@7.81.0":
|
||||
version "7.81.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.81.0.tgz#a093286c4016a2ff58aa8408ff873b7952a9386f"
|
||||
integrity sha512-rbYNYSSrrnwNndC7S+eVT84GRLEyCZNh9oXUQqzgSD6ngXCZ0xFJW6si75uv/XQBWIw4rkj9xfRcy8DU0Tj4fg==
|
||||
|
||||
"@sentry/utils@5.30.0":
|
||||
version "5.30.0"
|
||||
|
|
@ -1987,12 +1987,12 @@
|
|||
"@sentry/types" "5.30.0"
|
||||
tslib "^1.9.3"
|
||||
|
||||
"@sentry/utils@7.80.1":
|
||||
version "7.80.1"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.80.1.tgz#1c719f41b4d2c818363551fc40776a274b71efff"
|
||||
integrity sha512-bfFm2e/nEn+b9++QwjNEYCbS7EqmteT8uf0XUs7PljusSimIqqxDtK1pfD9zjynPgC8kW/fVBKv0pe2LufomeA==
|
||||
"@sentry/utils@7.81.0":
|
||||
version "7.81.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.81.0.tgz#b874664ebc5647eed2d3492ac4171819267262cb"
|
||||
integrity sha512-yC9IvfeVbG4dygi4b+iUUMHp9xeHJfCn6XLbqjJVfq3xjAzBGHgfrpw6fYPNyTljXKb6CTiSXSqaNaQJE4CkPA==
|
||||
dependencies:
|
||||
"@sentry/types" "7.80.1"
|
||||
"@sentry/types" "7.81.0"
|
||||
|
||||
"@sinclair/typebox@^0.24.1":
|
||||
version "0.24.40"
|
||||
|
|
@ -11117,6 +11117,11 @@ querystring@0.2.0:
|
|||
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
|
||||
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
|
||||
|
||||
querystringify@^2.1.1:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
|
||||
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
|
||||
|
||||
queue-microtask@^1.2.2:
|
||||
version "1.2.3"
|
||||
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
|
||||
|
|
@ -11765,16 +11770,16 @@ send@0.17.2:
|
|||
"@sentry/utils" "5.30.0"
|
||||
tslib "^1.9.3"
|
||||
|
||||
"sentrybrowser@npm:@sentry/browser@7.80.1":
|
||||
version "7.80.1"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.80.1.tgz#3e63a122846a4d5dec04237b97ae064b80546da4"
|
||||
integrity sha512-1dPR6vPJ9vOTzgXff9HGheb178XeEv5hyjBNhCO1f6rjCgnVj99XGNZIgO1Ee1ALJbqlfPWaeV+uSWbbcmgJMA==
|
||||
"sentrybrowser@npm:@sentry/browser@7.81.0":
|
||||
version "7.81.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.81.0.tgz#a026dfbf54312fb125c8fa7938062f25f64d7053"
|
||||
integrity sha512-/6xsdSeZspq7+LARg6Gt0KMUQRf6nZcuA20X9Y28uJqyZFYoXBnxG3+JJcxycxleEJRci20gjBwOtM157anUJA==
|
||||
dependencies:
|
||||
"@sentry-internal/tracing" "7.80.1"
|
||||
"@sentry/core" "7.80.1"
|
||||
"@sentry/replay" "7.80.1"
|
||||
"@sentry/types" "7.80.1"
|
||||
"@sentry/utils" "7.80.1"
|
||||
"@sentry-internal/tracing" "7.81.0"
|
||||
"@sentry/core" "7.81.0"
|
||||
"@sentry/replay" "7.81.0"
|
||||
"@sentry/types" "7.81.0"
|
||||
"@sentry/utils" "7.81.0"
|
||||
|
||||
serialize-javascript@^2.1.2:
|
||||
version "2.1.2"
|
||||
|
|
@ -12745,14 +12750,15 @@ touch@^3.1.0:
|
|||
dependencies:
|
||||
nopt "~1.0.10"
|
||||
|
||||
tough-cookie@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
|
||||
integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
|
||||
tough-cookie@4.1.3, tough-cookie@^4.0.0:
|
||||
version "4.1.3"
|
||||
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf"
|
||||
integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==
|
||||
dependencies:
|
||||
psl "^1.1.33"
|
||||
punycode "^2.1.1"
|
||||
universalify "^0.1.2"
|
||||
universalify "^0.2.0"
|
||||
url-parse "^1.5.3"
|
||||
|
||||
tr46@^2.1.0:
|
||||
version "2.1.0"
|
||||
|
|
@ -13124,10 +13130,10 @@ unist-util-visit@^4.0.0:
|
|||
unist-util-is "^5.0.0"
|
||||
unist-util-visit-parents "^5.0.0"
|
||||
|
||||
universalify@^0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
|
||||
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
|
||||
universalify@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
|
||||
integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
|
||||
|
||||
universalify@^2.0.0:
|
||||
version "2.0.0"
|
||||
|
|
@ -13183,6 +13189,14 @@ url-loader@^4.1.1:
|
|||
mime-types "^2.1.27"
|
||||
schema-utils "^3.0.0"
|
||||
|
||||
url-parse@^1.5.3:
|
||||
version "1.5.10"
|
||||
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
|
||||
integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
|
||||
dependencies:
|
||||
querystringify "^2.1.1"
|
||||
requires-port "^1.0.0"
|
||||
|
||||
url-search-params-polyfill@^7.0.0:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/url-search-params-polyfill/-/url-search-params-polyfill-7.0.1.tgz#b900cd9a0d9d2ff757d500135256f2344879cbff"
|
||||
|
|
|
|||
Loading…
Reference in New Issue