Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2023-11-21 12:10:44 +00:00
parent f73fa6daff
commit eec96715e5
43 changed files with 413 additions and 149 deletions

View File

@ -468,7 +468,6 @@
services:
- docker:${DOCKER_VERSION}-dind
variables:
DOCKER_DRIVER: overlay2
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
tags:

View File

@ -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
);
},
},

View File

@ -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';

View File

@ -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,

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -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'

View File

@ -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]

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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. |

View File

@ -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": "",

View File

@ -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",

View File

@ -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

View File

@ -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...

View File

@ -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.

View File

@ -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:

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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!

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 ""

View File

@ -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",

View File

@ -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)

View File

@ -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

View File

@ -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) }

View File

@ -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,

View File

@ -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'] }] }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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) }

View File

@ -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 }

View File

@ -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
View File

@ -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"