Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2023-10-11 09:11:29 +00:00
parent fd92c8afee
commit 289ce60cdc
59 changed files with 608 additions and 338 deletions

View File

@ -1,32 +1,6 @@
---
Capybara/TestidFinders:
Exclude:
- 'ee/spec/features/boards/user_adds_lists_to_board_spec.rb'
- 'ee/spec/features/ci/ci_catalog_spec.rb'
- 'ee/spec/features/ci/ci_minutes_spec.rb'
- 'ee/spec/features/epic_boards/epic_boards_sidebar_spec.rb'
- 'ee/spec/features/epic_boards/epic_boards_spec.rb'
- 'ee/spec/features/epics/epic_labels_spec.rb'
- 'ee/spec/features/epics/epic_related_epics_spec.rb'
- 'ee/spec/features/epics/epic_show_spec.rb'
- 'ee/spec/features/epics/update_epic_spec.rb'
- 'ee/spec/features/gitlab_subscriptions/seat_count_alert_spec.rb'
- 'ee/spec/features/groups/analytics/ci_cd_analytics_spec.rb'
- 'ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb'
- 'ee/spec/features/groups/analytics/cycle_analytics/filters_and_data_spec.rb'
- 'ee/spec/features/groups/analytics/cycle_analytics/multiple_value_streams_spec.rb'
- 'ee/spec/features/groups/contribution_analytics_spec.rb'
- 'ee/spec/features/groups/group_roadmap_spec.rb'
- 'ee/spec/features/groups/group_settings_spec.rb'
- 'ee/spec/features/groups/iterations/user_edits_iteration_cadence_spec.rb'
- 'ee/spec/features/groups/security/compliance_dashboards_spec.rb'
- 'ee/spec/features/groups/settings/user_configures_analytics_dashboards_spec.rb'
- 'ee/spec/features/groups/settings/user_configures_insights_spec.rb'
- 'ee/spec/features/groups/settings/user_configures_vsd_aggregation_spec.rb'
- 'ee/spec/features/groups/show_spec.rb'
- 'ee/spec/features/groups/usage_quotas/pipelines_tab_spec.rb'
- 'ee/spec/features/groups/usage_quotas/seats_tab_spec.rb'
- 'ee/spec/features/incidents/incident_details_spec.rb'
- 'ee/spec/features/incidents/user_uploads_metric_images_spec.rb'
- 'ee/spec/features/issues/blocking_issues_spec.rb'
- 'ee/spec/features/issues/epic_in_issue_sidebar_spec.rb'

View File

@ -990,8 +990,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/elastic/migrate/20220119120500_populate_commit_permissions_in_main_index_spec.rb'
- 'ee/spec/elastic/migrate/20221124090600_add_namespace_ancestry_ids_to_original_index_mapping_spec.rb'
- 'ee/spec/elastic/migrate/20221221110300_backfill_traversal_ids_to_blobs_and_wiki_blobs_spec.rb'
- 'ee/spec/frontend/fixtures/dora/metrics.rb'
- 'ee/spec/frontend/fixtures/oncall_schedule.rb'
- 'ee/spec/graphql/ee/mutations/boards/lists/create_spec.rb'
- 'ee/spec/graphql/ee/mutations/ci/runner/update_spec.rb'
- 'ee/spec/graphql/mutations/dast/profiles/create_spec.rb'
@ -1448,12 +1446,6 @@ Layout/ArgumentAlignment:
- 'spec/components/previews/pajamas/alert_component_preview.rb'
- 'spec/components/previews/pajamas/banner_component_preview.rb'
- 'spec/components/previews/pajamas/button_component_preview.rb'
- 'spec/frontend/fixtures/autocomplete.rb'
- 'spec/frontend/fixtures/autocomplete_sources.rb'
- 'spec/frontend/fixtures/environments.rb'
- 'spec/frontend/fixtures/issues.rb'
- 'spec/frontend/fixtures/releases.rb'
- 'spec/frontend/fixtures/search.rb'
- 'spec/graphql/features/authorization_spec.rb'
- 'spec/graphql/mutations/issues/set_assignees_spec.rb'
- 'spec/graphql/mutations/merge_requests/create_spec.rb'

View File

