Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.rubocop_todo/capybara/testid_finders.yml26
-rw-r--r--.rubocop_todo/layout/argument_alignment.yml8
-rw-r--r--app/assets/javascripts/super_sidebar/components/brand_logo.vue2
-rw-r--r--app/assets/javascripts/super_sidebar/components/create_menu.vue2
-rw-r--r--app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue2
-rw-r--r--app/assets/javascripts/super_sidebar/components/user_bar.vue8
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/alert_status.vue53
-rw-r--r--app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue5
-rw-r--r--app/controllers/groups/autocomplete_sources_controller.rb5
-rw-r--r--app/controllers/projects/autocomplete_sources_controller.rb5
-rw-r--r--app/models/merge_request.rb3
-rw-r--r--app/services/merge_requests/mergeability/check_not_preparing_service.rb29
-rw-r--r--config/feature_flags/development/cache_autocomplete_sources_members.yml8
-rw-r--r--db/migrate/20230828153646_extend_push_rules_regex_limits.rb4
-rw-r--r--db/migrate/20230830084959_validate_push_rules_constraints.rb2
-rw-r--r--db/migrate/20230830085501_remove_push_rules_regex_limits.rb5
-rw-r--r--db/migrate/20231006154748_replace_value_stream_project_ids_filter_constraint.rb47
-rw-r--r--db/post_migrate/20230926113518_remove_application_settings_ai_access_token_column.rb8
-rw-r--r--db/schema_migrations/202310061547481
-rw-r--r--db/structure.sql4
-rw-r--r--doc/administration/settings/usage_statistics.md6
-rw-r--r--doc/api/rest/index.md5
-rw-r--r--doc/architecture/blueprints/ai_gateway/img/architecture.pngbin242553 -> 90644 bytes
-rw-r--r--doc/architecture/blueprints/capacity_planning/images/image-20230911144743188.pngbin62446 -> 24672 bytes
-rw-r--r--doc/architecture/blueprints/capacity_planning/images/tamland-as-a-service.pngbin88964 -> 46896 bytes
-rw-r--r--doc/architecture/blueprints/capacity_planning/images/tamland-as-part-of-stack.pngbin74491 -> 38591 bytes
-rw-r--r--doc/architecture/blueprints/observability_metrics/metrics-read-path.pngbin69105 -> 24109 bytes
-rw-r--r--doc/architecture/blueprints/observability_metrics/metrics_indexing_at_ingestion.pngbin132942 -> 49164 bytes
-rw-r--r--doc/architecture/blueprints/observability_metrics/query-service-internals.pngbin114197 -> 38793 bytes
-rw-r--r--doc/architecture/blueprints/runway/img/runway-architecture.pngbin426450 -> 115461 bytes
-rw-r--r--doc/architecture/blueprints/runway/img/runway_vault_4_.drawio.pngbin134342 -> 69309 bytes
-rw-r--r--doc/ci/pipelines/merge_trains.md2
-rw-r--r--doc/ci/review_apps/img/enable_review_app_v16.pngbin105290 -> 33945 bytes
-rw-r--r--doc/development/cloud_connector/img/code_suggestions_components.pngbin44296 -> 19180 bytes
-rw-r--r--doc/development/database/adding_database_indexes.md9
-rw-r--r--doc/tutorials/left_sidebar/img/admin_area_v16_4.pngbin18865 -> 5913 bytes
-rw-r--r--doc/user/img/enable_AI_ML_features.pngbin0 -> 24498 bytes
-rw-r--r--doc/user/img/forecast_deployment_frequency.pngbin7158468 -> 18003 bytes
-rw-r--r--lib/sidebars/projects/menus/deployments_menu.rb2
-rw-r--r--lib/tasks/gitlab/cleanup.rake68
-rw-r--r--qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb2
-rw-r--r--qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb5
-rw-r--r--spec/features/alert_management/alert_details_spec.rb2
-rw-r--r--spec/features/alert_management/user_updates_alert_status_spec.rb2
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb2
-rw-r--r--spec/frontend/fixtures/autocomplete.rb20
-rw-r--r--spec/frontend/fixtures/autocomplete_sources.rb18
-rw-r--r--spec/frontend/fixtures/environments.rb34
-rw-r--r--spec/frontend/fixtures/issues.rb34
-rw-r--r--spec/frontend/fixtures/releases.rb130
-rw-r--r--spec/frontend/fixtures/search.rb7
-rw-r--r--spec/frontend/vue_shared/alert_details/alert_status_spec.js25
-rw-r--r--spec/models/merge_request_spec.rb4
-rw-r--r--spec/services/merge_requests/mergeability/check_not_preparing_service_spec.rb39
-rw-r--r--spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb8
-rw-r--r--spec/support/helpers/features/dom_helpers.rb4
-rw-r--r--spec/tasks/gitlab/cleanup_rake_spec.rb189
-rw-r--r--workhorse/go.mod30
-rw-r--r--workhorse/go.sum72
59 files changed, 608 insertions, 338 deletions
diff --git a/.rubocop_todo/capybara/testid_finders.yml b/.rubocop_todo/capybara/testid_finders.yml
index 5b22bdb75b7..0835a10da52 100644
--- a/.rubocop_todo/capybara/testid_finders.yml
+++ b/.rubocop_todo/capybara/testid_finders.yml
@@ -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'
diff --git a/.rubocop_todo/layout/argument_alignment.yml b/.rubocop_todo/layout/argument_alignment.yml
index 5500dfb1714..c0025e1b8b0 100644
--- a/.rubocop_todo/layout/argument_alignment.yml
+++ b/.rubocop_todo/layout/argument_alignment.yml
@@ -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'
diff --git a/app/assets/javascripts/super_sidebar/components/brand_logo.vue b/app/assets/javascripts/super_sidebar/components/brand_logo.vue
index 2e6c597ea96..c280c03591b 100644
--- a/app/assets/javascripts/super_sidebar/components/brand_logo.vue
+++ b/app/assets/javascripts/super_sidebar/components/brand_logo.vue
@@ -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"
diff --git a/app/assets/javascripts/super_sidebar/components/create_menu.vue b/app/assets/javascripts/super_sidebar/components/create_menu.vue
index c526afa2371..279e689bd8d 100644
--- a/app/assets/javascripts/super_sidebar/components/create_menu.vue
+++ b/app/assets/javascripts/super_sidebar/components/create_menu.vue
@@ -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
diff --git a/app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue b/app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue
index 049a61e17c7..71c1460423e 100644
--- a/app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue
+++ b/app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue
@@ -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"
diff --git a/app/assets/javascripts/super_sidebar/components/user_bar.vue b/app/assets/javascripts/super_sidebar/components/user_bar.vue
index ea634d43a96..88ea4d828b7 100644
--- a/app/assets/javascripts/super_sidebar/components/user_bar.vue
+++ b/app/assets/javascripts/super_sidebar/components/user_bar.vue
@@ -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"
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/alert_status.vue b/app/assets/javascripts/vue_shared/alert_details/components/alert_status.vue
index 8d2ef20b381..3855e4fc078 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/alert_status.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/alert_status.vue
@@ -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>
diff --git a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue
index c512585b980..7b099516c5b 100644
--- a/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue
+++ b/app/assets/javascripts/vue_shared/alert_details/components/sidebar/sidebar_status.vue
@@ -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) {
diff --git a/app/controllers/groups/autocomplete_sources_controller.rb b/app/controllers/groups/autocomplete_sources_controller.rb
index 414461d9e93..86bf65f4723 100644
--- a/app/controllers/groups/autocomplete_sources_controller.rb
+++ b/app/controllers/groups/autocomplete_sources_controller.rb
@@ -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
diff --git a/app/controllers/projects/autocomplete_sources_controller.rb b/app/controllers/projects/autocomplete_sources_controller.rb
index 480e3408023..60c8fe97e81 100644
--- a/app/controllers/projects/autocomplete_sources_controller.rb
+++ b/app/controllers/projects/autocomplete_sources_controller.rb
@@ -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
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 5629baa4f88..72b0632f9fd 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -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?
diff --git a/app/services/merge_requests/mergeability/check_not_preparing_service.rb b/app/services/merge_requests/mergeability/check_not_preparing_service.rb
deleted file mode 100644
index 1ffa8117f97..00000000000
--- a/app/services/merge_requests/mergeability/check_not_preparing_service.rb
+++ /dev/null
@@ -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
diff --git a/config/feature_flags/development/cache_autocomplete_sources_members.yml b/config/feature_flags/development/cache_autocomplete_sources_members.yml
new file mode 100644
index 00000000000..c80a7490031
--- /dev/null
+++ b/config/feature_flags/development/cache_autocomplete_sources_members.yml
@@ -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
diff --git a/db/migrate/20230828153646_extend_push_rules_regex_limits.rb b/db/migrate/20230828153646_extend_push_rules_regex_limits.rb
index ba5e8e54f9f..27b28adf08e 100644
--- a/db/migrate/20230828153646_extend_push_rules_regex_limits.rb
+++ b/db/migrate/20230828153646_extend_push_rules_regex_limits.rb
@@ -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
diff --git a/db/migrate/20230830084959_validate_push_rules_constraints.rb b/db/migrate/20230830084959_validate_push_rules_constraints.rb
index 99b5d680642..ffd0d2605da 100644
--- a/db/migrate/20230830084959_validate_push_rules_constraints.rb
+++ b/db/migrate/20230830084959_validate_push_rules_constraints.rb
@@ -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
diff --git a/db/migrate/20230830085501_remove_push_rules_regex_limits.rb b/db/migrate/20230830085501_remove_push_rules_regex_limits.rb
index 31d85e3ec11..c5bfb1ee080 100644
--- a/db/migrate/20230830085501_remove_push_rules_regex_limits.rb
+++ b/db/migrate/20230830085501_remove_push_rules_regex_limits.rb
@@ -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
diff --git a/db/migrate/20231006154748_replace_value_stream_project_ids_filter_constraint.rb b/db/migrate/20231006154748_replace_value_stream_project_ids_filter_constraint.rb
new file mode 100644
index 00000000000..04b8a6fa5de
--- /dev/null
+++ b/db/migrate/20231006154748_replace_value_stream_project_ids_filter_constraint.rb
@@ -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
diff --git a/db/post_migrate/20230926113518_remove_application_settings_ai_access_token_column.rb b/db/post_migrate/20230926113518_remove_application_settings_ai_access_token_column.rb
index 1b3512fc5a5..6a17cd1427e 100644
--- a/db/post_migrate/20230926113518_remove_application_settings_ai_access_token_column.rb
+++ b/db/post_migrate/20230926113518_remove_application_settings_ai_access_token_column.rb
@@ -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
diff --git a/db/schema_migrations/20231006154748 b/db/schema_migrations/20231006154748
new file mode 100644
index 00000000000..9290317c02e
--- /dev/null
+++ b/db/schema_migrations/20231006154748
@@ -0,0 +1 @@
+a895a8c09a53cb12d738aec7e35bdd32d7f98fef69c35f9216f8341181ee8e02 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 342e19a7845..4d798248b4c 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -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,
diff --git a/doc/administration/settings/usage_statistics.md b/doc/administration/settings/usage_statistics.md
index 07bc1064c1e..a76dc983887 100644
--- a/doc/administration/settings/usage_statistics.md
+++ b/doc/administration/settings/usage_statistics.md
@@ -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.
diff --git a/doc/api/rest/index.md b/doc/api/rest/index.md
index 059efa15602..14f128bd0e4 100644
--- a/doc/api/rest/index.md
+++ b/doc/api/rest/index.md
@@ -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:
diff --git a/doc/architecture/blueprints/ai_gateway/img/architecture.png b/doc/architecture/blueprints/ai_gateway/img/architecture.png
index 89e7263c30d..60b298376ac 100644
--- a/doc/architecture/blueprints/ai_gateway/img/architecture.png
+++ b/doc/architecture/blueprints/ai_gateway/img/architecture.png
Binary files differ
diff --git a/doc/architecture/blueprints/capacity_planning/images/image-20230911144743188.png b/doc/architecture/blueprints/capacity_planning/images/image-20230911144743188.png
index 9a1a67b4b76..f56f5b391fc 100644
--- a/doc/architecture/blueprints/capacity_planning/images/image-20230911144743188.png
+++ b/doc/architecture/blueprints/capacity_planning/images/image-20230911144743188.png
Binary files differ
diff --git a/doc/architecture/blueprints/capacity_planning/images/tamland-as-a-service.png b/doc/architecture/blueprints/capacity_planning/images/tamland-as-a-service.png
index 450df724c98..fa8f1223917 100644
--- a/doc/architecture/blueprints/capacity_planning/images/tamland-as-a-service.png
+++ b/doc/architecture/blueprints/capacity_planning/images/tamland-as-a-service.png
Binary files differ
diff --git a/doc/architecture/blueprints/capacity_planning/images/tamland-as-part-of-stack.png b/doc/architecture/blueprints/capacity_planning/images/tamland-as-part-of-stack.png
index 54ca572e344..0b47d91e133 100644
--- a/doc/architecture/blueprints/capacity_planning/images/tamland-as-part-of-stack.png
+++ b/doc/architecture/blueprints/capacity_planning/images/tamland-as-part-of-stack.png
Binary files differ
diff --git a/doc/architecture/blueprints/observability_metrics/metrics-read-path.png b/doc/architecture/blueprints/observability_metrics/metrics-read-path.png
index f92d601a708..c94e947079b 100644
--- a/doc/architecture/blueprints/observability_metrics/metrics-read-path.png
+++ b/doc/architecture/blueprints/observability_metrics/metrics-read-path.png
Binary files differ
diff --git a/doc/architecture/blueprints/observability_metrics/metrics_indexing_at_ingestion.png b/doc/architecture/blueprints/observability_metrics/metrics_indexing_at_ingestion.png
index 6ce37588cff..cafabac25c0 100644
--- a/doc/architecture/blueprints/observability_metrics/metrics_indexing_at_ingestion.png
+++ b/doc/architecture/blueprints/observability_metrics/metrics_indexing_at_ingestion.png
Binary files differ
diff --git a/doc/architecture/blueprints/observability_metrics/query-service-internals.png b/doc/architecture/blueprints/observability_metrics/query-service-internals.png
index f59d7096194..de43f812fa8 100644
--- a/doc/architecture/blueprints/observability_metrics/query-service-internals.png
+++ b/doc/architecture/blueprints/observability_metrics/query-service-internals.png
Binary files differ
diff --git a/doc/architecture/blueprints/runway/img/runway-architecture.png b/doc/architecture/blueprints/runway/img/runway-architecture.png
index e577eb7fd15..4ab4cf882c2 100644
--- a/doc/architecture/blueprints/runway/img/runway-architecture.png
+++ b/doc/architecture/blueprints/runway/img/runway-architecture.png
Binary files differ
diff --git a/doc/architecture/blueprints/runway/img/runway_vault_4_.drawio.png b/doc/architecture/blueprints/runway/img/runway_vault_4_.drawio.png
index b56e326c8c4..2a35df44aa8 100644
--- a/doc/architecture/blueprints/runway/img/runway_vault_4_.drawio.png
+++ b/doc/architecture/blueprints/runway/img/runway_vault_4_.drawio.png
Binary files differ
diff --git a/doc/ci/pipelines/merge_trains.md b/doc/ci/pipelines/merge_trains.md
index 80069fe37f6..b7f081886a6 100644
--- a/doc/ci/pipelines/merge_trains.md
+++ b/doc/ci/pipelines/merge_trains.md
@@ -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**
diff --git a/doc/ci/review_apps/img/enable_review_app_v16.png b/doc/ci/review_apps/img/enable_review_app_v16.png
index 00e305d6a6b..f783632059a 100644
--- a/doc/ci/review_apps/img/enable_review_app_v16.png
+++ b/doc/ci/review_apps/img/enable_review_app_v16.png
Binary files differ
diff --git a/doc/development/cloud_connector/img/code_suggestions_components.png b/doc/development/cloud_connector/img/code_suggestions_components.png
index 3f41d1d1a6b..40fe1dd3ed3 100644
--- a/doc/development/cloud_connector/img/code_suggestions_components.png
+++ b/doc/development/cloud_connector/img/code_suggestions_components.png
Binary files differ
diff --git a/doc/development/database/adding_database_indexes.md b/doc/development/database/adding_database_indexes.md
index 4c2dacd29ff..d41800d2df7 100644
--- a/doc/development/database/adding_database_indexes.md
+++ b/doc/development/database/adding_database_indexes.md
@@ -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`:
diff --git a/doc/tutorials/left_sidebar/img/admin_area_v16_4.png b/doc/tutorials/left_sidebar/img/admin_area_v16_4.png
index ca6a229f69c..d7757319506 100644
--- a/doc/tutorials/left_sidebar/img/admin_area_v16_4.png
+++ b/doc/tutorials/left_sidebar/img/admin_area_v16_4.png
Binary files differ
diff --git a/doc/user/img/enable_AI_ML_features.png b/doc/user/img/enable_AI_ML_features.png
new file mode 100644
index 00000000000..97d06c877e4
--- /dev/null
+++ b/doc/user/img/enable_AI_ML_features.png
Binary files differ
diff --git a/doc/user/img/forecast_deployment_frequency.png b/doc/user/img/forecast_deployment_frequency.png
index 4c8c6f47a08..7df7f46db3b 100644
--- a/doc/user/img/forecast_deployment_frequency.png
+++ b/doc/user/img/forecast_deployment_frequency.png
Binary files differ
diff --git a/lib/sidebars/projects/menus/deployments_menu.rb b/lib/sidebars/projects/menus/deployments_menu.rb
index e2ebb347077..e4e2e55333e 100644
--- a/lib/sidebars/projects/menus/deployments_menu.rb
+++ b/lib/sidebars/projects/menus/deployments_menu.rb
@@ -101,3 +101,5 @@ module Sidebars
end
end
end
+
+Sidebars::Projects::Menus::DeploymentsMenu.prepend_mod
diff --git a/lib/tasks/gitlab/cleanup.rake b/lib/tasks/gitlab/cleanup.rake
index 1753483b091..ef9d2b5e13a 100644
--- a/lib/tasks/gitlab/cleanup.rake
+++ b/lib/tasks/gitlab/cleanup.rake
@@ -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
diff --git a/qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb b/qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb
index 4098a35545d..416162c806c 100644
--- a/qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb
@@ -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("/") }
diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb
index 293960efe61..c622b95d84e 100644
--- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb
+++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb
@@ -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], {
diff --git a/spec/features/alert_management/alert_details_spec.rb b/spec/features/alert_management/alert_details_spec.rb
index b377d3a092b..66b7a9ca46c 100644
--- a/spec/features/alert_management/alert_details_spec.rb
+++ b/spec/features/alert_management/alert_details_spec.rb
@@ -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
diff --git a/spec/features/alert_management/user_updates_alert_status_spec.rb b/spec/features/alert_management/user_updates_alert_status_spec.rb
index 98fd7449c4f..563b5072782 100644
--- a/spec/features/alert_management/user_updates_alert_status_spec.rb
+++ b/spec/features/alert_management/user_updates_alert_status_spec.rb
@@ -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')
diff --git a/spec/features/merge_request/user_sees_merge_widget_spec.rb b/spec/features/merge_request/user_sees_merge_widget_spec.rb
index 73cd0d699c9..96cad397441 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -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
diff --git a/spec/frontend/fixtures/autocomplete.rb b/spec/frontend/fixtures/autocomplete.rb
index 6215fa44e27..0ceacc41cdb 100644
--- a/spec/frontend/fixtures/autocomplete.rb
+++ b/spec/frontend/fixtures/autocomplete.rb
@@ -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
diff --git a/spec/frontend/fixtures/autocomplete_sources.rb b/spec/frontend/fixtures/autocomplete_sources.rb
index 74bf58cc106..2c28440ab0c 100644
--- a/spec/frontend/fixtures/autocomplete_sources.rb
+++ b/spec/frontend/fixtures/autocomplete_sources.rb
@@ -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
diff --git a/spec/frontend/fixtures/environments.rb b/spec/frontend/fixtures/environments.rb
index 81f1eb11e3e..8cf0977c5ed 100644
--- a/spec/frontend/fixtures/environments.rb
+++ b/spec/frontend/fixtures/environments.rb
@@ -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
diff --git a/spec/frontend/fixtures/issues.rb b/spec/frontend/fixtures/issues.rb
index 9e6fcea2d17..90aa0544526 100644
--- a/spec/frontend/fixtures/issues.rb
+++ b/spec/frontend/fixtures/issues.rb
@@ -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))
diff --git a/spec/frontend/fixtures/releases.rb b/spec/frontend/fixtures/releases.rb
index c7e3d8fe804..32ebe174800 100644
--- a/spec/frontend/fixtures/releases.rb
+++ b/spec/frontend/fixtures/releases.rb
@@ -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
diff --git a/spec/frontend/fixtures/search.rb b/spec/frontend/fixtures/search.rb
index b2da383d657..0036fb353a5 100644
--- a/spec/frontend/fixtures/search.rb
+++ b/spec/frontend/fixtures/search.rb
@@ -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
diff --git a/spec/frontend/vue_shared/alert_details/alert_status_spec.js b/spec/frontend/vue_shared/alert_details/alert_status_spec.js
index 90d29f0bfd4..478df81a966 100644
--- a/spec/frontend/vue_shared/alert_details/alert_status_spec.js
+++ b/spec/frontend/vue_shared/alert_details/alert_status_spec.js
@@ -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;
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index 630b5dec62e..3b4c2ec7cd6 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -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
diff --git a/spec/services/merge_requests/mergeability/check_not_preparing_service_spec.rb b/spec/services/merge_requests/mergeability/check_not_preparing_service_spec.rb
deleted file mode 100644
index 04db96e95ea..00000000000
--- a/spec/services/merge_requests/mergeability/check_not_preparing_service_spec.rb
+++ /dev/null
@@ -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
diff --git a/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb b/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb
index 632881dc361..66bcb948cb6 100644
--- a/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb
+++ b/spec/services/merge_requests/mergeability/detailed_merge_status_service_spec.rb
@@ -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
diff --git a/spec/support/helpers/features/dom_helpers.rb b/spec/support/helpers/features/dom_helpers.rb
index 258a8c1ada9..cbbb80dde36 100644
--- a/spec/support/helpers/features/dom_helpers.rb
+++ b/spec/support/helpers/features/dom_helpers.rb
@@ -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
diff --git a/spec/tasks/gitlab/cleanup_rake_spec.rb b/spec/tasks/gitlab/cleanup_rake_spec.rb
index bd4d9643433..1d111d266e3 100644
--- a/spec/tasks/gitlab/cleanup_rake_spec.rb
+++ b/spec/tasks/gitlab/cleanup_rake_spec.rb
@@ -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') }
diff --git a/workhorse/go.mod b/workhorse/go.mod
index c0089a30f17..a617536d0b7 100644
--- a/workhorse/go.mod
+++ b/workhorse/go.mod
@@ -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
)
diff --git a/workhorse/go.sum b/workhorse/go.sum
index be09bb8698f..2308be5d738 100644
--- a/workhorse/go.sum
+++ b/workhorse/go.sum
@@ -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=