@ -26,7 +26,7 @@ export default {
<template>
<a
v-gl-tooltip:super-sidebar.hover.bottom="$options.i18n.homepage"
v-gl-tooltip:super-sidebar.bottom="$options.i18n.homepage"
class="brand-logo"
:href="rootPath"
data-track-action="click_link"

View File

@ -62,7 +62,7 @@ export default {
<template>
<gl-disclosure-dropdown
v-gl-tooltip:super-sidebar.hover.bottom="dropdownOpen ? '' : $options.i18n.createNew"
v-gl-tooltip:super-sidebar.bottom="dropdownOpen ? '' : $options.i18n.createNew"
category="tertiary"
icon="plus"
no-caret

View File

@ -89,7 +89,7 @@ export default {
<template>
<gl-button
v-gl-tooltip.hover="tooltip"
v-gl-tooltip="tooltip"
aria-controls="super-sidebar"
:aria-expanded="ariaExpanded"
:aria-label="$options.i18n.primaryNavigationSidebar"

View File

@ -153,7 +153,7 @@ export default {
class="gl-display-flex gl-justify-content-space-between gl-gap-2"
>
<counter
v-gl-tooltip:super-sidebar.hover.bottom="$options.i18n.issues"
v-gl-tooltip:super-sidebar.bottom="$options.i18n.issues"
class="gl-flex-basis-third dashboard-shortcuts-issues"
icon="issues"
:count="userCounts.assigned_issues"
@ -171,7 +171,7 @@ export default {
@hidden="mrMenuShown = false"
>
<counter
v-gl-tooltip:super-sidebar.hover.bottom="mrMenuShown ? '' : $options.i18n.mergeRequests"
v-gl-tooltip:super-sidebar.bottom="mrMenuShown ? '' : $options.i18n.mergeRequests"
class="gl-w-full"
icon="merge-request-open"
:count="mergeRequestTotalCount"
@ -183,7 +183,7 @@ export default {
/>
</merge-request-menu>
<counter
v-gl-tooltip:super-sidebar.hover.bottom="$options.i18n.todoList"
v-gl-tooltip:super-sidebar.bottom="$options.i18n.todoList"
class="gl-flex-basis-third shortcuts-todos js-todos-count"
icon="todo-done"
:count="userCounts.todos"
@ -197,7 +197,7 @@ export default {
</div>
<button
id="super-sidebar-search"
v-gl-tooltip.bottom.hover.html="searchTooltip"
v-gl-tooltip.bottom.html="searchTooltip"
v-gl-modal="$options.SEARCH_MODAL_ID"
class="counter gl-display-block gl-py-3 gl-bg-gray-10 gl-rounded-base gl-text-gray-900 gl-border-none gl-inset-border-1-gray-a-08 gl-line-height-1 gl-focus--focus gl-w-full"
data-testid="super-sidebar-search-button"

View File

@ -1,5 +1,5 @@
<script>
import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
import { GlCollapsibleListbox } from '@gitlab/ui';
import updateAlertStatusMutation from '~/graphql_shared/mutations/alert_status_update.mutation.graphql';
import { s__ } from '~/locale';
import Tracking from '~/tracking';
@ -11,10 +11,10 @@ export default {
'AlertManagement|There was an error while updating the status of the alert.',
),
UPDATE_ALERT_STATUS_INSTRUCTION: s__('AlertManagement|Please try again.'),
ASSIGN_STATUS_HEADER: s__('AlertManagement|Assign status'),
},
components: {
GlDropdown,
GlDropdownItem,
GlCollapsibleListbox,
},
inject: {
trackAlertStatusUpdateOptions: {
@ -44,10 +44,20 @@ export default {
default: () => PAGE_CONFIG.OPERATIONS.STATUSES,
},
},
data() {
return {
alertStatus: this.alert.status,
};
},
computed: {
dropdownClass() {
// eslint-disable-next-line no-nested-ternary
return this.isSidebar ? (this.isDropdownShowing ? 'show' : 'gl-display-none') : '';
return this.isSidebar && !this.isDropdownShowing ? 'gl-display-none' : '';
},
items() {
return Object.entries(this.statuses).map(([value, text]) => ({ value, text }));
},
headerText() {
return this.isSidebar ? this.$options.i18n.ASSIGN_STATUS_HEADER : '';
},
},
methods: {
@ -97,30 +107,15 @@ export default {
<template>
<div class="dropdown dropdown-menu-selectable" :class="dropdownClass">
<gl-dropdown
<gl-collapsible-listbox
ref="dropdown"
right
:text="statuses[alert.status]"
class="w-100"
toggle-class="dropdown-menu-toggle"
@keydown.esc.native="$emit('hide-dropdown')"
@hide="$emit('hide-dropdown')"
>
<p v-if="isSidebar" class="gl-dropdown-header-top" data-testid="dropdown-header">
{{ s__('AlertManagement|Assign status') }}
</p>
<div class="dropdown-content dropdown-body">
<gl-dropdown-item
v-for="(label, field) in statuses"
:key="field"
data-testid="statusDropdownItem"
:active="field === alert.status"
:active-class="'is-active'"
@click="updateAlertStatus(field)"
>
{{ label }}
</gl-dropdown-item>
</div>
</gl-dropdown>
v-model="alertStatus"
placement="right"
:header-text="headerText"
:items="items"
block
@hidden="$emit('hide-dropdown')"
@select="updateAlertStatus"
/>
</div>
</template>

View File

@ -58,9 +58,10 @@ export default {
},
toggleFormDropdown() {
this.isDropdownShowing = !this.isDropdownShowing;
const { dropdown } = this.$refs.status.$refs.dropdown.$refs;
const { dropdown } = this.$refs.status.$refs;
if (dropdown && this.isDropdownShowing) {
dropdown.show();
dropdown.open();
}
},
handleUpdating(isMutationInProgress) {

View File

@ -8,6 +8,11 @@ class Groups::AutocompleteSourcesController < Groups::ApplicationController
urgency :low, [:issues, :labels, :milestones, :commands, :merge_requests, :members]
def members
if Feature.enabled?(:cache_autocomplete_sources_members, current_user)
# Cache the response on the frontend
expires_in 3.minutes
end
render json: ::Groups::ParticipantsService.new(@group, current_user).execute(target)
end

View File

@ -13,6 +13,11 @@ class Projects::AutocompleteSourcesController < Projects::ApplicationController
urgency :low, [:issues, :labels, :milestones, :commands, :contacts]
def members
if Feature.enabled?(:cache_autocomplete_sources_members, current_user)
# Cache the response on the frontend
expires_in 3.minutes
end
render json: ::Projects::ParticipantsService.new(@project, current_user).execute(target)
end

View File

@ -1257,7 +1257,6 @@ class MergeRequest < ApplicationRecord
[
::MergeRequests::Mergeability::CheckOpenStatusService,
::MergeRequests::Mergeability::CheckDraftStatusService,
::MergeRequests::Mergeability::CheckNotPreparingService,
::MergeRequests::Mergeability::CheckBrokenStatusService,
::MergeRequests::Mergeability::CheckDiscussionsStatusService,
::MergeRequests::Mergeability::CheckCiStatusService
@ -1559,7 +1558,7 @@ class MergeRequest < ApplicationRecord
def mergeable_ci_state?
return true unless project.only_allow_merge_if_pipeline_succeeds?(inherit_group_setting: true)
return true unless actual_head_pipeline
return false unless actual_head_pipeline
return true if project.allow_merge_on_skipped_pipeline?(inherit_group_setting: true) && actual_head_pipeline.skipped?
actual_head_pipeline.success?

View File

@ -1,29 +0,0 @@
# frozen_string_literal: true
module MergeRequests
module Mergeability
class CheckNotPreparingService < CheckBaseService
def execute
if !merge_request.preparing?
success
else
failure(reason: failure_reason)
end
end
def skip?
false
end
def cacheable?
false
end
private
def failure_reason
:preparing
end
end
end
end

View File

@ -0,0 +1,8 @@
---
name: cache_autocomplete_sources_members
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/133454
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/427452
milestone: '16.5'
type: development
group: group::global search
default_enabled: false

View File

@ -21,6 +21,8 @@ class ExtendPushRulesRegexLimits < Gitlab::Database::Migration[2.1]
end
LONG_REGEX_COLUMNS.each do |column_name|
next unless column_exists?(:push_rules, column_name)
add_check_constraint :push_rules, "char_length(#{column_name}) <= 2047", "#{column_name}_size_constraint",
validate: false
end
@ -32,6 +34,8 @@ class ExtendPushRulesRegexLimits < Gitlab::Database::Migration[2.1]
end
LONG_REGEX_COLUMNS.each do |column_name|
next unless column_exists?(:push_rules, column_name)
remove_check_constraint :push_rules, "#{column_name}_size_constraint"
end
end

View File

@ -15,6 +15,8 @@ class ValidatePushRulesConstraints < Gitlab::Database::Migration[2.1]
def up
REGEX_COLUMNS.each do |column_name|
next unless column_exists?(:push_rules, column_name)
validate_check_constraint :push_rules, "#{column_name}_size_constraint"
end
end

View File

@ -5,10 +5,13 @@ class RemovePushRulesRegexLimits < Gitlab::Database::Migration[2.1]
change_column :push_rules, :force_push_regex, :string, limit: nil
change_column :push_rules, :delete_branch_regex, :string, limit: nil
change_column :push_rules, :commit_message_regex, :string, limit: nil
change_column :push_rules, :commit_message_negative_regex, :string, limit: nil
change_column :push_rules, :author_email_regex, :string, limit: nil
change_column :push_rules, :file_name_regex, :string, limit: nil
change_column :push_rules, :branch_name_regex, :string, limit: nil
return unless column_exists?(:push_rules, :commit_message_negative_regex)
change_column :push_rules, :commit_message_negative_regex, :string, limit: nil
end
def down

View File

@ -0,0 +1,47 @@
# frozen_string_literal: true
class ReplaceValueStreamProjectIdsFilterConstraint < Gitlab::Database::Migration[2.1]
enable_lock_retries!
def up
execute <<~SQL
ALTER TABLE analytics_cycle_analytics_value_stream_settings
DROP CONSTRAINT IF EXISTS chk_rails_a91b547c97;
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.constraint_column_usage
WHERE table_name = 'analytics_cycle_analytics_value_stream_settings'
AND constraint_name = 'project_ids_filter_array_check'
) THEN
ALTER TABLE analytics_cycle_analytics_value_stream_settings
ADD CONSTRAINT project_ids_filter_array_check
CHECK ((CARDINALITY(project_ids_filter) <= 100) AND (ARRAY_POSITION(project_ids_filter, null) IS null));
END IF;
END $$
SQL
end
def down
execute <<~SQL
ALTER TABLE analytics_cycle_analytics_value_stream_settings
DROP CONSTRAINT IF EXISTS project_ids_filter_array_check;
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.constraint_column_usage
WHERE table_name = 'analytics_cycle_analytics_value_stream_settings'
AND constraint_name = 'chk_rails_a91b547c97'
) THEN
ALTER TABLE analytics_cycle_analytics_value_stream_settings
ADD CONSTRAINT chk_rails_a91b547c97
CHECK (CARDINALITY(project_ids_filter) <= 100);
END IF;
END $$
SQL
end
end

View File

@ -2,12 +2,12 @@
class RemoveApplicationSettingsAiAccessTokenColumn < Gitlab::Database::Migration[2.1]
def up
remove_column :application_settings, :encrypted_ai_access_token
remove_column :application_settings, :encrypted_ai_access_token_iv
# no-op because the column was not ignored correctly,
# see https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/24523
end
def down
add_column :application_settings, :encrypted_ai_access_token, :binary
add_column :application_settings, :encrypted_ai_access_token_iv, :binary
# no-op because the column was not ignored correctly,
# see https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/24523
end
end

View File

@ -0,0 +1 @@
a895a8c09a53cb12d738aec7e35bdd32d7f98fef69c35f9216f8341181ee8e02

View File

@ -11182,7 +11182,7 @@ ALTER SEQUENCE analytics_cycle_analytics_stage_event_hashes_id_seq OWNED BY anal
CREATE TABLE analytics_cycle_analytics_value_stream_settings (
value_stream_id bigint NOT NULL,
project_ids_filter bigint[] DEFAULT '{}'::bigint[],
CONSTRAINT chk_rails_a91b547c97 CHECK ((cardinality(project_ids_filter) <= 100))
CONSTRAINT project_ids_filter_array_check CHECK (((cardinality(project_ids_filter) <= 100) AND (array_position(project_ids_filter, NULL::bigint) IS NULL)))
);
CREATE TABLE analytics_dashboards_pointers (
@ -11824,6 +11824,8 @@ CREATE TABLE application_settings (
wiki_asciidoc_allow_uri_includes boolean DEFAULT false NOT NULL,
namespace_aggregation_schedule_lease_duration_in_seconds integer DEFAULT 300 NOT NULL,
container_registry_data_repair_detail_worker_max_concurrency integer DEFAULT 2 NOT NULL,
encrypted_ai_access_token bytea,
encrypted_ai_access_token_iv bytea,
vertex_ai_host text,
encrypted_vertex_ai_credentials bytea,
encrypted_vertex_ai_credentials_iv bytea,

View File

@ -41,6 +41,9 @@ GitLab Enterprise Edition can receive paid features by registering with GitLab a
activity data through Service Ping. Features introduced here do not remove the feature from its paid
tier. Users can continue to access the features in a paid tier without sharing usage data.
NOTE:
Registration is not yet required for participation, but may be added in a future milestone.
### Features available in 14.1 and later
- [Email from GitLab](../email_from_gitlab.md).
@ -62,9 +65,6 @@ tier. Users can continue to access the features in a paid tier without sharing u
- [Group wikis](../../user/project/wiki/group.md).
NOTE:
Registration is not yet required for participation, but may be added in a future milestone.
### Enable registration features
1. Sign in as a user with administrator access.

View File

@ -376,7 +376,8 @@ This resource has been moved permanently to https://gitlab.example.com/api/v4/pr
GitLab supports the following pagination methods:
- Offset-based pagination. The default method and available on all endpoints.
- Offset-based pagination. The default method and available on all endpoints except,
in GitLab 16.5 and later, the `\users` endpoint.
- Keyset-based pagination. Added to selected endpoints but being
[progressively rolled out](https://gitlab.com/groups/gitlab-org/-/epics/2039).
@ -385,6 +386,8 @@ For large collections, you should use keyset pagination
### Offset-based pagination
> The `\users` endpoint was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/426547) for offset-based pagination in GitLab 16.5 and is planned for removal in 17.0. This change is a breaking change. Use keyset-based pagination for this endpoint instead.
Sometimes, the returned result spans many pages. When listing resources, you can
pass the following parameters:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 416 KiB

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Merge trains **(PREMIUM ALL)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/282442) support for [fast-forward](../../user/project/merge_requests/methods/index.md#fast-forward-merge) and [semi-linear](../../user/project/merge_requests/methods/index.md#merge-commit-with-semi-linear-history) merge methods in GitLab 16.5 [with a flag](../../administration/feature_flags.md) named `fast_forward_merge_trains_support`. The flag is enabled on GitLab.com and enabled by default on self-managed GitLab.
> Support for [fast-forward](../../user/project/merge_requests/methods/index.md#fast-forward-merge) and [semi-linear](../../user/project/merge_requests/methods/index.md#merge-commit-with-semi-linear-history) merge methods [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/282442) in GitLab 16.5 [with a flag](../../administration/feature_flags.md) named `fast_forward_merge_trains_support`. Enabled by default.
NOTE:
[In GitLab 16.0 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/359057), the **Start merge train**

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -287,10 +287,13 @@ If this behavior is needed on a larger table, ask for assistance in the `#databa
## Indexes for partitioned tables
Indexes [cannot be created](https://www.postgresql.org/docs/15/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE-MAINTENANCE)
**concurrently** on a partitioned table. You must use `CONCURRENTLY` to avoid service disruption in a hot system.
You [cannot create indexes](https://www.postgresql.org/docs/15/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE-MAINTENANCE)
concurrently on partitioned tables.
However, creating indexes non-concurrently holds a write lock on the table being indexed.
Therefore, you must use `CONCURRENTLY` when you create indexes to avoid service disruption in a hot system.
To create an index on a partitioned table, use `add_concurrent_partitioned_index`, provided by the database team.
As a workaround, the Database team has provided `add_concurrent_partitioned_index`.
This helper creates indexes on partitioned tables without holding a write lock.
Under the hood, `add_concurrent_partitioned_index`:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 MiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -101,3 +101,5 @@ module Sidebars
end
end
end
Sidebars::Projects::Menus::DeploymentsMenu.prepend_mod

View File

@ -87,6 +87,74 @@ namespace :gitlab do
end
end
desc "GitLab | Cleanup | Clean missed source branches to be deleted"
task remove_missed_source_branches: :gitlab_environment do
warn_user_is_not_gitlab
logger.info("Gitlab|Cleanup|Clean up missed source branches|Executed by #{gitlab_user}")
if ENV['LIMIT_TO_DELETE'].present? && !ENV['LIMIT_TO_DELETE'].to_i.between?(1, 10000)
logger.info("Please specify a limit between 1 and 10000")
next
end
if ENV['BATCH_SIZE'].present? && !ENV['BATCH_SIZE'].to_i.between?(1, 1000)
logger.info("Please specify a batch size between 1 and 1000")
next
end
batch_size = ENV['BATCH_SIZE'].present? ? ENV['BATCH_SIZE'].to_i : 1000
limit = ENV['LIMIT_TO_DELETE'].present? ? ENV['LIMIT_TO_DELETE'].to_i : 10000
project = find_project
user = User.find_by_id(ENV['USER_ID']&.to_i)
number_deleted = 0
# rubocop: disable Layout/LineLength
MergeRequest
.merged
.where(project: project)
.each_batch(of: batch_size) do |mrs|
matching_mrs = mrs.where(
"merge_params LIKE '%force_remove_source_branch: ''1''%' OR merge_params LIKE '%should_remove_source_branch: ''1''%'"
)
branches_to_delete = []
# rubocop: enable Layout/LineLength
matching_mrs.each do |mr|
next unless mr.source_branch_exists? && mr.can_remove_source_branch?(user)
# Ensuring that only this MR exists for the source branch
if MergeRequest.where(project: project).where.not(id: mr.id).where(source_branch: mr.source_branch).exists?
next
end
latest_diff_sha = mr.latest_merge_request_diff.head_commit_sha
next unless latest_diff_sha
branches_to_delete << { reference: mr.source_branch_ref, old_sha: latest_diff_sha,
new_sha: Gitlab::Git::BLANK_SHA }
break if number_deleted + branches_to_delete.size >= limit
end
if dry_run?
logger.info "DRY RUN: Branches to be deleted in batch #{branches_to_delete.join(',')}"
logger.info "DRY RUN: Count: #{branches_to_delete.size}"
else
project.repository.raw.update_refs(branches_to_delete)
logger.info "Branches deleted #{branches_to_delete.join(',')}"
end
number_deleted += branches_to_delete.size
break if number_deleted >= limit
end
end
desc 'GitLab | Cleanup | Clean orphan LFS files'
task orphan_lfs_files: :gitlab_environment do
warn_user_is_not_gitlab

View File

@ -14,7 +14,7 @@ module QA
describe 'Project import', product_group: :import_and_integrate do # rubocop:disable RSpec/MultipleMemoizedHelpers
let(:github_repo) { ENV['QA_LARGE_IMPORT_REPO'] || 'rspec/rspec-core' }
let(:import_max_duration) { ENV['QA_LARGE_IMPORT_DURATION']&.to_i || 7200 }
let(:api_parallel_threads) { ENV['QA_LARGE_IMPORT_GH_API_PARALLEL']&.to_i || Etc.nprocessors }
let(:api_parallel_threads) { ENV['QA_LARGE_IMPORT_API_PARALLEL']&.to_i || Etc.nprocessors }
let(:logger) { Runtime::Logger.logger }
let(:differ) { RSpec::Support::Differ.new(color: true) }
let(:gitlab_address) { QA::Runtime::Scenario.gitlab_address.chomp("/") }

View File

@ -18,6 +18,7 @@ module QA
let!(:gitlab_source_group) { ENV["QA_LARGE_IMPORT_GROUP"] || "gitlab-migration-large-import-test" }
let!(:gitlab_source_project) { ENV["QA_LARGE_IMPORT_REPO"] || "migration-test-project" }
let!(:import_wait_duration) { { max_duration: (ENV["QA_LARGE_IMPORT_DURATION"] || 3600).to_i, sleep_interval: 30 } }
let!(:api_parallel_threads) { ENV['QA_LARGE_IMPORT_API_PARALLEL']&.to_i || Etc.nprocessors }
# test uses production as source which doesn't have actual admin user
let!(:source_admin_user) { nil }
@ -327,7 +328,7 @@ module QA
def fetch_mrs(project, client, transform_urls: false)
imported_mrs = project.merge_requests(auto_paginate: true, attempts: 2)
Parallel.map(imported_mrs, in_threads: 6) do |mr|
Parallel.map(imported_mrs, in_threads: api_parallel_threads) do |mr|
resource = Resource::MergeRequest.init do |resource|
resource.project = project
resource.iid = mr[:iid]
@ -355,7 +356,7 @@ module QA
def fetch_issues(project, client, transform_urls: false)
imported_issues = project.issues(auto_paginate: true, attempts: 2)
Parallel.map(imported_issues, in_threads: 6) do |issue|
Parallel.map(imported_issues, in_threads: api_parallel_threads) do |issue|
resource = build(:issue, project: project, iid: issue[:iid], api_client: client)
[issue[:iid], {

View File

@ -63,7 +63,7 @@ RSpec.describe 'Alert details', :js, feature_category: :incident_management do
expect(alert_status).to have_content('Triggered')
find('.gl-button').click
find('.gl-dropdown-item', text: 'Acknowledged').click
find('.gl-new-dropdown-item', text: 'Acknowledged').click
wait_for_requests

View File

@ -26,7 +26,7 @@ RSpec.describe 'User updates Alert Management status', :js, feature_category: :i
it 'updates the alert status' do
find('.dropdown-menu-selectable').click
find('.dropdown-item', text: 'Acknowledged').click
find('.gl-new-dropdown-item', text: 'Acknowledged').click
wait_for_requests
expect(find('.dropdown-menu-selectable')).to have_content('Acknowledged')

View File

@ -335,7 +335,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
# Wait for the `ci_status` and `merge_check` requests
wait_for_requests
expect(page).to have_selector('.accept-merge-request')
expect(page).not_to have_selector('.accept-merge-request')
end
end

View File

@ -22,15 +22,17 @@ RSpec.describe ::AutocompleteController, '(JavaScript fixtures)', type: :control
project.add_developer(user)
end
get :users,
format: :json,
params: {
project_id: project.id,
active: true,
current_user: true,
author: merge_request.author.id,
merge_request_iid: merge_request.iid
}
get(
:users,
format: :json,
params: {
project_id: project.id,
active: true,
current_user: true,
author: merge_request.author.id,
merge_request_iid: merge_request.iid
}
)
expect(response).to be_successful
end

View File

@ -26,14 +26,16 @@ RSpec.describe Projects::AutocompleteSourcesController, '(JavaScript fixtures)',
create(:label, project: project, title: 'P3')
create(:label, project: project, title: 'P4')
get :labels,
format: :json,
params: {
namespace_id: group.path,
project_id: project.path,
type: issue.class.name,
type_id: issue.id
}
get(
:labels,
format: :json,
params: {
namespace_id: group.path,
project_id: project.path,
type: issue.class.name,
type_id: issue.id
}
)
expect(response).to be_successful
end

View File

@ -27,13 +27,16 @@ RSpec.describe 'Environments (JavaScript fixtures)', feature_category: :environm
query = get_graphql_query_as_string(environment_details_query_path)
puts project.full_path
puts environment.name
post_graphql(query, current_user: admin,
variables:
{
projectFullPath: project.full_path,
environmentName: environment.name,
pageSize: 10
})
post_graphql(
query,
current_user: admin,
variables:
{
projectFullPath: project.full_path,
environmentName: environment.name,
pageSize: 10
}
)
expect_graphql_errors_to_be_empty
end
end
@ -58,13 +61,16 @@ RSpec.describe 'Environments (JavaScript fixtures)', feature_category: :environm
it "graphql/#{environment_details_query_path}.json" do
query = get_graphql_query_as_string(environment_details_query_path)
post_graphql(query, current_user: admin,
variables:
{
projectFullPath: project.full_path,
environmentName: environment.name,
pageSize: 10
})
post_graphql(
query,
current_user: admin,
variables:
{
projectFullPath: project.full_path,
environmentName: environment.name,
pageSize: 10
}
)
expect_graphql_errors_to_be_empty
end
end

View File

@ -70,25 +70,29 @@ RSpec.describe API::Issues, '(JavaScript fixtures)', type: :request do
issue_title = 'foo'
issue_description = 'closed'
milestone = create(:milestone, title: '1.0.0', project: project)
issue = create :issue,
author: user,
assignees: [user],
project: project,
milestone: milestone,
created_at: generate(:past_time),
updated_at: 1.hour.ago,
title: issue_title,
description: issue_description
issue = create(
:issue,
author: user,
assignees: [user],
project: project,
milestone: milestone,
created_at: generate(:past_time),
updated_at: 1.hour.ago,
title: issue_title,
description: issue_description
)
project.add_reporter(user)
create_referencing_mr(user, project, issue)
create(:merge_request,
:simple,
author: user,
source_project: project,
target_project: project,
description: "Some description")
create(
:merge_request,
:simple,
author: user,
source_project: project,
target_project: project,
description: "Some description"
)
project2 = create(:project, :public, creator_id: user.id, namespace: user.namespace)
create_referencing_mr(user, project2, issue).update!(head_pipeline: create(:ci_pipeline))

View File

@ -11,23 +11,27 @@ RSpec.describe 'Releases (JavaScript fixtures)' do
let_it_be(:user) { create(:user, email: 'user@example.gitlab.com', username: 'user1') }
let_it_be(:milestone_12_3) do
create(:milestone,
id: 123,
project: project,
title: '12.3',
description: 'The 12.3 milestone',
start_date: Time.zone.parse('2018-12-10'),
due_date: Time.zone.parse('2019-01-10'))
create(
:milestone,
id: 123,
project: project,
title: '12.3',
description: 'The 12.3 milestone',
start_date: Time.zone.parse('2018-12-10'),
due_date: Time.zone.parse('2019-01-10')
)
end
let_it_be(:milestone_12_4) do
create(:milestone,
id: 124,
project: project,
title: '12.4',
description: 'The 12.4 milestone',
start_date: Time.zone.parse('2019-01-10'),
due_date: Time.zone.parse('2019-02-10'))
create(
:milestone,
id: 124,
project: project,
title: '12.4',
description: 'The 12.4 milestone',
start_date: Time.zone.parse('2019-01-10'),
due_date: Time.zone.parse('2019-02-10')
)
end
let_it_be(:open_issues_12_3) do
@ -47,68 +51,78 @@ RSpec.describe 'Releases (JavaScript fixtures)' do
end
let_it_be(:release) do
create(:release,
milestones: [milestone_12_3, milestone_12_4],
project: project,
tag: 'v1.1',
name: 'The first release',
author: user,
description: 'Best. Release. **Ever.** :rocket:',
created_at: Time.zone.parse('2018-12-3'),
released_at: Time.zone.parse('2018-12-10'))
create(
:release,
milestones: [milestone_12_3, milestone_12_4],
project: project,
tag: 'v1.1',
name: 'The first release',
author: user,
description: 'Best. Release. **Ever.** :rocket:',
created_at: Time.zone.parse('2018-12-3'),
released_at: Time.zone.parse('2018-12-10')
)
end
let_it_be(:evidence) do
create(:evidence,
release: release,
collected_at: Time.zone.parse('2018-12-03'))
create(:evidence, release: release, collected_at: Time.zone.parse('2018-12-03'))
end
let_it_be(:other_link) do
create(:release_link,
id: 10,
release: release,
name: 'linux-amd64 binaries',
filepath: '/binaries/linux-amd64',
url: 'https://downloads.example.com/bin/gitlab-linux-amd64')
create(
:release_link,
id: 10,
release: release,
name: 'linux-amd64 binaries',
filepath: '/binaries/linux-amd64',
url: 'https://downloads.example.com/bin/gitlab-linux-amd64'
)
end
let_it_be(:runbook_link) do
create(:release_link,
id: 11,
release: release,
name: 'Runbook',
url: "#{release.project.web_url}/runbook",
link_type: :runbook)
create(
:release_link,
id: 11,
release: release,
name: 'Runbook',
url: "#{release.project.web_url}/runbook",
link_type: :runbook
)
end
let_it_be(:package_link) do
create(:release_link,
id: 12,
release: release,
name: 'Package',
url: 'https://example.com/package',
link_type: :package)
create(
:release_link,
id: 12,
release: release,
name: 'Package',
url: 'https://example.com/package',
link_type: :package
)
end
let_it_be(:image_link) do
create(:release_link,
id: 13,
release: release,
name: 'Image',
url: 'https://example.com/image',
link_type: :image)
create(
:release_link,
id: 13,
release: release,
name: 'Image',
url: 'https://example.com/image',
link_type: :image
)
end
let_it_be(:another_release) do
create(:release,
project: project,
tag: 'v1.2',
name: 'The second release',
author: user,
description: 'An okay release :shrug:',
created_at: Time.zone.parse('2019-01-03'),
released_at: Time.zone.parse('2019-01-10'))
create(
:release,
project: project,
tag: 'v1.2',
name: 'The second release',
author: user,
description: 'An okay release :shrug:',
created_at: Time.zone.parse('2019-01-03'),
released_at: Time.zone.parse('2019-01-10')
)
end
before do

View File

@ -58,9 +58,10 @@ RSpec.describe SearchController, '(JavaScript fixtures)', type: :controller do
project_id: project.id,
startline: 2)
],
total_count: 4,
limit: 4,
offset: 0)
total_count: 4,
limit: 4,
offset: 0
)
end
before do

View File

@ -1,7 +1,7 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { GlDropdown, GlDropdownItem } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { GlCollapsibleListbox, GlListboxItem } from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import createMockApollo from 'helpers/mock_apollo_helper';
import updateAlertStatusMutation from '~/graphql_shared//mutations/alert_status_update.mutation.graphql';
@ -34,13 +34,13 @@ describe('AlertManagementStatus', () => {
},
});
const findStatusDropdown = () => wrapper.findComponent(GlDropdown);
const findFirstStatusOption = () => findStatusDropdown().findComponent(GlDropdownItem);
const findAllStatusOptions = () => findStatusDropdown().findAllComponents(GlDropdownItem);
const findStatusDropdownHeader = () => wrapper.findByTestId('dropdown-header');
const findStatusDropdown = () => wrapper.findComponent(GlCollapsibleListbox);
const findFirstStatusOption = () => findStatusDropdown().findComponent(GlListboxItem);
const findAllStatusOptions = () => findStatusDropdown().findAllComponents(GlListboxItem);
const findStatusDropdownHeader = () => wrapper.findByTestId('listbox-header-text');
const selectFirstStatusOption = () => {
findFirstStatusOption().vm.$emit('click');
findFirstStatusOption().vm.$emit('select', new Event('click'));
return waitForPromises();
};
@ -57,7 +57,7 @@ describe('AlertManagementStatus', () => {
provide = {},
handler = mockUpdatedMutationResult(),
} = {}) {
wrapper = shallowMountExtended(AlertManagementStatus, {
wrapper = mountExtended(AlertManagementStatus, {
apolloProvider: createMockApolloProvider(handler),
propsData: {
alert: { ...mockAlert },
@ -82,7 +82,7 @@ describe('AlertManagementStatus', () => {
it('shows the dropdown', () => {
mountComponent({ props: { isSidebar: true, isDropdownShowing: true } });
expect(wrapper.classes()).toContain('show');
expect(wrapper.classes()).not.toContain('gl-display-none');
});
});
@ -92,8 +92,7 @@ describe('AlertManagementStatus', () => {
});
it('calls `$apollo.mutate` with `updateAlertStatus` mutation and variables containing `iid`, `status`, & `projectPath`', async () => {
findFirstStatusOption().vm.$emit('click');
await waitForPromises();
await selectFirstStatusOption();
expect(requestHandler).toHaveBeenCalledWith({
iid,
@ -194,9 +193,7 @@ describe('AlertManagementStatus', () => {
handler: mockUpdatedMutationResult({ nodes: mockAlerts }),
});
Tracking.event.mockClear();
findFirstStatusOption().vm.$emit('click');
await waitForPromises();
await selectFirstStatusOption();
const status = findFirstStatusOption().text();
const { category, action, label } = trackAlertStatusUpdateOptions;

View File

@ -3694,7 +3694,7 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev
allow(subject).to receive(:head_pipeline).and_return(nil)
end
it { expect(subject.mergeable_ci_state?).to be_truthy }
it { expect(subject.mergeable_ci_state?).to be_falsey }
end
end
@ -3735,7 +3735,7 @@ RSpec.describe MergeRequest, factory_default: :keep, feature_category: :code_rev
allow(subject).to receive(:head_pipeline).and_return(nil)
end
it { expect(subject.mergeable_ci_state?).to be_truthy }
it { expect(subject.mergeable_ci_state?).to be_falsey }
end
end

View File

@ -1,39 +0,0 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe MergeRequests::Mergeability::CheckNotPreparingService, feature_category: :code_review_workflow do
let(:service) { described_class.new(merge_request: merge_request, params: {}) }
let(:merge_request) { build(:merge_request, merge_status: merge_status) }
let(:merge_status_value) { MergeRequest.state_machines[:merge_status].states[merge_status].value }
let(:merge_status) { :unchecked }
describe '#execute' do
subject(:result) { service.execute }
it 'is success when not preparing' do
expect(result.status).to eq Gitlab::MergeRequests::Mergeability::CheckResult::SUCCESS_STATUS
end
context 'when the merge request is preparing' do
let(:merge_status) { :preparing }
specify :aggregate_failures do
expect(result.status).to eq Gitlab::MergeRequests::Mergeability::CheckResult::FAILED_STATUS
expect(result.payload[:reason]).to eq(:preparing)
end
end
end
describe '#skip?' do
subject { service.skip? }
it { is_expected.to eq false }
end
describe '#cacheable?' do
subject { service.cacheable? }
it { is_expected.to eq false }
end
end

View File

@ -26,10 +26,10 @@ RSpec.describe ::MergeRequests::Mergeability::DetailedMergeStatusService, featur
context 'when merge status is preparing and merge request diff is persisted' do
let(:merge_request) { create(:merge_request, merge_status: :preparing) }
it 'returns :preparing' do
it 'returns :checking' do
allow(merge_request.merge_request_diff).to receive(:persisted?).and_return(true)
expect(detailed_merge_status).to eq(:preparing)
expect(detailed_merge_status).to eq(:mergeable)
end
end
@ -69,7 +69,7 @@ RSpec.describe ::MergeRequests::Mergeability::DetailedMergeStatusService, featur
end
end
context 'when ci check is required' do
context 'when all but the ci check fails' do
let(:merge_request) { create(:merge_request) }
before do
@ -78,7 +78,7 @@ RSpec.describe ::MergeRequests::Mergeability::DetailedMergeStatusService, featur
context 'when pipeline does not exist' do
it 'returns the failure reason' do
expect(detailed_merge_status).to eq(:mergeable)
expect(detailed_merge_status).to eq(:ci_must_pass)
end
end

View File

@ -6,8 +6,8 @@ module Features
page.find("[data-testid='#{testid}']", **kwargs)
end
def within_testid(testid, &block)
page.within("[data-testid='#{testid}']", &block)
def within_testid(testid, **kwargs, &block)
page.within("[data-testid='#{testid}']", **kwargs, &block)
end
end
end

View File

@ -165,6 +165,195 @@ RSpec.describe 'gitlab:cleanup rake tasks', :silence_stdout do
end
end
shared_examples 'does not remove any branches' do
it 'does not delete any branches' do
expect(project.repository.raw.find_branch(delete_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch(keep_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch('test')).not_to be_nil
rake_task
expect(project.repository.raw.find_branch(delete_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch(keep_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch('test')).not_to be_nil
end
end
describe 'gitlab:cleanup:remove_missed_source_branches' do
subject(:rake_task) { run_rake_task('gitlab:cleanup:remove_missed_source_branches', project.id, user.id, dry_run) }
let(:project) { create(:project, :repository) }
# Merged merge request with force source branch 1
# Merged merge request with force source branch 0
# Non merged merge request with force source branch 1
# Merged Merge request with delete not in project
# When can not delete source branch
let!(:mr1) do
project.repository.raw.create_branch(delete_branch_name, "master")
create(:merge_request, :merged, :remove_source_branch, source_project: project, target_project: project,
source_branch: delete_branch_name, target_branch: 'master')
end
let!(:mr2) do
project.repository.raw.create_branch(keep_branch_name, "master")
create(:merge_request, :merged, source_project: project, target_project: project, source_branch: keep_branch_name,
target_branch: 'master')
end
let!(:mr3) do
create(:merge_request, :remove_source_branch, source_project: project, target_project: project,
source_branch: keep_branch_name, target_branch: 'master')
end
let!(:mr4) do
create(:merge_request, :merged, :remove_source_branch, source_branch: keep_branch_name, target_branch: 'master')
end
let!(:mr5) do
create(:merge_request, :merged, :remove_source_branch, source_branch: 'test', source_project: project,
target_project: project, target_branch: 'master')
end
let!(:protected) do
create(:protected_branch, :create_branch_on_repository, project: project, name: mr5.source_branch)
end
let(:user) { create(:user, :admin) }
let(:dry_run) { true }
let(:delete_branch_name) { "to-be-deleted-soon" }
let(:delete_me_not) { "delete_me_not" }
let(:keep_branch_name) { "not-to-be-deleted-soon" }
before do
project.add_owner(user)
stub_env('USER_ID', user.id)
stub_env('PROJECT_ID', project.id)
end
context 'when dry run is true' do
it_behaves_like 'does not remove any branches'
context 'and when a valid batch size is given' do
it 'takes into account for the batch size' do
run_rake_task('gitlab:cleanup:remove_missed_source_branches', project.id, user.id, dry_run)
stub_env('BATCH_SIZE', '1')
count_1 = ActiveRecord::QueryRecorder.new do
run_rake_task('gitlab:cleanup:remove_missed_source_branches', project.id, user.id, dry_run)
end.count
stub_env('BATCH_SIZE', '2')
count_2 = ActiveRecord::QueryRecorder.new do
run_rake_task('gitlab:cleanup:remove_missed_source_branches', project.id, user.id, dry_run)
end.count
expect(count_1).to be > count_2
end
end
end
context 'when dry run is false' do
let!(:mr6) do
project.repository.raw.create_branch(delete_me_not, "master")
create(:merge_request, :merged, :remove_source_branch, source_project: project, target_project: project,
source_branch: delete_me_not, target_branch: 'master')
end
before do
stub_env('DRY_RUN', 'false')
end
it 'deletes the branches' do
expect(project.repository.raw.find_branch(delete_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch(keep_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch(delete_me_not)).not_to be_nil
expect(project.repository.raw.find_branch('test')).not_to be_nil
rake_task
expect(project.repository.raw.find_branch(delete_branch_name)).to be_nil
expect(project.repository.raw.find_branch(delete_me_not)).to be_nil
expect(project.repository.raw.find_branch(keep_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch('test')).not_to be_nil
end
context 'when a limit is set' do
before do
stub_env('LIMIT_TO_DELETE', 1)
end
it 'deletes only one branch' do
expect(project.repository.raw.find_branch(delete_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch(keep_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch(delete_me_not)).not_to be_nil
expect(project.repository.raw.find_branch('test')).not_to be_nil
rake_task
expect(project.repository.raw.find_branch(delete_branch_name)).to be_nil
expect(project.repository.raw.find_branch(delete_me_not)).not_to be_nil
expect(project.repository.raw.find_branch(keep_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch('test')).not_to be_nil
end
end
context 'when the branch has a merged and opened mr' do
let!(:mr7) do
project.repository.raw.create_branch(delete_me_not, "master")
create(:merge_request, :opened, :remove_source_branch, source_project: project, target_project: project,
source_branch: delete_me_not, target_branch: 'master')
end
it 'does not delete the branch of the merged/open mr' do
expect(project.repository.raw.find_branch(delete_me_not)).not_to be_nil
rake_task
expect(project.repository.raw.find_branch(delete_me_not)).not_to be_nil
end
end
context 'when an valid batch size is given' do
before do
stub_env('BATCH_SIZE', '1')
end
it 'deletes the branches' do
expect(project.repository.raw.find_branch(delete_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch(keep_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch('test')).not_to be_nil
rake_task
expect(project.repository.raw.find_branch(delete_branch_name)).to be_nil
expect(project.repository.raw.find_branch(keep_branch_name)).not_to be_nil
expect(project.repository.raw.find_branch('test')).not_to be_nil
end
end
context 'when an invalid batch size is given' do
before do
stub_env('BATCH_SIZE', '-1')
end
it_behaves_like 'does not remove any branches'
end
context 'when an invalid limit to delete is given' do
before do
stub_env('LIMIT_TO_DELETE', '-1')
end
it_behaves_like 'does not remove any branches'
end
end
end
context 'sessions' do
describe 'gitlab:cleanup:sessions:active_sessions_lookup_keys', :clean_gitlab_redis_sessions do
subject(:rake_task) { run_rake_task('gitlab:cleanup:sessions:active_sessions_lookup_keys') }

View File

@ -26,25 +26,25 @@ require (
github.com/sirupsen/logrus v1.9.3
github.com/smartystreets/goconvey v1.8.1
github.com/stretchr/testify v1.8.4
gitlab.com/gitlab-org/gitaly/v16 v16.1.2
gitlab.com/gitlab-org/gitaly/v16 v16.4.1
gitlab.com/gitlab-org/labkit v1.20.0
gocloud.dev v0.34.0
golang.org/x/image v0.7.0
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616
golang.org/x/net v0.14.0
golang.org/x/net v0.16.0
golang.org/x/oauth2 v0.10.0
golang.org/x/tools v0.12.1-0.20230825192346-2191a27a6dc5
golang.org/x/tools v0.13.0
google.golang.org/grpc v1.58.2
google.golang.org/protobuf v1.31.0
honnef.co/go/tools v0.4.6
)
require (
cloud.google.com/go v0.110.7 // indirect
cloud.google.com/go v0.110.8 // indirect
cloud.google.com/go/compute v1.23.0 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
cloud.google.com/go/iam v1.1.1 // indirect
cloud.google.com/go/monitoring v1.15.1 // indirect
cloud.google.com/go/iam v1.1.2 // indirect
cloud.google.com/go/monitoring v1.16.0 // indirect
cloud.google.com/go/profiler v0.1.0 // indirect
cloud.google.com/go/storage v1.31.0 // indirect
cloud.google.com/go/trace v1.10.1 // indirect
@ -58,7 +58,7 @@ require (
github.com/DataDog/datadog-go v4.4.0+incompatible // indirect
github.com/DataDog/sketches-go v1.0.0 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/beevik/ntp v1.0.0 // indirect
github.com/beevik/ntp v1.3.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d // indirect
@ -74,13 +74,13 @@ require (
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 // indirect
github.com/google/s2a-go v0.1.4 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/google/uuid v1.3.1 // indirect
github.com/google/wire v0.5.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
github.com/gopherjs/gopherjs v1.17.2 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
github.com/hashicorp/yamux v0.1.1 // indirect
github.com/hashicorp/yamux v0.1.2-0.20220728231024-8f49b6f63f18 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/jtolds/gls v4.20.0+incompatible // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
@ -112,19 +112,19 @@ require (
github.com/yusufpapurcu/wmi v1.2.2 // indirect
go.opencensus.io v0.24.0 // indirect
go.uber.org/atomic v1.11.0 // indirect
golang.org/x/crypto v0.12.0 // indirect
golang.org/x/crypto v0.14.0 // indirect
golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a // indirect
golang.org/x/mod v0.12.0 // indirect
golang.org/x/sync v0.3.0 // indirect
golang.org/x/sys v0.11.0 // indirect
golang.org/x/text v0.12.0 // indirect
golang.org/x/sys v0.13.0 // indirect
golang.org/x/text v0.13.0 // indirect
golang.org/x/time v0.3.0 // indirect
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
google.golang.org/api v0.134.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20230731193218-e0aa005b6bdf // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230731193218-e0aa005b6bdf // indirect
google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c // indirect
gopkg.in/DataDog/dd-trace-go.v1 v1.32.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

View File

@ -24,8 +24,8 @@ cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSU
cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
cloud.google.com/go v0.92.2/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o=
cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI=
cloud.google.com/go v0.110.8 h1:tyNdfIxjzaWctIiLYOTalaLKZ17SI44SKFW26QbOhME=
cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
@ -38,10 +38,10 @@ cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGB
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y=
cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU=
cloud.google.com/go/monitoring v1.15.1 h1:65JhLMd+JiYnXr6j5Z63dUYCuOg770p8a/VC+gil/58=
cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM=
cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4=
cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU=
cloud.google.com/go/monitoring v1.16.0 h1:rlndy4K8yknMY9JuGe2aK4SbCh21FXoCdX7SAGHmRgI=
cloud.google.com/go/monitoring v1.16.0/go.mod h1:Ptp15HgAyM1fNICAojDMoNc/wUmn67mLHQfyqbw+poY=
cloud.google.com/go/profiler v0.1.0 h1:MG/rxKC1MztRfEWMGYKFISxyZak5hNh29f0A/z2tvWk=
cloud.google.com/go/profiler v0.1.0/go.mod h1:D7S7LV/zKbRWkOzYL1b5xytpqt8Ikd/v/yvf1/Tx2pQ=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
@ -118,8 +118,8 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 h1:DSNpSbfEgFXRV+IfEcKE5kTbqxm+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 h1:hd0SKLMdOL/Sl6Z0np1PX9LeH2gqNtBe0MhTedA8MGI=
github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 h1:pAOJj+80tC8sPVgSDHzMYD6KLWsaLQ1kZw31PTeORbs=
github.com/aws/smithy-go v1.14.0 h1:+X90sB94fizKjDmwb4vyl2cTTPXTE5E2G/1mjByb0io=
github.com/beevik/ntp v1.0.0 h1:d0Lgy1xbNNqVyGfvg2Z96ItKcfyn3lzgus/oRoj9vnk=
github.com/beevik/ntp v1.0.0/go.mod h1:JN7/74B0Z4GUGO/1aUeRI2adARlfJGUeaJb0y0Wvnf4=
github.com/beevik/ntp v1.3.0 h1:/w5VhpW5BGKS37vFm1p9oVk/t4HnnkKZAZIubHM6F7Q=
github.com/beevik/ntp v1.3.0/go.mod h1:vD6h1um4kzXpqmLTuu0cCLcC+NfvC0IC+ltmEDA8E78=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
@ -284,8 +284,8 @@ github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc=
github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=
github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=
github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM=
@ -308,8 +308,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v0.0.0-20170914154624-68e816d1c783/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
github.com/hashicorp/yamux v0.1.2-0.20220728231024-8f49b6f63f18 h1:IVujPV6DRIu1fYF4zUHrfhkngJzmYjelXa+iSUiFZSI=
github.com/hashicorp/yamux v0.1.2-0.20220728231024-8f49b6f63f18/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
@ -435,7 +435,6 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ=
@ -458,8 +457,8 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
gitlab.com/gitlab-org/gitaly/v16 v16.1.2 h1:l7sltwjB/shkqlbuQzfeS3PonrQljCBKOZ2Uozk8ewA=
gitlab.com/gitlab-org/gitaly/v16 v16.1.2/go.mod h1:gfmwpE66X4lwAO/RdchFhNINSwteGFer4loUOa94nQE=
gitlab.com/gitlab-org/gitaly/v16 v16.4.1 h1:Qh5TFK+Jy/mBV8hCfNro2VCqRrhgt3M2iTrdYVF5N6o=
gitlab.com/gitlab-org/gitaly/v16 v16.4.1/go.mod h1:TdN/Q3OqxU75pcp8V5YWpnE8Gk6dagwlC/HefNnW1IE=
gitlab.com/gitlab-org/labkit v1.20.0 h1:DGIVAdzbCR8sq2TppBvAh35wWBYIOy5dBL5wqFK3Wa8=
gitlab.com/gitlab-org/labkit v1.20.0/go.mod h1:zeATDAaSBelPcPLbTTq8J3ZJEHyPTLVBM1q3nva+/W4=
go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
@ -489,8 +488,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@ -501,7 +501,7 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw=
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a h1:Jw5wfR+h9mnIYH+OtGT2im5wV1YGGDora5vTv/aa5bE=
golang.org/x/exp/typeparams v0.0.0-20221208152030-732eee02a75a/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
@ -579,8 +579,10 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos=
golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -673,13 +675,18 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -693,8 +700,9 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/time v0.0.0-20170424234030-8be79e1e0910/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@ -760,8 +768,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4=
golang.org/x/tools v0.12.1-0.20230825192346-2191a27a6dc5 h1:Vk4mysSz+GqQK2eqgWbo4zEO89wkeAjJiFIr9bpqa8k=
golang.org/x/tools v0.12.1-0.20230825192346-2191a27a6dc5/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM=
golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@ -858,12 +866,12 @@ google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm
google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf h1:v5Cf4E9+6tawYrs/grq1q1hFpGtzlGFzgWHqwt6NFiU=
google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8=
google.golang.org/genproto/googleapis/api v0.0.0-20230731193218-e0aa005b6bdf h1:xkVZ5FdZJF4U82Q/JS+DcZA83s/GRVL+QrFMlexk9Yo=
google.golang.org/genproto/googleapis/api v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230731193218-e0aa005b6bdf h1:guOdSPaeFgN+jEJwTo1dQ71hdBm+yKSCCKuTRkJzcVo=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I=
google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97 h1:SeZZZx0cP0fqUyA+oRzP9k7cSwJlvDFiROO72uwD6i0=
google.golang.org/genproto v0.0.0-20231002182017-d307bd883b97/go.mod h1:t1VqOqqvce95G3hIDCT5FeO3YUc6Q4Oe24L/+rNMxRk=
google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13 h1:U7+wNaVuSTaUqNvK2+osJ9ejEZxbjHHk8F2b6Hpx0AE=
google.golang.org/genproto/googleapis/api v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:RdyHbowztCGQySiCvQPgWQWgWhGnouTdCflKoDBt32U=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c h1:jHkCUWkseRf+W+edG5hMzr/Uh1xkDREY4caybAq4dpY=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c/go.mod h1:4cYg8o5yUbm77w8ZX00LhMVNl/YVBFJRYWDc0uYWMs0=
google.golang.org/grpc v1.2.1-0.20170921194603-d4b75ebd4f9f/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=