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:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-09-15 15:10:16 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-09-15 15:10:16 +0300
commitc70fec25f88e1f1866c6b3d91de8587bdad59391 (patch)
tree0e869771cd4702cfe9711fca921e7b3a124c91dc
parent340f85512a4b4fa1ffd558ecaf64fef2eec8cc87 (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--.gitlab-ci.yml4
-rw-r--r--.gitlab/ci/rails/shared.gitlab-ci.yml3
-rw-r--r--.gitlab/ci/test-on-gdk/main.gitlab-ci.yml1
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--Gemfile2
-rw-r--r--Gemfile.checksum2
-rw-r--r--Gemfile.lock4
-rw-r--r--app/assets/javascripts/boards/components/board_card_inner.vue7
-rw-r--r--app/assets/javascripts/boards/components/board_content_sidebar.vue8
-rw-r--r--app/assets/javascripts/boards/components/board_list.vue14
-rw-r--r--app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue5
-rw-r--r--app/assets/javascripts/boards/index.js1
-rw-r--r--app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue28
-rw-r--r--app/assets/javascripts/ci/runner/components/cells/runner_owner_cell.vue7
-rw-r--r--app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue16
-rw-r--r--app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue2
-rw-r--r--app/assets/javascripts/ci/runner/constants.js3
-rw-r--r--app/assets/javascripts/ci/runner/group_runners/group_runners_app.vue35
-rw-r--r--app/assets/javascripts/lib/utils/array_utility.js15
-rw-r--r--app/assets/javascripts/lib/utils/secret_detection.js4
-rw-r--r--app/assets/javascripts/projects/settings/components/access_dropdown.vue10
-rw-r--r--app/assets/javascripts/silent_mode_settings/components/app.vue10
-rw-r--r--app/assets/javascripts/snippets/components/embed_dropdown.vue39
-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/nav_item.vue4
-rw-r--r--app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue2
-rw-r--r--app/assets/javascripts/super_sidebar/components/user_bar.vue12
-rw-r--r--app/controllers/projects/mirrors_controller.rb1
-rw-r--r--app/finders/groups/accepting_group_transfers_finder.rb12
-rw-r--r--app/models/concerns/restricted_signup.rb2
-rw-r--r--app/models/pages_deployment.rb9
-rw-r--r--app/services/projects/update_pages_service.rb8
-rw-r--r--app/views/admin/application_settings/_snowplow.html.haml2
-rw-r--r--app/views/admin/application_settings/_usage.html.haml2
-rw-r--r--app/views/admin/dev_ops_report/_score.html.haml2
-rw-r--r--app/views/groups/settings/_permissions.html.haml2
-rw-r--r--app/views/projects/blob/viewers/_metrics_dashboard_yml.html.haml2
-rw-r--r--app/views/projects/blob/viewers/_metrics_dashboard_yml_loading.html.haml2
-rw-r--r--app/views/projects/mirrors/_authentication_method.html.haml7
-rw-r--r--app/views/projects/mirrors/_instructions.html.haml2
-rw-r--r--app/views/shared/integrations/prometheus/_custom_metrics.html.haml1
-rw-r--r--app/views/shared/integrations/prometheus/_metrics.html.haml4
-rw-r--r--config/feature_flags/development/combined_analytics_visualization_editor.yml (renamed from config/feature_flags/development/exact_matches_first_group_transfer.yml)8
-rw-r--r--config/initializers/doorkeeper.rb4
-rw-r--r--db/migrate/20230913171402_add_deleted_at_to_pages_deployments.rb7
-rw-r--r--db/migrate/20230913171403_add_pages_deployments_deleted_at_index.rb19
-rw-r--r--db/post_migrate/20230914054914_index_finding_id_for_vulnerabilities_sync.rb15
-rw-r--r--db/schema_migrations/202309131714021
-rw-r--r--db/schema_migrations/202309131714031
-rw-r--r--db/schema_migrations/202309140549141
-rw-r--r--db/structure.sql5
-rw-r--r--doc/administration/monitoring/gitlab_self_monitoring_project/index.md12
-rw-r--r--doc/api/graphql/reference/index.md6
-rw-r--r--doc/api/index.md2
-rw-r--r--doc/api/managed_licenses.md17
-rw-r--r--doc/api/rest/deprecations.md5
-rw-r--r--doc/ci/pipelines/pipeline_artifacts.md14
-rw-r--r--doc/ci/runners/saas/macos/codesigning.md11
-rw-r--r--doc/ci/runners/saas/macos/environment.md11
-rw-r--r--doc/ci/yaml/index.md9
-rw-r--r--doc/development/database/foreign_keys.md2
-rw-r--r--doc/development/experiment_guide/implementing_experiments.md2
-rw-r--r--doc/development/feature_development.md4
-rw-r--r--doc/development/service_ping/implement.md11
-rw-r--r--doc/development/service_ping/index.md11
-rw-r--r--doc/development/service_ping/metrics_dictionary.md11
-rw-r--r--doc/development/service_ping/metrics_instrumentation.md11
-rw-r--r--doc/development/service_ping/metrics_lifecycle.md11
-rw-r--r--doc/development/service_ping/performance_indicator_metrics.md11
-rw-r--r--doc/development/service_ping/review_guidelines.md11
-rw-r--r--doc/development/service_ping/troubleshooting.md11
-rw-r--r--doc/development/service_ping/usage_data.md11
-rw-r--r--doc/development/snowplow/event_dictionary_guide.md11
-rw-r--r--doc/development/snowplow/implementation.md11
-rw-r--r--doc/development/snowplow/index.md11
-rw-r--r--doc/development/snowplow/infrastructure.md11
-rw-r--r--doc/development/snowplow/review_guidelines.md11
-rw-r--r--doc/development/snowplow/schemas.md11
-rw-r--r--doc/development/snowplow/troubleshooting.md11
-rw-r--r--doc/editor_extensions/jetbrains_ide/index.md2
-rw-r--r--doc/editor_extensions/neovim/index.md2
-rw-r--r--doc/editor_extensions/visual_studio/index.md2
-rw-r--r--doc/editor_extensions/visual_studio_code/index.md4
-rw-r--r--doc/install/cloud_native/index.md11
-rw-r--r--doc/integration/cas.md13
-rw-r--r--doc/operations/metrics/alerts.md12
-rw-r--r--doc/operations/metrics/dashboards/default.md12
-rw-r--r--doc/operations/metrics/dashboards/develop.md12
-rw-r--r--doc/operations/metrics/dashboards/index.md12
-rw-r--r--doc/operations/metrics/dashboards/panel_types.md12
-rw-r--r--doc/operations/metrics/dashboards/settings.md12
-rw-r--r--doc/operations/metrics/dashboards/templating_variables.md12
-rw-r--r--doc/operations/metrics/dashboards/variables.md12
-rw-r--r--doc/operations/metrics/dashboards/yaml.md12
-rw-r--r--doc/operations/metrics/dashboards/yaml_number_format.md12
-rw-r--r--doc/operations/metrics/embed.md12
-rw-r--r--doc/operations/metrics/embed_grafana.md12
-rw-r--r--doc/operations/metrics/index.md12
-rw-r--r--doc/policy/alpha-beta-support.md11
-rw-r--r--doc/raketasks/cleanup.md2
-rw-r--r--doc/raketasks/generate_sample_prometheus_data.md12
-rw-r--r--doc/raketasks/import.md12
-rw-r--r--doc/security/hardening_application_recommendations.md2
-rw-r--r--doc/subscriptions/gitlab_com/index.md3
-rw-r--r--doc/topics/authentication/index.md1
-rw-r--r--doc/user/ai_features.md2
-rw-r--r--doc/user/clusters/cost_management.md12
-rw-r--r--doc/user/clusters/integrations.md12
-rw-r--r--doc/user/clusters/management_project_template.md1
-rw-r--r--doc/user/compliance/license_compliance/index.md14
-rw-r--r--doc/user/group/manage.md2
-rw-r--r--doc/user/infrastructure/clusters/index.md3
-rw-r--r--doc/user/infrastructure/clusters/manage/clusters_health.md12
-rw-r--r--doc/user/markdown.md5
-rw-r--r--doc/user/permissions.md3
-rw-r--r--doc/user/profile/service_accounts.md15
-rw-r--r--doc/user/project/import/phabricator.md12
-rw-r--r--doc/user/project/integrations/prometheus.md12
-rw-r--r--doc/user/project/integrations/prometheus_library/cloudwatch.md12
-rw-r--r--doc/user/project/integrations/prometheus_library/haproxy.md12
-rw-r--r--doc/user/project/integrations/prometheus_library/index.md12
-rw-r--r--doc/user/project/integrations/prometheus_library/kubernetes.md12
-rw-r--r--doc/user/project/integrations/prometheus_library/nginx.md12
-rw-r--r--doc/user/project/integrations/prometheus_library/nginx_ingress.md12
-rw-r--r--doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md12
-rw-r--r--doc/user/project/repository/code_suggestions.md11
-rw-r--r--doc/user/project/web_ide_beta/index.md11
-rw-r--r--doc/user/storage_management_automation.md2
-rw-r--r--lib/gitlab/doorkeeper_secret_storing/token/unique_application_token.rb18
-rw-r--r--locale/gitlab.pot102
-rw-r--r--qa/qa/page/project/pipeline/index.rb6
-rw-r--r--spec/controllers/oauth/applications_controller_spec.rb15
-rw-r--r--spec/db/schema_spec.rb3
-rw-r--r--spec/finders/groups/accepting_group_transfers_finder_spec.rb12
-rw-r--r--spec/frontend/boards/board_card_inner_spec.js1
-rw-r--r--spec/frontend/boards/components/board_card_spec.js1
-rw-r--r--spec/frontend/boards/components/sidebar/board_sidebar_title_spec.js8
-rw-r--r--spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js10
-rw-r--r--spec/frontend/lib/utils/array_utility_spec.js36
-rw-r--r--spec/frontend/lib/utils/secret_detection_spec.js1
-rw-r--r--spec/frontend/projects/settings/components/new_access_dropdown_spec.js10
-rw-r--r--spec/frontend/silent_mode_settings/components/app_spec.js13
-rw-r--r--spec/frontend/snippets/components/embed_dropdown_spec.js48
-rw-r--r--spec/graphql/types/project_type_spec.rb11
-rw-r--r--spec/models/concerns/transitionable_spec.rb28
-rw-r--r--spec/models/doorkeeper/application_spec.rb11
-rw-r--r--spec/models/oauth_access_token_spec.rb6
-rw-r--r--spec/models/pages_deployment_spec.rb51
-rw-r--r--spec/services/projects/update_pages_service_spec.rb27
150 files changed, 547 insertions, 951 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cd1a331b63f..c0aec99263f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -37,6 +37,9 @@ default:
CREATE_RAILS_TEST_FAILURE_ISSUES: "true"
CREATE_RAILS_SLOW_TEST_ISSUES: "true"
+.default-merge-request-slow-tests-variables: &default-merge-request-slow-tests-variables
+ ADD_SLOW_TEST_NOTE_TO_MERGE_REQUEST: "true"
+
.if-merge-request-security-canonical-sync: &if-merge-request-security-canonical-sync
if: '$CI_MERGE_REQUEST_SOURCE_PROJECT_PATH == "gitlab-org/security/gitlab" && $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == $CI_DEFAULT_BRANCH && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH'
@@ -81,6 +84,7 @@ workflow:
- if: '$CI_MERGE_REQUEST_IID'
variables:
<<: *default-ruby-variables
+ <<: *default-merge-request-slow-tests-variables
PIPELINE_NAME: 'Ruby $RUBY_VERSION $CI_MERGE_REQUEST_EVENT_TYPE MR pipeline'
NO_SOURCEMAPS: 'true'
# For the scheduled pipelines, we set specific variables.
diff --git a/.gitlab/ci/rails/shared.gitlab-ci.yml b/.gitlab/ci/rails/shared.gitlab-ci.yml
index ce89e7ef689..a7a8315ae14 100644
--- a/.gitlab/ci/rails/shared.gitlab-ci.yml
+++ b/.gitlab/ci/rails/shared.gitlab-ci.yml
@@ -88,6 +88,9 @@ include:
if [ "$CREATE_RAILS_SLOW_TEST_ISSUES" == "true" ]; then
bundle exec slow-test-issues --input-files "rspec/rspec-*.json" --project "gitlab-org/gitlab" --token "${TEST_FAILURES_PROJECT_TOKEN}";
fi
+ if [ "$ADD_SLOW_TEST_NOTE_TO_MERGE_REQUEST" == "true" ]; then
+ bundle exec slow-test-merge-request-report-note --input-files "rspec/rspec-*.json" --project "gitlab-org/gitlab" --merge_request_iid "$CI_MERGE_REQUEST_IID" --token "${TEST_FAILURES_PROJECT_TOKEN}";
+ fi
- echo -e "\e[0Ksection_end:`date +%s`:report_results_section\r\e[0K"
allow_failure:
diff --git a/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml b/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml
index 8e94338bb68..6aa8d195831 100644
--- a/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml
+++ b/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml
@@ -158,6 +158,7 @@ gdk-qa-reliable:
variables:
QA_SCENARIO: Test::Instance::Blocking
QA_RUN_TYPE: gdk-qa-blocking
+ parallel: 10
rules:
- when: always
allow_failure: true
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 72b390c87e2..c4ed752e07b 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-f521e116b2fb4731145b732e8a372f9db99ef986
+16cd7e7fa2bb9afdd7061ae6187f739dc2fe120f
diff --git a/Gemfile b/Gemfile
index ad291165abd..d9ee8a8ae71 100644
--- a/Gemfile
+++ b/Gemfile
@@ -323,7 +323,7 @@ gem 'fast_blank', '~> 1.0.1'
gem 'gitlab-chronic', '~> 0.10.5'
gem 'gitlab_chronic_duration', '~> 0.11'
-gem 'rack-proxy', '~> 0.7.6'
+gem 'rack-proxy', '~> 0.7.7'
gem 'sassc-rails', '~> 2.1.0'
gem 'autoprefixer-rails', '10.2.5.1'
diff --git a/Gemfile.checksum b/Gemfile.checksum
index f74d49dd1b2..3efef6fcc9f 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -473,7 +473,7 @@
{"name":"rack-cors","version":"2.0.1","platform":"ruby","checksum":"bcc66bdf5c6a4af05d571c4d01d35ac4a873552ba4f86c05fbe39365c39b9b0a"},
{"name":"rack-oauth2","version":"1.21.3","platform":"ruby","checksum":"4e72a79dd6a866692e84422a552b27c38a5a1918ded06661e04910f2bbe676ba"},
{"name":"rack-protection","version":"2.2.2","platform":"ruby","checksum":"fd41414dbabbec274af0bdb1f72a48504449de4d979782c9af38cbb5dfff3299"},
-{"name":"rack-proxy","version":"0.7.6","platform":"ruby","checksum":"8704c5009bb60eb16dacf4bcc5e067a8484e668321e8443534bb58ded320c2a8"},
+{"name":"rack-proxy","version":"0.7.7","platform":"ruby","checksum":"446a4b57001022145d5c3ba73b775f66a2260eaf7420c6907483141900395c8a"},
{"name":"rack-test","version":"2.1.0","platform":"ruby","checksum":"0c61fc61904049d691922ea4bb99e28004ed3f43aa5cfd495024cc345f125dfb"},
{"name":"rack-timeout","version":"0.6.3","platform":"ruby","checksum":"1754892eacc124d405e7f1145731ec9b7421ebd1bee5d51ddc18b72c204d0ab3"},
{"name":"rails","version":"7.0.6","platform":"ruby","checksum":"5dfbd481a23556ad425fc8541399a129a08ed550f877294b44d0170ca5b9f421"},
diff --git a/Gemfile.lock b/Gemfile.lock
index d35185f0e9d..2a8f80bf393 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1245,7 +1245,7 @@ GEM
rack (>= 2.1.0)
rack-protection (2.2.2)
rack
- rack-proxy (0.7.6)
+ rack-proxy (0.7.7)
rack
rack-test (2.1.0)
rack (>= 1.3)
@@ -1955,7 +1955,7 @@ DEPENDENCIES
rack-attack (~> 6.7.0)
rack-cors (~> 2.0.1)
rack-oauth2 (~> 1.21.3)
- rack-proxy (~> 0.7.6)
+ rack-proxy (~> 0.7.7)
rack-timeout (~> 0.6.3)
rails (~> 7.0.6)
rails-controller-testing
diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue
index 2b38f5735d4..c441a718dd8 100644
--- a/app/assets/javascripts/boards/components/board_card_inner.vue
+++ b/app/assets/javascripts/boards/components/board_card_inner.vue
@@ -20,6 +20,7 @@ import WorkItemTypeIcon from '~/work_items/components/work_item_type_icon.vue';
import IssuableBlockedIcon from '~/vue_shared/components/issuable_blocked_icon/issuable_blocked_icon.vue';
import { ListType } from '../constants';
import eventHub from '../eventhub';
+import { setError } from '../graphql/cache_updates';
import IssueDueDate from './issue_due_date.vue';
import IssueTimeEstimate from './issue_time_estimate.vue';
@@ -45,6 +46,7 @@ export default {
},
mixins: [boardCardInner],
inject: [
+ 'allowSubEpics',
'rootPath',
'scopedLabelsAvailable',
'isEpicBoard',
@@ -85,7 +87,7 @@ export default {
};
},
computed: {
- ...mapState(['isShowingLabels', 'allowSubEpics']),
+ ...mapState(['isShowingLabels']),
isLoading() {
return this.item.isLoading || this.item.iid === '-1';
},
@@ -175,7 +177,8 @@ export default {
},
},
methods: {
- ...mapActions(['performSearch', 'setError']),
+ ...mapActions(['performSearch']),
+ setError,
isIndexLessThanlimit(index) {
return index < this.limitBeforeCounter;
},
diff --git a/app/assets/javascripts/boards/components/board_content_sidebar.vue b/app/assets/javascripts/boards/components/board_content_sidebar.vue
index 5e1e46dd198..bb740c0e7eb 100644
--- a/app/assets/javascripts/boards/components/board_content_sidebar.vue
+++ b/app/assets/javascripts/boards/components/board_content_sidebar.vue
@@ -222,7 +222,7 @@ export default {
<template #default>
<board-sidebar-title :active-item="activeBoardIssuable" data-testid="sidebar-title" />
<sidebar-assignees-widget
- v-if="activeBoardItem.assignees"
+ v-if="activeBoardIssuable.assignees"
:iid="activeBoardIssuable.iid"
:full-path="projectPathForActiveIssue"
:initial-assignees="activeBoardIssuable.assignees"
@@ -232,7 +232,7 @@ export default {
/>
<sidebar-dropdown-widget
v-if="epicFeatureAvailable && !isIncidentSidebar"
- :key="`epic-${activeBoardItem.iid}`"
+ :key="`epic-${activeBoardIssuable.iid}`"
:iid="activeBoardIssuable.iid"
issuable-attribute="epic"
:workspace-path="projectPathForActiveIssue"
@@ -242,7 +242,7 @@ export default {
/>
<div>
<sidebar-dropdown-widget
- :key="`milestone-${activeBoardItem.iid}`"
+ :key="`milestone-${activeBoardIssuable.iid}`"
:iid="activeBoardIssuable.iid"
issuable-attribute="milestone"
:workspace-path="projectPathForActiveIssue"
@@ -252,7 +252,7 @@ export default {
/>
<sidebar-iteration-widget
v-if="iterationFeatureAvailable && !isIncidentSidebar"
- :key="`iteration-${activeBoardItem.iid}`"
+ :key="`iteration-${activeBoardIssuable.iid}`"
:iid="activeBoardIssuable.iid"
:workspace-path="projectPathForActiveIssue"
:attr-workspace-path="groupPathForActiveIssue"
diff --git a/app/assets/javascripts/boards/components/board_list.vue b/app/assets/javascripts/boards/components/board_list.vue
index 67bfcfb9d97..1bb7e88122a 100644
--- a/app/assets/javascripts/boards/components/board_list.vue
+++ b/app/assets/javascripts/boards/components/board_list.vue
@@ -88,6 +88,7 @@ export default {
toListId: null,
toList: {},
addItemToListInProgress: false,
+ updateIssueOrderInProgress: false,
};
},
apollo: {
@@ -253,7 +254,9 @@ export default {
return this.canMoveIssue ? options : {};
},
disableScrollingWhenMutationInProgress() {
- return this.hasNextPage && this.isUpdateIssueOrderInProgress;
+ return (
+ this.hasNextPage && (this.isUpdateIssueOrderInProgress || this.updateIssueOrderInProgress)
+ );
},
showMoveToPosition() {
return !this.disabled && this.list.listType !== ListType.closed;
@@ -343,7 +346,7 @@ export default {
sortableStart();
this.track('drag_card', { label: 'board' });
},
- handleDragOnEnd({
+ async handleDragOnEnd({
newIndex: originalNewIndex,
oldIndex,
from,
@@ -394,7 +397,8 @@ export default {
}
if (this.isApolloBoard) {
- this.moveBoardItem(
+ this.updateIssueOrderInProgress = true;
+ await this.moveBoardItem(
{
epicId: itemId,
iid: itemIid,
@@ -404,7 +408,9 @@ export default {
moveAfterId,
},
newIndex,
- );
+ ).finally(() => {
+ this.updateIssueOrderInProgress = false;
+ });
} else {
this.moveItem({
itemId,
diff --git a/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue b/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue
index 1c2c0022ddf..a2c4b42b6c5 100644
--- a/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue
+++ b/app/assets/javascripts/boards/components/sidebar/board_sidebar_title.vue
@@ -7,6 +7,7 @@ import { joinPaths } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import autofocusonshow from '~/vue_shared/directives/autofocusonshow';
import { titleQueries } from 'ee_else_ce/boards/constants';
+import { setError } from '../../graphql/cache_updates';
export default {
components: {
@@ -65,7 +66,7 @@ export default {
},
},
methods: {
- ...mapActions(['setActiveItemTitle', 'setError']),
+ ...mapActions(['setActiveItemTitle']),
getPendingChangesKey(item) {
if (!item) {
return '';
@@ -130,7 +131,7 @@ export default {
this.showChangesAlert = false;
} catch (e) {
this.title = this.item.title;
- this.setError({ error: e, message: this.$options.i18n.updateTitleError });
+ setError({ error: e, message: this.$options.i18n.updateTitleError });
} finally {
this.loading = false;
}
diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js
index a03ec9193ea..9d7b7a38c6d 100644
--- a/app/assets/javascripts/boards/index.js
+++ b/app/assets/javascripts/boards/index.js
@@ -102,6 +102,7 @@ function mountBoardApp(el) {
swimlanesFeatureAvailable: gon.licensed_features?.swimlanes,
multipleIssueBoardsAvailable: parseBoolean(el.dataset.multipleBoardsAvailable),
scopedIssueBoardFeatureEnabled: parseBoolean(el.dataset.scopedIssueBoardFeatureEnabled),
+ allowSubEpics: false,
},
render: (createComponent) => createComponent(BoardApp),
});
diff --git a/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue b/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue
index e6813211fe9..0ec94dc865f 100644
--- a/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue
+++ b/app/assets/javascripts/ci/runner/admin_runners/admin_runners_app.vue
@@ -178,6 +178,22 @@ export default {
</script>
<template>
<div>
+ <header class="gl-my-5 gl-display-flex gl-justify-content-space-between">
+ <h2 class="gl-my-0 header-title">
+ {{ s__('Runners|Runners') }}
+ </h2>
+ <div class="gl-display-flex gl-gap-3">
+ <runner-dashboard-link />
+ <gl-button :href="newRunnerPath" variant="confirm">
+ {{ s__('Runners|New instance runner') }}
+ </gl-button>
+ <registration-dropdown
+ :registration-token="registrationToken"
+ :type="$options.INSTANCE_TYPE"
+ placement="right"
+ />
+ </div>
+ </header>
<div
class="gl-display-flex gl-align-items-center gl-flex-direction-column-reverse gl-md-flex-direction-row gl-mt-3 gl-md-mt-0"
>
@@ -189,18 +205,6 @@ export default {
content-class="gl-display-none"
nav-class="gl-border-none!"
/>
-
- <div class="gl-w-full gl-md-w-auto gl-display-flex gl-gap-3">
- <runner-dashboard-link />
- <gl-button :href="newRunnerPath" variant="confirm">
- {{ s__('Runners|New instance runner') }}
- </gl-button>
- <registration-dropdown
- :registration-token="registrationToken"
- :type="$options.INSTANCE_TYPE"
- placement="right"
- />
- </div>
</div>
<runner-filtered-search-bar
diff --git a/app/assets/javascripts/ci/runner/components/cells/runner_owner_cell.vue b/app/assets/javascripts/ci/runner/components/cells/runner_owner_cell.vue
index cb43760b2d6..8f1c7234b84 100644
--- a/app/assets/javascripts/ci/runner/components/cells/runner_owner_cell.vue
+++ b/app/assets/javascripts/ci/runner/components/cells/runner_owner_cell.vue
@@ -50,12 +50,7 @@ export default {
<template>
<div>
- <gl-link
- v-if="cell.href"
- v-gl-tooltip="cell.tooltip"
- :href="cell.href"
- class="gl-text-body gl-text-decoration-underline"
- >
+ <gl-link v-if="cell.href" v-gl-tooltip="cell.tooltip" :href="cell.href" class="gl-text-body">
{{ cell.text }}
</gl-link>
<span v-else>{{ cell.text }}</span>
diff --git a/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue b/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue
index cc31afea88c..a80d6207be8 100644
--- a/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue
+++ b/app/assets/javascripts/ci/runner/components/cells/runner_summary_cell.vue
@@ -12,7 +12,6 @@ import RunnerManagersBadge from '../runner_managers_badge.vue';
import { formatJobCount } from '../../utils';
import {
- I18N_NO_DESCRIPTION,
I18N_LOCKED_RUNNER_DESCRIPTION,
I18N_VERSION_LABEL,
I18N_LAST_CONTACT_LABEL,
@@ -73,7 +72,6 @@ export default {
formatNumber,
},
i18n: {
- I18N_NO_DESCRIPTION,
I18N_LOCKED_RUNNER_DESCRIPTION,
I18N_VERSION_LABEL,
I18N_LAST_CONTACT_LABEL,
@@ -100,7 +98,10 @@ export default {
<runner-type-badge :type="runner.runnerType" size="sm" class="gl-vertical-align-middle" />
</div>
- <div class="gl-mb-3 gl-ml-auto gl-display-inline-flex gl-max-w-full">
+ <div
+ v-if="runner.version || runner.description"
+ class="gl-mb-3 gl-ml-auto gl-display-inline-flex gl-max-w-full gl-font-sm gl-align-items-center"
+ >
<template v-if="runner.version">
<div class="gl-flex-shrink-0">
<runner-upgrade-status-icon :upgrade-status="runner.upgradeStatus" />
@@ -108,19 +109,20 @@ export default {
<template #version>{{ runner.version }}</template>
</gl-sprintf>
</div>
- <div class="gl-text-secondary gl-mx-2" aria-hidden="true">·</div>
+ <div v-if="runner.description" class="gl-text-secondary gl-mx-2" aria-hidden="true">·</div>
</template>
<tooltip-on-truncate
+ v-if="runner.description"
class="gl-text-truncate gl-display-block"
:class="{ 'gl-text-secondary': !runner.description }"
:title="runner.description"
>
- {{ runner.description || $options.i18n.I18N_NO_DESCRIPTION }}
+ {{ runner.description }}
</tooltip-on-truncate>
</div>
- <div>
- <runner-summary-field icon="clock">
+ <div class="gl-font-sm">
+ <runner-summary-field icon="clock" icon-size="sm">
<gl-sprintf :message="$options.i18n.I18N_LAST_CONTACT_LABEL">
<template #timeAgo>
<time-ago v-if="runner.contactedAt" :time="runner.contactedAt" />
diff --git a/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue b/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue
index 742259ee491..b1b61e03eec 100644
--- a/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue
+++ b/app/assets/javascripts/ci/runner/components/cells/runner_summary_field.vue
@@ -25,7 +25,7 @@ export default {
<template>
<div v-gl-tooltip="tooltip" class="gl-display-inline-block gl-text-secondary gl-mb-3 gl-mr-4">
- <gl-icon v-if="icon" :name="icon" />
+ <gl-icon v-if="icon" :name="icon" :size="12" />
<!-- display tooltip as a label for screen readers -->
<span class="gl-sr-only">{{ tooltip }}</span>
<slot></slot>
diff --git a/app/assets/javascripts/ci/runner/constants.js b/app/assets/javascripts/ci/runner/constants.js
index 203f97876de..3293c68ddb8 100644
--- a/app/assets/javascripts/ci/runner/constants.js
+++ b/app/assets/javascripts/ci/runner/constants.js
@@ -15,7 +15,7 @@ export const I18N_CREATE_ERROR = s__(
);
export const FILTER_CSS_CLASSES =
- 'gl-bg-gray-10 gl-p-5 gl-border-solid gl-border-gray-100 gl-border-0 gl-border-t-1 gl-border-b-1';
+ 'gl-bg-gray-10 gl-p-5 gl-border-solid gl-border-gray-100 gl-border-0 gl-border-t-1';
// Type
@@ -96,7 +96,6 @@ export const I18N_DELETE_RUNNER = s__('Runners|Delete runner');
export const I18N_DELETED_TOAST = s__('Runners|Runner %{name} was deleted');
// List
-export const I18N_NO_DESCRIPTION = s__('Runners|No description');
export const I18N_LOCKED_RUNNER_DESCRIPTION = s__(
'Runners|Runner is locked and available for currently assigned projects only. Only administrators can change the assigned projects.',
);
diff --git a/app/assets/javascripts/ci/runner/group_runners/group_runners_app.vue b/app/assets/javascripts/ci/runner/group_runners/group_runners_app.vue
index ad441e4ad86..dcaf8635f5c 100644
--- a/app/assets/javascripts/ci/runner/group_runners/group_runners_app.vue
+++ b/app/assets/javascripts/ci/runner/group_runners/group_runners_app.vue
@@ -212,21 +212,11 @@ export default {
<template>
<div>
- <div
- class="gl-display-flex gl-align-items-center gl-flex-direction-column-reverse gl-md-flex-direction-row gl-mt-3 gl-md-mt-0"
- >
- <runner-type-tabs
- ref="runner-type-tabs"
- v-model="search"
- :count-scope="$options.GROUP_TYPE"
- :count-variables="countVariables"
- :runner-types="$options.TABS_RUNNER_TYPES"
- class="gl-w-full"
- content-class="gl-display-none"
- nav-class="gl-border-none!"
- />
-
- <div class="gl-w-full gl-md-w-auto gl-display-flex">
+ <header class="gl-my-5 gl-display-flex gl-justify-content-space-between">
+ <h2 class="gl-my-0 header-title">
+ {{ s__('Runners|Runners') }}
+ </h2>
+ <div class="gl-display-flex gl-gap-3">
<gl-button
v-if="newRunnerPath"
:href="newRunnerPath"
@@ -237,12 +227,25 @@ export default {
</gl-button>
<registration-dropdown
v-if="registrationToken"
- class="gl-ml-3"
:registration-token="registrationToken"
:type="$options.GROUP_TYPE"
placement="right"
/>
</div>
+ </header>
+ <div
+ class="gl-display-flex gl-align-items-center gl-flex-direction-column-reverse gl-md-flex-direction-row gl-mt-3 gl-md-mt-0"
+ >
+ <runner-type-tabs
+ ref="runner-type-tabs"
+ v-model="search"
+ :count-scope="$options.GROUP_TYPE"
+ :count-variables="countVariables"
+ :runner-types="$options.TABS_RUNNER_TYPES"
+ class="gl-w-full"
+ content-class="gl-display-none"
+ nav-class="gl-border-none!"
+ />
</div>
<div
class="gl-display-flex gl-flex-direction-column gl-md-flex-direction-row gl-gap-3"
diff --git a/app/assets/javascripts/lib/utils/array_utility.js b/app/assets/javascripts/lib/utils/array_utility.js
index 04f9cb1cdb5..9eddae860c2 100644
--- a/app/assets/javascripts/lib/utils/array_utility.js
+++ b/app/assets/javascripts/lib/utils/array_utility.js
@@ -28,3 +28,18 @@ export const swapArrayItems = (array, leftIndex = 0, rightIndex = 0) => {
export const getDuplicateItemsFromArray = (array) => [
...new Set(array.filter((value, index) => array.indexOf(value) !== index)),
];
+
+/**
+ * Toggles the presence of an item in a given array.
+ * Use pass by reference when toggling non-primivive types.
+ *
+ * @param {Array} array - The array to use
+ * @param {Any} item - The array item to toggle
+ * @returns {Array} new array with toggled item
+ */
+export const toggleArrayItem = (array, value) => {
+ if (array.includes(value)) {
+ return array.filter((item) => item !== value);
+ }
+ return [...array, value];
+};
diff --git a/app/assets/javascripts/lib/utils/secret_detection.js b/app/assets/javascripts/lib/utils/secret_detection.js
index 8e673855631..49de7b3a081 100644
--- a/app/assets/javascripts/lib/utils/secret_detection.js
+++ b/app/assets/javascripts/lib/utils/secret_detection.js
@@ -24,6 +24,10 @@ export const containsSensitiveToken = (message) => {
name: 'Feed Token',
regex: 'feed_token=((glft-)?[0-9a-zA-Z_-]{20}|glft-[a-h0-9]+-[0-9]+_)',
},
+ {
+ name: 'GitLab OAuth Application Secret',
+ regex: `gloas-[0-9a-zA-Z_-]{64}`,
+ },
];
for (const rule of sensitiveDataPatterns) {
diff --git a/app/assets/javascripts/projects/settings/components/access_dropdown.vue b/app/assets/javascripts/projects/settings/components/access_dropdown.vue
index 780eb2decd0..ca24e948f69 100644
--- a/app/assets/javascripts/projects/settings/components/access_dropdown.vue
+++ b/app/assets/javascripts/projects/settings/components/access_dropdown.vue
@@ -19,6 +19,7 @@ export const i18n = {
rolesSectionHeader: s__('AccessDropdown|Roles'),
groupsSectionHeader: s__('AccessDropdown|Groups'),
usersSectionHeader: s__('AccessDropdown|Users'),
+ noRole: s__('AccessDropdown|No role'),
deployKeysSectionHeader: s__('AccessDropdown|Deploy Keys'),
ownedBy: __('Owned by %{image_tag}'),
};
@@ -121,6 +122,9 @@ export default {
this.deployKeys.length
);
},
+ isAccessesLevelNoneSelected() {
+ return this.selected.role[0].id === ACCESS_LEVEL_NONE;
+ },
toggleLabel() {
const counts = Object.entries(this.selected).reduce((acc, [key, value]) => {
acc[key] = value.length;
@@ -140,7 +144,11 @@ export default {
const labelPieces = [];
if (counts[LEVEL_TYPES.ROLE] > 0) {
- labelPieces.push(n__('1 role', '%d roles', counts[LEVEL_TYPES.ROLE]));
+ if (this.isAccessesLevelNoneSelected) {
+ labelPieces.push(this.$options.i18n.noRole);
+ } else {
+ labelPieces.push(n__('1 role', '%d roles', counts[LEVEL_TYPES.ROLE]));
+ }
}
if (counts[LEVEL_TYPES.USER] > 0) {
diff --git a/app/assets/javascripts/silent_mode_settings/components/app.vue b/app/assets/javascripts/silent_mode_settings/components/app.vue
index a151492c75c..2dd0449448c 100644
--- a/app/assets/javascripts/silent_mode_settings/components/app.vue
+++ b/app/assets/javascripts/silent_mode_settings/components/app.vue
@@ -1,5 +1,5 @@
<script>
-import { GlToggle } from '@gitlab/ui';
+import { GlToggle, GlBadge } from '@gitlab/ui';
import { updateApplicationSettings } from '~/rest_api';
import { createAlert } from '~/alert';
import toast from '~/vue_shared/plugins/global_toast';
@@ -13,9 +13,11 @@ export default {
saveError: s__('SilentMode|There was an error updating the Silent Mode Settings.'),
enabled: __('enabled'),
disabled: __('disabled'),
+ experiment: __('Experiment'),
},
components: {
GlToggle,
+ GlBadge,
},
props: {
isSilentModeEnabled: {
@@ -60,5 +62,9 @@ export default {
:label="$options.i18n.toggleLabel"
:is-loading="isLoading"
@change="updateSilentModeSettings"
- />
+ >
+ <template #label
+ >{{ $options.i18n.toggleLabel }} <gl-badge>{{ $options.i18n.experiment }}</gl-badge></template
+ >
+ </gl-toggle>
</template>
diff --git a/app/assets/javascripts/snippets/components/embed_dropdown.vue b/app/assets/javascripts/snippets/components/embed_dropdown.vue
index 0fdbc89a038..17312c2373b 100644
--- a/app/assets/javascripts/snippets/components/embed_dropdown.vue
+++ b/app/assets/javascripts/snippets/components/embed_dropdown.vue
@@ -1,12 +1,5 @@
<script>
-import {
- GlButton,
- GlDropdown,
- GlDropdownSectionHeader,
- GlDropdownText,
- GlFormInputGroup,
- GlTooltipDirective,
-} from '@gitlab/ui';
+import { GlButton, GlDisclosureDropdown, GlFormInputGroup, GlTooltipDirective } from '@gitlab/ui';
import { escape as esc } from 'lodash';
import { __ } from '~/locale';
@@ -17,9 +10,7 @@ const MSG_COPY = __('Copy');
export default {
components: {
GlButton,
- GlDropdown,
- GlDropdownSectionHeader,
- GlDropdownText,
+ GlDisclosureDropdown,
GlFormInputGroup,
},
directives: {
@@ -45,22 +36,16 @@ export default {
};
</script>
<template>
- <gl-dropdown
- right
- :text="$options.MSG_EMBED"
- menu-class="gl-px-1! gl-pb-5! gl-dropdown-menu-wide"
+ <gl-disclosure-dropdown
+ :auto-close="false"
+ fluid-width
+ placement="right"
+ :toggle-text="$options.MSG_EMBED"
>
<template v-for="{ name, value } in sections">
- <gl-dropdown-section-header :key="`header_${name}`" data-testid="header">{{
- name
- }}</gl-dropdown-section-header>
- <gl-dropdown-text
- :key="`input_${name}`"
- tag="div"
- class="gl-dropdown-text-py-0 gl-dropdown-text-block"
- data-testid="input"
- >
- <gl-form-input-group :value="value" readonly select-on-click :label="name">
+ <div :key="name" :data-testid="`section-${name}`" class="gl-px-4 gl-py-2">
+ <h5 class="gl-font-sm gl-mt-1 gl-mb-2" data-testid="header">{{ name }}</h5>
+ <gl-form-input-group class="gl-w-31" :value="value" readonly select-on-click :label="name">
<template #append>
<gl-button
v-gl-tooltip.hover
@@ -73,7 +58,7 @@ export default {
/>
</template>
</gl-form-input-group>
- </gl-dropdown-text>
+ </div>
</template>
- </gl-dropdown>
+ </gl-disclosure-dropdown>
</template>
diff --git a/app/assets/javascripts/super_sidebar/components/brand_logo.vue b/app/assets/javascripts/super_sidebar/components/brand_logo.vue
index b346d3d43e8..02cf36fb053 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.ds500="$options.i18n.homepage"
+ v-gl-tooltip:super-sidebar.hover.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 2347e74fdee..d1e96479631 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.ds500.bottom="dropdownOpen ? '' : $options.i18n.createNew"
+ v-gl-tooltip:super-sidebar.hover.bottom="dropdownOpen ? '' : $options.i18n.createNew"
category="tertiary"
icon="plus"
no-caret
diff --git a/app/assets/javascripts/super_sidebar/components/nav_item.vue b/app/assets/javascripts/super_sidebar/components/nav_item.vue
index 46735c2c70a..8320da30ba8 100644
--- a/app/assets/javascripts/super_sidebar/components/nav_item.vue
+++ b/app/assets/javascripts/super_sidebar/components/nav_item.vue
@@ -234,7 +234,7 @@ export default {
<template v-if="isPinnable">
<gl-button
v-if="isPinned"
- v-gl-tooltip.noninteractive.ds500.right.viewport="$options.i18n.unpinItem"
+ v-gl-tooltip.noninteractive.right.viewport="$options.i18n.unpinItem"
:aria-label="unpinAriaLabel"
category="tertiary"
class="show-on-focus-or-hover--target transition-opacity-on-hover--target always-animate gl-absolute gl-right-3 gl-top-2"
@@ -247,7 +247,7 @@ export default {
/>
<gl-button
v-else
- v-gl-tooltip.noninteractive.ds500.right.viewport="$options.i18n.pinItem"
+ v-gl-tooltip.noninteractive.right.viewport="$options.i18n.pinItem"
:aria-label="pinAriaLabel"
category="tertiary"
class="show-on-focus-or-hover--target transition-opacity-on-hover--target always-animate gl-absolute gl-right-3 gl-top-2"
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 3ad59000ad3..30ee18cc369 100644
--- a/app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue
+++ b/app/assets/javascripts/super_sidebar/components/super_sidebar_toggle.vue
@@ -73,7 +73,7 @@ export default {
<template>
<gl-button
- v-gl-tooltip.hover.ds500="tooltip"
+ v-gl-tooltip.hover="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 5d94e71c5ab..49aee4f3470 100644
--- a/app/assets/javascripts/super_sidebar/components/user_bar.vue
+++ b/app/assets/javascripts/super_sidebar/components/user_bar.vue
@@ -139,7 +139,7 @@ export default {
<gl-button
v-if="isImpersonating"
- v-gl-tooltip.ds500.bottom
+ v-gl-tooltip.bottom
:href="sidebarData.stop_impersonation_path"
:title="$options.i18n.stopImpersonating"
:aria-label="$options.i18n.stopImpersonating"
@@ -154,7 +154,7 @@ export default {
class="gl-display-flex gl-justify-content-space-between gl-gap-2"
>
<counter
- v-gl-tooltip:super-sidebar.hover.ds500.bottom="$options.i18n.issues"
+ v-gl-tooltip:super-sidebar.hover.bottom="$options.i18n.issues"
class="gl-flex-basis-third dashboard-shortcuts-issues"
icon="issues"
:count="userCounts.assigned_issues"
@@ -172,9 +172,7 @@ export default {
@hidden="mrMenuShown = false"
>
<counter
- v-gl-tooltip:super-sidebar.hover.ds500.bottom="
- mrMenuShown ? '' : $options.i18n.mergeRequests
- "
+ v-gl-tooltip:super-sidebar.hover.bottom="mrMenuShown ? '' : $options.i18n.mergeRequests"
class="gl-w-full"
icon="merge-request-open"
:count="mergeRequestTotalCount"
@@ -186,7 +184,7 @@ export default {
/>
</merge-request-menu>
<counter
- v-gl-tooltip:super-sidebar.hover.ds500.bottom="$options.i18n.todoList"
+ v-gl-tooltip:super-sidebar.hover.bottom="$options.i18n.todoList"
class="gl-flex-basis-third shortcuts-todos js-todos-count"
icon="todo-done"
:count="userCounts.todos"
@@ -200,7 +198,7 @@ export default {
</div>
<button
id="super-sidebar-search"
- v-gl-tooltip.bottom.hover.ds500.html="searchTooltip"
+ v-gl-tooltip.bottom.hover.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/controllers/projects/mirrors_controller.rb b/app/controllers/projects/mirrors_controller.rb
index acbd26cbdf6..a24273488fb 100644
--- a/app/controllers/projects/mirrors_controller.rb
+++ b/app/controllers/projects/mirrors_controller.rb
@@ -81,6 +81,7 @@ class Projects::MirrorsController < Projects::ApplicationController
only_protected_branches
keep_divergent_refs
auth_method
+ user
password
ssh_known_hosts
regenerate_ssh_private_key
diff --git a/app/finders/groups/accepting_group_transfers_finder.rb b/app/finders/groups/accepting_group_transfers_finder.rb
index ddf1ed2662a..e757ecff015 100644
--- a/app/finders/groups/accepting_group_transfers_finder.rb
+++ b/app/finders/groups/accepting_group_transfers_finder.rb
@@ -15,12 +15,8 @@ module Groups
items = find_all_groups
- if exact_matches_first_enabled?
- # Search will perform an ORDER BY to ensure exact matches are returned first.
- return by_search(items, exact_matches_first: true) if params[:search].present?
- else
- items = by_search(items)
- end
+ # Search will perform an ORDER BY to ensure exact matches are returned first.
+ return by_search(items, exact_matches_first: true) if params[:search].present?
sort(items)
end
@@ -66,9 +62,5 @@ module Groups
def can_transfer_group?
Ability.allowed?(current_user, :admin_group, group_to_be_transferred)
end
-
- def exact_matches_first_enabled?
- Feature.enabled?(:exact_matches_first_group_transfer, group_to_be_transferred)
- end
end
end
diff --git a/app/models/concerns/restricted_signup.rb b/app/models/concerns/restricted_signup.rb
index cf97be21165..6af9ede5e8b 100644
--- a/app/models/concerns/restricted_signup.rb
+++ b/app/models/concerns/restricted_signup.rb
@@ -84,3 +84,5 @@ module RestrictedSignup
end
end
end
+
+::RestrictedSignup.prepend_mod
diff --git a/app/models/pages_deployment.rb b/app/models/pages_deployment.rb
index 93b041f0426..de7b2416258 100644
--- a/app/models/pages_deployment.rb
+++ b/app/models/pages_deployment.rb
@@ -20,6 +20,7 @@ class PagesDeployment < ApplicationRecord
scope :with_files_stored_locally, -> { where(file_store: ::ObjectStorage::Store::LOCAL) }
scope :with_files_stored_remotely, -> { where(file_store: ::ObjectStorage::Store::REMOTE) }
scope :project_id_in, ->(ids) { where(project_id: ids) }
+ scope :active, -> { where(deleted_at: nil) }
validates :file, presence: true
validates :file_store, presence: true, inclusion: { in: ObjectStorage::SUPPORTED_STORES }
@@ -34,6 +35,14 @@ class PagesDeployment < ApplicationRecord
skip_callback :save, :after, :store_file!
after_commit :store_file_after_commit!, on: [:create, :update]
+ def self.deactivate_deployments_older_than(deployment, time: nil)
+ now = Time.now.utc
+ active
+ .older_than(deployment.id)
+ .where(project_id: deployment.project_id, path_prefix: deployment.path_prefix)
+ .update_all(updated_at: now, deleted_at: time || now)
+ end
+
def migrated?
file.filename == MIGRATED_FILE_NAME
end
diff --git a/app/services/projects/update_pages_service.rb b/app/services/projects/update_pages_service.rb
index a08c45192d9..dc92c501b8c 100644
--- a/app/services/projects/update_pages_service.rb
+++ b/app/services/projects/update_pages_service.rb
@@ -105,11 +105,15 @@ module Projects
def update_project_pages_deployment(deployment)
project.update_pages_deployment!(deployment)
+
+ PagesDeployment.deactivate_deployments_older_than(
+ deployment,
+ time: OLD_DEPLOYMENTS_DESTRUCTION_DELAY.from_now)
+
DestroyPagesDeploymentsWorker.perform_in(
OLD_DEPLOYMENTS_DESTRUCTION_DELAY,
project.id,
- deployment.id
- )
+ deployment.id)
end
def register_attempt
diff --git a/app/views/admin/application_settings/_snowplow.html.haml b/app/views/admin/application_settings/_snowplow.html.haml
index 6f9aad56ce8..1b90432e1f3 100644
--- a/app/views/admin/application_settings/_snowplow.html.haml
+++ b/app/views/admin/application_settings/_snowplow.html.haml
@@ -6,7 +6,7 @@
= render Pajamas::ButtonComponent.new(button_options: { class: 'js-settings-toggle' }) do
= expanded ? _('Collapse') : _('Expand')
%p.gl-text-secondary
- - help_link = link_to('', help_page_path('development/snowplow/index'), target: '_blank', rel: 'noopener noreferrer')
+ - help_link = link_to('', help_page_path('development/internal_analytics/snowplow/index'), target: '_blank', rel: 'noopener noreferrer')
- snowplow_link = link_to('', 'https://snowplow.io/', target: '_blank', rel: 'noopener noreferrer')
= safe_format(_('Configure %{snowplow_link_start}Snowplow%{snowplow_link_end} to track events. %{help_link_start}Learn more.%{help_link_end}'), tag_pair(snowplow_link, :snowplow_link_start, :snowplow_link_end), tag_pair(help_link, :help_link_start, :help_link_end))
.settings-content
diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml
index 23060f2627b..5a3814ca83d 100644
--- a/app/views/admin/application_settings/_usage.html.haml
+++ b/app/views/admin/application_settings/_usage.html.haml
@@ -12,7 +12,7 @@
help_text: _("GitLab informs you if a new version is available. %{link_start}What information does GitLab Inc. collect?%{link_end}").html_safe % { link_start: help_link_start, link_end: link_end }
.form-group
- can_be_configured = @application_setting.usage_ping_can_be_configured?
- - service_ping_link_start = link_start % { url: help_page_path('development/service_ping/index') }
+ - service_ping_link_start = link_start % { url: help_page_path('development/internal_analytics/service_ping/index') }
- deactivating_service_ping_link_start = link_start % { url: help_page_path('administration/settings/usage_statistics', anchor: 'disable-usage-statistics-with-the-configuration-file') }
- usage_ping_help_text = s_('AdminSettings|To help improve GitLab and its user experience, GitLab periodically collects usage information. %{link_start}What information is shared with GitLab Inc.?%{link_end}').html_safe % { link_start: service_ping_link_start, link_end: link_end }
- disabled_help_text = s_('AdminSettings|Service ping is disabled in your configuration file, and cannot be enabled through this form. For more information, see the documentation on %{link_start}deactivating service ping%{link_end}.').html_safe % { link_start: deactivating_service_ping_link_start, link_end: link_end }
diff --git a/app/views/admin/dev_ops_report/_score.html.haml b/app/views/admin/dev_ops_report/_score.html.haml
index 208afefc73b..a504563ad91 100644
--- a/app/views/admin/dev_ops_report/_score.html.haml
+++ b/app/views/admin/dev_ops_report/_score.html.haml
@@ -1,6 +1,6 @@
- service_ping_enabled = Gitlab::CurrentSettings.usage_ping_enabled
- if !service_ping_enabled
- #js-devops-service-ping-disabled{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_service_ping_path: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/service_ping/index.md') } }
+ #js-devops-service-ping-disabled{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/convdev/convdev_no_index.svg'), enable_service_ping_path: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/internal_analytics/service_ping/index.md') } }
- else
#js-devops-score{ data: { devops_score_metrics: devops_score_metrics(@metric).to_json, no_data_image_path: image_path('dev_ops_report_no_data.svg'), devops_score_intro_image_path: image_path('dev_ops_report_overview.svg') } }
diff --git a/app/views/groups/settings/_permissions.html.haml b/app/views/groups/settings/_permissions.html.haml
index f4749617463..45fd98adbb9 100644
--- a/app/views/groups/settings/_permissions.html.haml
+++ b/app/views/groups/settings/_permissions.html.haml
@@ -37,7 +37,7 @@
= render_if_exists 'groups/settings/wiki', f: f, group: @group
= render 'groups/settings/lfs', f: f
= render_if_exists 'groups/settings/code_suggestions', f: f, group: @group
- = render_if_exists 'groups/settings/ai_related_settings', f: f, group: @group
+ = render_if_exists 'groups/settings/experimental_settings', f: f, group: @group
= render_if_exists 'groups/settings/ai_third_party_settings', f: f, group: @group
= render 'groups/settings/git_access_protocols', f: f, group: @group
= render 'groups/settings/project_creation_level', f: f, group: @group
diff --git a/app/views/projects/blob/viewers/_metrics_dashboard_yml.html.haml b/app/views/projects/blob/viewers/_metrics_dashboard_yml.html.haml
index 9c3f9b6c9fd..b7bc43d08d8 100644
--- a/app/views/projects/blob/viewers/_metrics_dashboard_yml.html.haml
+++ b/app/views/projects/blob/viewers/_metrics_dashboard_yml.html.haml
@@ -7,5 +7,3 @@
%ul
- viewer.errors.each do |error|
%li= error
-
-= link_to _('Learn more'), help_page_path('operations/metrics/dashboards/index.md')
diff --git a/app/views/projects/blob/viewers/_metrics_dashboard_yml_loading.html.haml b/app/views/projects/blob/viewers/_metrics_dashboard_yml_loading.html.haml
index 5e355ecc4b8..1f5086dc3bd 100644
--- a/app/views/projects/blob/viewers/_metrics_dashboard_yml_loading.html.haml
+++ b/app/views/projects/blob/viewers/_metrics_dashboard_yml_loading.html.haml
@@ -1,4 +1,2 @@
= gl_loading_icon(inline: true, css_class: "mr-1")
= _('Metrics Dashboard YAML definition') + '…'
-
-= link_to _('Learn more'), help_page_path('operations/metrics/dashboards/yaml.md')
diff --git a/app/views/projects/mirrors/_authentication_method.html.haml b/app/views/projects/mirrors/_authentication_method.html.haml
index bc162458eae..ab039bdead2 100644
--- a/app/views/projects/mirrors/_authentication_method.html.haml
+++ b/app/views/projects/mirrors/_authentication_method.html.haml
@@ -1,5 +1,5 @@
- mirror = f.object
-- auth_options = [[_('Password'), 'password'], [_('SSH public key'), 'ssh_public_key']]
+- auth_options = [[_('Username and Password'), 'password'], [_('SSH public key'), 'ssh_public_key']]
.form-group
= f.label :auth_method, _('Authentication method'), class: 'label-bold'
@@ -9,6 +9,9 @@
= f.hidden_field :auth_method, value: "password", class: "js-hidden-mirror-auth-type"
.form-group
- .well-password-auth.collapse.js-well-password-auth
+ = f.label :user, _('Username'), class: 'label-bold'
+ = f.text_field :user, class: 'form-control gl-form-input gl-form-input-xl', value: nil, autocomplete: 'off', required: false, autocorrect: 'off', autocapitalize: 'off', spellcheck: false
+.well-password-auth.collapse.js-well-password-auth
+ .form-group
= f.label :password, _("Password"), class: "label-bold"
= f.password_field :password, class: 'form-control gl-form-input js-mirror-password-field gl-form-input-xl', autocomplete: 'off', data: { qa_selector: 'password_field' }
diff --git a/app/views/projects/mirrors/_instructions.html.haml b/app/views/projects/mirrors/_instructions.html.haml
index 2bd2c7cac44..5a8710a64b0 100644
--- a/app/views/projects/mirrors/_instructions.html.haml
+++ b/app/views/projects/mirrors/_instructions.html.haml
@@ -4,7 +4,7 @@
= html_escape(_('The repository must be accessible over %{code_open}http://%{code_close},
%{code_open}https://%{code_close}, %{code_open}ssh://%{code_close} or %{code_open}git://%{code_close}.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
%li= html_escape(_('When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
- %li= html_escape(_('Include the username in the URL if required: %{code_open}https://username@gitlab.company.com/group/project.git%{code_close}.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
+ %li= html_escape(_('Do not include the username in the URL, use the username field below if required: %{code_open}https://gitlab.company.com/group/project.git%{code_close}.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe }
%li
- minutes = Gitlab.config.gitlab_shell.git_timeout / 60
= _("The update action will time out after %{number_of_minutes} minutes. For big repositories, use a clone/push combination.") % { number_of_minutes: minutes }
diff --git a/app/views/shared/integrations/prometheus/_custom_metrics.html.haml b/app/views/shared/integrations/prometheus/_custom_metrics.html.haml
index a7a650aa95d..080d4b37354 100644
--- a/app/views/shared/integrations/prometheus/_custom_metrics.html.haml
+++ b/app/views/shared/integrations/prometheus/_custom_metrics.html.haml
@@ -3,7 +3,6 @@
.col-lg-3
%p
= s_('PrometheusService|Custom metrics require Prometheus installed on a cluster with environment scope "*" OR a manually configured Prometheus to be available.')
- = link_to s_('PrometheusService|More information'), help_page_path('operations/metrics/index.md'), target: '_blank', rel: "noopener noreferrer"
.col-lg-9
= render Pajamas::CardComponent.new(header_options: { class: 'gl-display-flex gl-align-items-center' }, body_options: { class: 'gl-p-0' }, card_options: { class: 'gl-mb-5 custom-monitored-metrics js-panel-custom-monitored-metrics', data: { active_custom_metrics: project_prometheus_metrics_path(project), environments_data: environments_list_data, service_active: "#{integration.active}" } }) do |c|
diff --git a/app/views/shared/integrations/prometheus/_metrics.html.haml b/app/views/shared/integrations/prometheus/_metrics.html.haml
index cb78faa383a..36e4c0d4b13 100644
--- a/app/views/shared/integrations/prometheus/_metrics.html.haml
+++ b/app/views/shared/integrations/prometheus/_metrics.html.haml
@@ -5,10 +5,9 @@
.col-lg-3
%p
= s_('PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters.')
- = link_to s_('PrometheusService|More information'), help_page_path('user/project/integrations/prometheus'), target: '_blank', rel: "noopener noreferrer"
.col-lg-9
- = render Pajamas::CardComponent.new(body_options: { class: 'gl-p-0' }, card_options: { class: 'gl-mb-5 js-panel-monitored-metrics', data: { active_metrics: active_common_project_prometheus_metrics_path(project, :json), metrics_help_path: help_page_path('user/project/integrations/prometheus_library/index') }}) do |c|
+ = render Pajamas::CardComponent.new(body_options: { class: 'gl-p-0' }, card_options: { class: 'gl-mb-5 js-panel-monitored-metrics', data: { active_metrics: active_common_project_prometheus_metrics_path(project, :json) }}) do |c|
- c.with_header do
%strong
= s_('PrometheusService|Common metrics')
@@ -34,5 +33,4 @@
.flash-notice
.flash-text
= html_escape(s_("PrometheusService|To set up automatic monitoring, add the environment variable %{variable} to exporter's queries.")) % { variable: "<code>$CI_ENVIRONMENT_SLUG</code>".html_safe }
- = link_to s_('PrometheusService|More information'), help_page_path('operations/metrics/index.md')
%ul.list-unstyled.metrics-list.js-missing-var-metrics-list
diff --git a/config/feature_flags/development/exact_matches_first_group_transfer.yml b/config/feature_flags/development/combined_analytics_visualization_editor.yml
index f5701c78177..7d465952c3d 100644
--- a/config/feature_flags/development/exact_matches_first_group_transfer.yml
+++ b/config/feature_flags/development/combined_analytics_visualization_editor.yml
@@ -1,8 +1,8 @@
---
-name: exact_matches_first_group_transfer
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/130773
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/424242
+name: combined_analytics_visualization_editor
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/131634
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/425048
milestone: '16.4'
type: development
-group: group::project management
+group: group::product analytics
default_enabled: false
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 9c553b018c5..f343c20dfe4 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -124,4 +124,8 @@ Doorkeeper.configure do
# 2 hours in seconds
# This is also the database default value
access_token_expires_in 7200
+
+ # Use a custom class for generating the application secret.
+ # https://doorkeeper.gitbook.io/guides/configuration/other-configurations#custom-application-secret-generator
+ application_secret_generator 'Gitlab::DoorkeeperSecretStoring::Token::UniqueApplicationToken'
end
diff --git a/db/migrate/20230913171402_add_deleted_at_to_pages_deployments.rb b/db/migrate/20230913171402_add_deleted_at_to_pages_deployments.rb
new file mode 100644
index 00000000000..15716f8fbfb
--- /dev/null
+++ b/db/migrate/20230913171402_add_deleted_at_to_pages_deployments.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class AddDeletedAtToPagesDeployments < Gitlab::Database::Migration[2.1]
+ def change
+ add_column :pages_deployments, :deleted_at, :datetime_with_timezone, null: true
+ end
+end
diff --git a/db/migrate/20230913171403_add_pages_deployments_deleted_at_index.rb b/db/migrate/20230913171403_add_pages_deployments_deleted_at_index.rb
new file mode 100644
index 00000000000..f519e54265f
--- /dev/null
+++ b/db/migrate/20230913171403_add_pages_deployments_deleted_at_index.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class AddPagesDeploymentsDeletedAtIndex < Gitlab::Database::Migration[2.1]
+ disable_ddl_transaction!
+
+ INDEX = 'pages_deployments_deleted_at_index'
+ COLUMNS = [:id, :project_id, :path_prefix]
+
+ def up
+ add_concurrent_index :pages_deployments,
+ COLUMNS,
+ where: 'deleted_at IS NULL',
+ name: INDEX
+ end
+
+ def down
+ remove_concurrent_index :pages_deployments, COLUMNS, name: INDEX
+ end
+end
diff --git a/db/post_migrate/20230914054914_index_finding_id_for_vulnerabilities_sync.rb b/db/post_migrate/20230914054914_index_finding_id_for_vulnerabilities_sync.rb
new file mode 100644
index 00000000000..37cd13a4dfa
--- /dev/null
+++ b/db/post_migrate/20230914054914_index_finding_id_for_vulnerabilities_sync.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+class IndexFindingIdForVulnerabilitiesSync < Gitlab::Database::Migration[2.1]
+ INDEX_NAME = 'index_vulnerabilities_on_finding_id'
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :vulnerabilities, :finding_id, name: INDEX_NAME
+ end
+
+ def down
+ remove_concurrent_index_by_name :vulnerabilities, INDEX_NAME
+ end
+end
diff --git a/db/schema_migrations/20230913171402 b/db/schema_migrations/20230913171402
new file mode 100644
index 00000000000..686a7c6f570
--- /dev/null
+++ b/db/schema_migrations/20230913171402
@@ -0,0 +1 @@
+af511c9616f7f44474a8b4cd04f05c36f387a7b94badc4a5b1325a1e7425de46 \ No newline at end of file
diff --git a/db/schema_migrations/20230913171403 b/db/schema_migrations/20230913171403
new file mode 100644
index 00000000000..d0982b705eb
--- /dev/null
+++ b/db/schema_migrations/20230913171403
@@ -0,0 +1 @@
+91ac60df233911ad7d770eaeb4736b35dab7ba335eba11824cb114a1cfa97826 \ No newline at end of file
diff --git a/db/schema_migrations/20230914054914 b/db/schema_migrations/20230914054914
new file mode 100644
index 00000000000..c5cc5595ce6
--- /dev/null
+++ b/db/schema_migrations/20230914054914
@@ -0,0 +1 @@
+9702393eb6db18d5d3d106c0a77c21419af828fe5a422dd5c06a2621ef10cf03 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index b66130e90c2..b87f96321c0 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -20508,6 +20508,7 @@ CREATE TABLE pages_deployments (
root_directory text DEFAULT 'public'::text,
path_prefix text,
build_ref text,
+ deleted_at timestamp with time zone,
CONSTRAINT check_4d04b8dc9a CHECK ((char_length(path_prefix) <= 128)),
CONSTRAINT check_5f9132a958 CHECK ((size IS NOT NULL)),
CONSTRAINT check_7e938c810a CHECK ((char_length(root_directory) <= 255)),
@@ -34162,6 +34163,8 @@ CREATE INDEX index_vulnerabilities_on_due_date_sourcing_milestone_id ON vulnerab
CREATE INDEX index_vulnerabilities_on_epic_id ON vulnerabilities USING btree (epic_id);
+CREATE INDEX index_vulnerabilities_on_finding_id ON vulnerabilities USING btree (finding_id);
+
CREATE INDEX index_vulnerabilities_on_last_edited_by_id ON vulnerabilities USING btree (last_edited_by_id);
CREATE INDEX index_vulnerabilities_on_milestone_id ON vulnerabilities USING btree (milestone_id);
@@ -34432,6 +34435,8 @@ CREATE INDEX packages_packages_needs_verification ON packages_package_files USIN
CREATE INDEX packages_packages_pending_verification ON packages_package_files USING btree (verified_at NULLS FIRST) WHERE (verification_state = 0);
+CREATE INDEX pages_deployments_deleted_at_index ON pages_deployments USING btree (id, project_id, path_prefix) WHERE (deleted_at IS NULL);
+
CREATE UNIQUE INDEX partial_index_bulk_import_exports_on_group_id_and_relation ON bulk_import_exports USING btree (group_id, relation) WHERE (group_id IS NOT NULL);
CREATE UNIQUE INDEX partial_index_bulk_import_exports_on_project_id_and_relation ON bulk_import_exports USING btree (project_id, relation) WHERE (project_id IS NOT NULL);
diff --git a/doc/administration/monitoring/gitlab_self_monitoring_project/index.md b/doc/administration/monitoring/gitlab_self_monitoring_project/index.md
deleted file mode 100644
index dbdcdf22007..00000000000
--- a/doc/administration/monitoring/gitlab_self_monitoring_project/index.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../index.md'
----
-
-# Self-monitoring project (removed) **(FREE SELF)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/348909)
-in GitLab 14.9 and [removed](https://gitlab.com/groups/gitlab-org/-/epics/10030) in 16.0.
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 78f2f584a8a..163c6174c9d 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -74,7 +74,7 @@ four standard [pagination arguments](#connection-pagination-arguments):
### `Query.aiMessages`
-Find AI Duo Chat messages.
+Find GitLab Duo Chat messages.
WARNING:
**Introduced** in 16.1.
@@ -13004,7 +13004,7 @@ Information about a connected Agent.
### `AiChatMessage`
-Duo Chat message.
+GitLab Duo Chat message.
#### Fields
@@ -15434,7 +15434,7 @@ Represents a DAST Site Profile.
### `DastSiteProfileAuth`
-Input type for DastSiteProfile authentication.
+DastSiteProfile authentication.
#### Fields
diff --git a/doc/api/index.md b/doc/api/index.md
index 7cb25c4ce17..974aa18a933 100644
--- a/doc/api/index.md
+++ b/doc/api/index.md
@@ -15,4 +15,4 @@ Automate and interact with GitLab, and integrate with external applications.
- [OAuth 2.0 identity provider API](oauth2.md)
- [GitLab CLI (glab)](../integration/glab/index.md)
- [Visual Studio Code extension](../user/project/repository/vscode.md)
-- [Code Suggestions](../user/project/repository/code_suggestions.md)
+- [Code Suggestions](../user/project/repository/code_suggestions/index.md)
diff --git a/doc/api/managed_licenses.md b/doc/api/managed_licenses.md
deleted file mode 100644
index d9f74ddddb2..00000000000
--- a/doc/api/managed_licenses.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-stage: Fulfillment
-group: Utilization
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: 'index.md'
----
-
-# Managed Licenses API (removed) **(ULTIMATE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/390417) in GitLab 15.9
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/397067) in 16.0.
-
-<!-- This redirect file can be deleted after <2023-08-22>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/api/rest/deprecations.md b/doc/api/rest/deprecations.md
index 80480e3f88f..154945977b2 100644
--- a/doc/api/rest/deprecations.md
+++ b/doc/api/rest/deprecations.md
@@ -61,10 +61,9 @@ The `changes from a single merge request` endpoint will be removed in v5 of the
Breaking change. [Related issue](https://gitlab.com/gitlab-org/gitlab/-/issues/397067).
-The endpoint to get
-[all managed licenses for a given project](../managed_licenses.md)
-has been deprecated in favor the
+The endpoint to get all managed licenses for a given project has been deprecated in favor the
[License Approval policy](../../user/compliance/license_approval_policies.md) feature.
+
Users who wish to continue to enforce approvals based on detected licenses are encouraged to create a new [License Approval policy](../../user/compliance/license_approval_policies.md) instead.
The `managed licenses` endpoint will be removed in v5 of the GitLab REST API.
diff --git a/doc/ci/pipelines/pipeline_artifacts.md b/doc/ci/pipelines/pipeline_artifacts.md
deleted file mode 100644
index 79435c0276d..00000000000
--- a/doc/ci/pipelines/pipeline_artifacts.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-stage: Verify
-group: Pipeline Security
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-redirect_to: '../testing/test_coverage_visualization.md'
-remove_date: '2023-08-31'
----
-
-This document was moved to [another location](../testing/test_coverage_visualization.md).
-
-<!-- This redirect file can be deleted after <2023-08-31>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/ci/runners/saas/macos/codesigning.md b/doc/ci/runners/saas/macos/codesigning.md
deleted file mode 100644
index 7e70e984c7c..00000000000
--- a/doc/ci/runners/saas/macos/codesigning.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../macos_saas_runner.md'
-remove_date: '2023-09-05'
----
-
-This document was moved to [another location](../macos_saas_runner.md).
-
-<!-- This redirect file can be deleted after <2023-09-05>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html --> \ No newline at end of file
diff --git a/doc/ci/runners/saas/macos/environment.md b/doc/ci/runners/saas/macos/environment.md
deleted file mode 100644
index 7e70e984c7c..00000000000
--- a/doc/ci/runners/saas/macos/environment.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../macos_saas_runner.md'
-remove_date: '2023-09-05'
----
-
-This document was moved to [another location](../macos_saas_runner.md).
-
-<!-- This redirect file can be deleted after <2023-09-05>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html --> \ No newline at end of file
diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md
index 64eefcbdc9d..956544ceb82 100644
--- a/doc/ci/yaml/index.md
+++ b/doc/ci/yaml/index.md
@@ -1530,27 +1530,28 @@ is extracted from the job output. The coverage is shown in the UI if at least on
line in the job output matches the regular expression.
To extract the code coverage value from the match, GitLab uses
-this smaller regular expression: `\d+(\.\d+)?`.
+this smaller regular expression: `\d+(?:\.\d+)?`.
**Possible inputs**:
-- A regular expression. Must start and end with `/`. Must match the coverage number.
+- An RE2 regular expression. Must start and end with `/`. Must match the coverage number.
May match surrounding text as well, so you don't need to use a regular expression character group
to capture the exact number.
+ Because it uses RE2 syntax, all groups must be non-capturing.
**Example of `coverage`**:
```yaml
job1:
script: rspec
- coverage: '/Code coverage: \d+\.\d+/'
+ coverage: '/Code coverage: \d+(?:\.\d+)?/'
```
In this example:
1. GitLab checks the job log for a match with the regular expression. A line
like `Code coverage: 67.89% of lines covered` would match.
-1. GitLab then checks the matched fragment to find a match to `\d+(\.\d+)?`.
+1. GitLab then checks the matched fragment to find a match to `\d+(?:\.\d+)?`.
The sample matching line above gives a code coverage of `67.89`.
**Additional details**:
diff --git a/doc/development/database/foreign_keys.md b/doc/development/database/foreign_keys.md
index 5dda3dd55a3..84ab32d0c0b 100644
--- a/doc/development/database/foreign_keys.md
+++ b/doc/development/database/foreign_keys.md
@@ -195,5 +195,5 @@ end
```
Using a foreign key as primary key saves space but can make
-[batch counting](../internal_analytics/service_ping/implement.md#batch-counters) in [Service Ping](../service_ping/index.md) less efficient.
+[batch counting](../internal_analytics/service_ping/implement.md#batch-counters) in [Service Ping](../internal_analytics/service_ping/index.md) less efficient.
Consider using a regular `id` column if the table is relevant for Service Ping.
diff --git a/doc/development/experiment_guide/implementing_experiments.md b/doc/development/experiment_guide/implementing_experiments.md
index 6fe58a1da54..61a46397390 100644
--- a/doc/development/experiment_guide/implementing_experiments.md
+++ b/doc/development/experiment_guide/implementing_experiments.md
@@ -281,7 +281,7 @@ about contexts now.
We can assume we run the experiment in one or a few places, but
track events potentially in many places. The tracking call remains the same, with
the arguments you would usually use when
-[tracking events using snowplow](../snowplow/index.md). The easiest example
+[tracking events using snowplow](../internal_analytics/snowplow/index.md). The easiest example
of tracking an event in Ruby would be:
```ruby
diff --git a/doc/development/feature_development.md b/doc/development/feature_development.md
index 4df69ca2e54..2f013f698dc 100644
--- a/doc/development/feature_development.md
+++ b/doc/development/feature_development.md
@@ -163,8 +163,8 @@ The following integration guides are internal. Some integrations require access
## Analytics Instrumentation guides
- [Analytics Instrumentation guide](https://about.gitlab.com/handbook/product/analytics-instrumentation-guide/)
-- [Service Ping guide](service_ping/index.md)
-- [Snowplow guide](snowplow/index.md)
+- [Service Ping guide](internal_analytics/service_ping/index.md)
+- [Snowplow guide](internal_analytics/snowplow/index.md)
## Experiment guide
diff --git a/doc/development/service_ping/implement.md b/doc/development/service_ping/implement.md
deleted file mode 100644
index c1077793fb9..00000000000
--- a/doc/development/service_ping/implement.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/service_ping/implement.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/service_ping/implement.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/service_ping/index.md b/doc/development/service_ping/index.md
deleted file mode 100644
index d0806ed375b..00000000000
--- a/doc/development/service_ping/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/service_ping/index.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/service_ping/index.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/service_ping/metrics_dictionary.md b/doc/development/service_ping/metrics_dictionary.md
deleted file mode 100644
index fecab4916f5..00000000000
--- a/doc/development/service_ping/metrics_dictionary.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/service_ping/metrics_dictionary.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/service_ping/metrics_dictionary.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/service_ping/metrics_instrumentation.md b/doc/development/service_ping/metrics_instrumentation.md
deleted file mode 100644
index 5a4dfc325e2..00000000000
--- a/doc/development/service_ping/metrics_instrumentation.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/service_ping/metrics_instrumentation.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/service_ping/metrics_instrumentation.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/service_ping/metrics_lifecycle.md b/doc/development/service_ping/metrics_lifecycle.md
deleted file mode 100644
index 520b18139ff..00000000000
--- a/doc/development/service_ping/metrics_lifecycle.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/service_ping/metrics_lifecycle.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/service_ping/metrics_lifecycle.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/service_ping/performance_indicator_metrics.md b/doc/development/service_ping/performance_indicator_metrics.md
deleted file mode 100644
index eda7224732d..00000000000
--- a/doc/development/service_ping/performance_indicator_metrics.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/service_ping/performance_indicator_metrics.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/service_ping/performance_indicator_metrics.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/service_ping/review_guidelines.md b/doc/development/service_ping/review_guidelines.md
deleted file mode 100644
index d5805f615e2..00000000000
--- a/doc/development/service_ping/review_guidelines.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/service_ping/review_guidelines.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/service_ping/review_guidelines.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/service_ping/troubleshooting.md b/doc/development/service_ping/troubleshooting.md
deleted file mode 100644
index 31b04c1a6bc..00000000000
--- a/doc/development/service_ping/troubleshooting.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/service_ping/troubleshooting.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/service_ping/troubleshooting.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/service_ping/usage_data.md b/doc/development/service_ping/usage_data.md
deleted file mode 100644
index 94ae90273d0..00000000000
--- a/doc/development/service_ping/usage_data.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/service_ping/usage_data.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/service_ping/usage_data.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/snowplow/event_dictionary_guide.md b/doc/development/snowplow/event_dictionary_guide.md
deleted file mode 100644
index 2bea681bf59..00000000000
--- a/doc/development/snowplow/event_dictionary_guide.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/snowplow/event_dictionary_guide.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/snowplow/event_dictionary_guide.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/snowplow/implementation.md b/doc/development/snowplow/implementation.md
deleted file mode 100644
index a9e4e252a53..00000000000
--- a/doc/development/snowplow/implementation.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/snowplow/implementation.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/snowplow/implementation.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/snowplow/index.md b/doc/development/snowplow/index.md
deleted file mode 100644
index c0e53fe3b1b..00000000000
--- a/doc/development/snowplow/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/snowplow/index.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/snowplow/index.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/snowplow/infrastructure.md b/doc/development/snowplow/infrastructure.md
deleted file mode 100644
index 6374af40ffe..00000000000
--- a/doc/development/snowplow/infrastructure.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/snowplow/infrastructure.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/snowplow/infrastructure.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/snowplow/review_guidelines.md b/doc/development/snowplow/review_guidelines.md
deleted file mode 100644
index f4752e08dde..00000000000
--- a/doc/development/snowplow/review_guidelines.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/snowplow/review_guidelines.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/snowplow/review_guidelines.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/snowplow/schemas.md b/doc/development/snowplow/schemas.md
deleted file mode 100644
index 7e00ddd976d..00000000000
--- a/doc/development/snowplow/schemas.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/snowplow/schemas.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/snowplow/schemas.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/development/snowplow/troubleshooting.md b/doc/development/snowplow/troubleshooting.md
deleted file mode 100644
index ed1f5033239..00000000000
--- a/doc/development/snowplow/troubleshooting.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../internal_analytics/snowplow/troubleshooting.md'
-remove_date: '2023-08-20'
----
-
-This document was moved to [another location](../internal_analytics/snowplow/troubleshooting.md).
-
-<!-- This redirect file can be deleted after <2023-08-20>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html
diff --git a/doc/editor_extensions/jetbrains_ide/index.md b/doc/editor_extensions/jetbrains_ide/index.md
index dcf13570b11..7809ad69866 100644
--- a/doc/editor_extensions/jetbrains_ide/index.md
+++ b/doc/editor_extensions/jetbrains_ide/index.md
@@ -30,7 +30,7 @@ integrates GitLab with JetBrains IDEs. The following JetBrains IDEs are supporte
## Supported features
-GitLab for JetBrains supports [GitLab Duo Code Suggestions](../../user/project/repository/code_suggestions.md).
+GitLab for JetBrains supports [GitLab Duo Code Suggestions](../../user/project/repository/code_suggestions/index.md).
## Download the extension
diff --git a/doc/editor_extensions/neovim/index.md b/doc/editor_extensions/neovim/index.md
index e2e410ae82c..220cae8f334 100644
--- a/doc/editor_extensions/neovim/index.md
+++ b/doc/editor_extensions/neovim/index.md
@@ -13,7 +13,7 @@ integrates GitLab with Neovim. The following Neovim versions are supported:
## Supported features
-GitLab for Neovim supports [GitLab Duo Code Suggestions](../../user/project/repository/code_suggestions.md).
+GitLab for Neovim supports [GitLab Duo Code Suggestions](../../user/project/repository/code_suggestions/index.md).
## Install and configure the extension
diff --git a/doc/editor_extensions/visual_studio/index.md b/doc/editor_extensions/visual_studio/index.md
index 744f7759bf5..76a1abe058a 100644
--- a/doc/editor_extensions/visual_studio/index.md
+++ b/doc/editor_extensions/visual_studio/index.md
@@ -14,7 +14,7 @@ integrates GitLab with Visual Studio. The following Visual Studio versions are s
## Supported features
-GitLab for Visual Studio supports [GitLab Duo Code Suggestions](../../user/project/repository/code_suggestions.md).
+GitLab for Visual Studio supports [GitLab Duo Code Suggestions](../../user/project/repository/code_suggestions/index.md).
## Download the extension
diff --git a/doc/editor_extensions/visual_studio_code/index.md b/doc/editor_extensions/visual_studio_code/index.md
index a0056e172c6..2aa745c17a8 100644
--- a/doc/editor_extensions/visual_studio_code/index.md
+++ b/doc/editor_extensions/visual_studio_code/index.md
@@ -22,7 +22,7 @@ do more day-to-day tasks in Visual Studio Code, such as:
and paste snippets to, and from, your editor.
- [Browse repositories](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#browse-a-repository-without-cloning)
without cloning them.
-- [Receive Code Suggestions](../../user/project/repository/code_suggestions.md).
+- [Receive Code Suggestions](../../user/project/repository/code_suggestions/index.md).
- [View Security findings](https://marketplace.visualstudio.com/items?itemName=gitlab.gitlab-workflow#security-findings).
## Download the extension
@@ -36,7 +36,7 @@ you can [configure](https://marketplace.visualstudio.com/items?itemName=GitLab.g
- [Features to display or hide](https://gitlab.com/gitlab-org/gitlab-vscode-extension#extension-settings).
- [Self-signed certificate](https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow#self-signed-certificates) information.
-- [Code Suggestions](../../user/project/repository/code_suggestions.md).
+- [Code Suggestions](../../user/project/repository/code_suggestions/index.md).
## Report issues with the extension
diff --git a/doc/install/cloud_native/index.md b/doc/install/cloud_native/index.md
deleted file mode 100644
index d971cd419e9..00000000000
--- a/doc/install/cloud_native/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'https://docs.gitlab.com/charts/'
-remove_date: '2023-09-09'
----
-
-This document was moved to [another location](https://docs.gitlab.com/charts/).
-
-<!-- This redirect file can be deleted after <2023-09-09>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html --> \ No newline at end of file
diff --git a/doc/integration/cas.md b/doc/integration/cas.md
deleted file mode 100644
index f4aa1a06b81..00000000000
--- a/doc/integration/cas.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-stage: Govern
-group: Authentication and Authorization
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-15'
-redirect_to: '../administration/auth/index.md'
----
-
-# CAS OmniAuth provider (removed) **(FREE SELF)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/369127)
-in GitLab 15.3 and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/369128)
-in 16.0.
diff --git a/doc/operations/metrics/alerts.md b/doc/operations/metrics/alerts.md
deleted file mode 100644
index a5f580ac503..00000000000
--- a/doc/operations/metrics/alerts.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../index.md'
----
-
-# Set up alerts for Prometheus metrics (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/operations/metrics/dashboards/default.md b/doc/operations/metrics/dashboards/default.md
deleted file mode 100644
index 3eec1272307..00000000000
--- a/doc/operations/metrics/dashboards/default.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../index.md'
----
-
-# GitLab-defined metrics dashboards (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/operations/metrics/dashboards/develop.md b/doc/operations/metrics/dashboards/develop.md
deleted file mode 100644
index c6d4721863a..00000000000
--- a/doc/operations/metrics/dashboards/develop.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../index.md'
----
-
-# Developing templates for custom dashboards (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/operations/metrics/dashboards/index.md b/doc/operations/metrics/dashboards/index.md
deleted file mode 100644
index df94f979f5f..00000000000
--- a/doc/operations/metrics/dashboards/index.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../index.md'
----
-
-# Custom dashboards (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/operations/metrics/dashboards/panel_types.md b/doc/operations/metrics/dashboards/panel_types.md
deleted file mode 100644
index 8dcf4e6ad28..00000000000
--- a/doc/operations/metrics/dashboards/panel_types.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../index.md'
----
-
-# Panel types for dashboards (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/operations/metrics/dashboards/settings.md b/doc/operations/metrics/dashboards/settings.md
deleted file mode 100644
index 7abcbf88d59..00000000000
--- a/doc/operations/metrics/dashboards/settings.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../index.md'
----
-
-# Dashboard settings (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/operations/metrics/dashboards/templating_variables.md b/doc/operations/metrics/dashboards/templating_variables.md
deleted file mode 100644
index ceeeb229a81..00000000000
--- a/doc/operations/metrics/dashboards/templating_variables.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../index.md'
----
-
-# Templating variables for metrics dashboards (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/operations/metrics/dashboards/variables.md b/doc/operations/metrics/dashboards/variables.md
deleted file mode 100644
index b4ea05a0cea..00000000000
--- a/doc/operations/metrics/dashboards/variables.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../index.md'
----
-
-# Using variables (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/operations/metrics/dashboards/yaml.md b/doc/operations/metrics/dashboards/yaml.md
deleted file mode 100644
index 95c02319b19..00000000000
--- a/doc/operations/metrics/dashboards/yaml.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../index.md'
----
-
-# Dashboard YAML properties (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/operations/metrics/dashboards/yaml_number_format.md b/doc/operations/metrics/dashboards/yaml_number_format.md
deleted file mode 100644
index e75beadfab9..00000000000
--- a/doc/operations/metrics/dashboards/yaml_number_format.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../index.md'
----
-
-# Unit formats reference (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/operations/metrics/embed.md b/doc/operations/metrics/embed.md
deleted file mode 100644
index 68f115b66db..00000000000
--- a/doc/operations/metrics/embed.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../index.md'
----
-
-# Embedding metric charts within GitLab Flavored Markdown (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/operations/metrics/embed_grafana.md b/doc/operations/metrics/embed_grafana.md
deleted file mode 100644
index 82967aa663f..00000000000
--- a/doc/operations/metrics/embed_grafana.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../index.md'
----
-# Embed Grafana panels in Markdown (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
-Use [embed charts](https://gitlab.com/groups/gitlab-org/opstrace/-/epics/33) instead.
diff --git a/doc/operations/metrics/index.md b/doc/operations/metrics/index.md
deleted file mode 100644
index 65f84c9c825..00000000000
--- a/doc/operations/metrics/index.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../index.md'
----
-
-# Monitor your environment's metrics (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/policy/alpha-beta-support.md b/doc/policy/alpha-beta-support.md
deleted file mode 100644
index bfea5b3a2d6..00000000000
--- a/doc/policy/alpha-beta-support.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'experiment-beta-support.md'
-remove_date: '2023-09-07'
----
-
-This document was moved to [another location](experiment-beta-support.md).
-
-<!-- This redirect file can be deleted after <2023-09-07>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/raketasks/cleanup.md b/doc/raketasks/cleanup.md
index 11a6e06fcf5..5ffed097a51 100644
--- a/doc/raketasks/cleanup.md
+++ b/doc/raketasks/cleanup.md
@@ -156,7 +156,7 @@ These commands don't work for artifacts stored on
[object storage](../administration/object_storage.md).
WARNING:
-Prior to GitLab 14.9, this task incorrectly deletes [pipeline artifacts](../ci/pipelines/pipeline_artifacts.md).
+Prior to GitLab 14.9, this task incorrectly deletes [test coverage-related artifacts](../ci/testing/test_coverage_visualization.md).
[The bug fix](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81022) was
also back-ported to 14.6.6, 14.7.5, and 14.8.3. Upgrade to a release with the bug
fix to avoid data loss.
diff --git a/doc/raketasks/generate_sample_prometheus_data.md b/doc/raketasks/generate_sample_prometheus_data.md
deleted file mode 100644
index 77c7d2c2c1a..00000000000
--- a/doc/raketasks/generate_sample_prometheus_data.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: 'index.md'
----
-
-# Sample Prometheus data Rake task (removed) **(FREE SELF)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/raketasks/import.md b/doc/raketasks/import.md
deleted file mode 100644
index d6e9a71abec..00000000000
--- a/doc/raketasks/import.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Systems
-group: Distribution
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../index.md'
----
-
-# Import bare repositories (removed) **(FREE SELF)**
-
-The Rake task for importing bare repositories was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108507)
-in GitLab 15.8 and [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118676) in GitLab 16.0.
diff --git a/doc/security/hardening_application_recommendations.md b/doc/security/hardening_application_recommendations.md
index bb89737cc92..5a11c53ffee 100644
--- a/doc/security/hardening_application_recommendations.md
+++ b/doc/security/hardening_application_recommendations.md
@@ -206,7 +206,7 @@ security patches come out frequently, this helps you stay up to date.
restrict data gathering and statistics reporting to a software vendor, you may have
to disable the **Enable service ping** feature. For more information on what data is collected to
help you make an informed decision, see
-[service ping](../development/service_ping/index.md).
+[service ping](../development/internal_analytics/service_ping/index.md).
## Network
diff --git a/doc/subscriptions/gitlab_com/index.md b/doc/subscriptions/gitlab_com/index.md
index 0bfd66437a5..ff85c658c50 100644
--- a/doc/subscriptions/gitlab_com/index.md
+++ b/doc/subscriptions/gitlab_com/index.md
@@ -264,6 +264,9 @@ To change the namespace linked to a subscription:
Only one namespace can be linked to a subscription.
+<i class="fa fa-youtube-play youtube" aria-hidden="true"></i>
+For a demo, see [Linking GitLab Subscription to the Namespace](https://youtu.be/8iOsN8ajBUw).
+
## Upgrade your GitLab SaaS subscription tier
To upgrade your [GitLab tier](https://about.gitlab.com/pricing/):
diff --git a/doc/topics/authentication/index.md b/doc/topics/authentication/index.md
index 8ca4247924b..8efa5afcb80 100644
--- a/doc/topics/authentication/index.md
+++ b/doc/topics/authentication/index.md
@@ -30,7 +30,6 @@ This page gathers all the resources for the topic **Authentication** in GitLab.
- **Integrations:**
- [OmniAuth](../../integration/omniauth.md)
- [Atlassian Crowd OmniAuth Provider](../../administration/auth/crowd.md)
- - [CAS OmniAuth Provider](../../integration/cas.md)
- [SAML OmniAuth Provider](../../integration/saml.md)
- [SAML for GitLab.com Groups](../../user/group/saml_sso/index.md)
- [SCIM user provisioning for GitLab.com Groups](../../user/group/saml_sso/scim_setup.md)
diff --git a/doc/user/ai_features.md b/doc/user/ai_features.md
index ff4163ca7e6..00db5a3dd5f 100644
--- a/doc/user/ai_features.md
+++ b/doc/user/ai_features.md
@@ -42,7 +42,7 @@ The following feature is Generally Available:
The following features are in Beta:
-- [Code Suggestions](project/repository/code_suggestions.md)
+- [Code Suggestions](project/repository/code_suggestions/index.md)
- [Explain this vulnerability](application_security/vulnerabilities/index.md#explaining-a-vulnerability)
## Experiment AI features
diff --git a/doc/user/clusters/cost_management.md b/doc/user/clusters/cost_management.md
deleted file mode 100644
index a155dcf4a3c..00000000000
--- a/doc/user/clusters/cost_management.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Deploy
-group: Environments
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../index.md'
----
-
-# Cluster cost management (removed) **(ULTIMATE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/user/clusters/integrations.md b/doc/user/clusters/integrations.md
deleted file mode 100644
index 0f389b94a33..00000000000
--- a/doc/user/clusters/integrations.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Deploy
-group: Environments
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../index.md'
----
-
-# Cluster integrations (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/user/clusters/management_project_template.md b/doc/user/clusters/management_project_template.md
index 442a4141893..a40fc5a262e 100644
--- a/doc/user/clusters/management_project_template.md
+++ b/doc/user/clusters/management_project_template.md
@@ -99,7 +99,6 @@ The [built-in supported applications](https://gitlab.com/gitlab-org/project-temp
- [Cert-manager](../infrastructure/clusters/manage/management_project_applications/certmanager.md)
- [GitLab Runner](../infrastructure/clusters/manage/management_project_applications/runner.md)
- [Ingress](../infrastructure/clusters/manage/management_project_applications/ingress.md)
-- [Prometheus](../../operations/metrics/index.md)
- [Vault](../infrastructure/clusters/manage/management_project_applications/vault.md)
Each application has an `applications/{app}/values.yaml` file.
diff --git a/doc/user/compliance/license_compliance/index.md b/doc/user/compliance/license_compliance/index.md
deleted file mode 100644
index 00578219016..00000000000
--- a/doc/user/compliance/license_compliance/index.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-type: reference, howto
-stage: Secure
-group: Composition Analysis
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../license_approval_policies.md'
----
-
-# License Compliance (removed) **(ULTIMATE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/387561) in GitLab 15.9
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/421363) in GitLab 16.3.
-Use [License Approval Policies](https://gitlab.com/groups/gitlab-org/-/epics/8092) instead.
diff --git a/doc/user/group/manage.md b/doc/user/group/manage.md
index 0ef71ad5fba..65190847b05 100644
--- a/doc/user/group/manage.md
+++ b/doc/user/group/manage.md
@@ -447,7 +447,7 @@ This feature is in [Beta](../../policy/experiment-beta-support.md#beta).
Beta users should read about the [known limitations](../project/repository/code_suggestions/index.md#known-limitations).
We look forward to hearing your [feedback](../project/repository/code_suggestions/index.md#feedback).
-You can give all users in a group and its subgroups access to [Code Suggestions](../project/repository/code_suggestions.md).
+You can give all users in a group and its subgroups access to [Code Suggestions](../project/repository/code_suggestions/index.md).
- This setting
[cascades to all projects](../project/merge_requests/approvals/settings.md#settings-cascading) in the group.
diff --git a/doc/user/infrastructure/clusters/index.md b/doc/user/infrastructure/clusters/index.md
index 1cdb1470344..cace9c66fcf 100644
--- a/doc/user/infrastructure/clusters/index.md
+++ b/doc/user/infrastructure/clusters/index.md
@@ -54,12 +54,9 @@ This feature flag re-enables the certificate-based Kubernetes integration.
- [GitLab-managed clusters](../../project/clusters/gitlab_managed_clusters.md)
- [Deploy applications through certificate-based connection](../../project/clusters/deploy_to_cluster.md)
- [Cluster Management Project](../../clusters/management_project.md)
-- [Cluster integrations](../../clusters/integrations.md)
-- [Cluster cost management](../../clusters/cost_management.md)
- [Cluster environments](../../clusters/environments.md)
- [Show Canary Ingress deployments on deploy boards](../../project/canary_deployments.md#show-canary-ingress-deployments-on-deploy-boards-deprecated)
- [Deploy Boards](../../project/deploy_boards.md)
-- [Clusters health](manage/clusters_health.md)
- [Web terminals](../../../administration/integration/terminal.md)
### Cluster levels
diff --git a/doc/user/infrastructure/clusters/manage/clusters_health.md b/doc/user/infrastructure/clusters/manage/clusters_health.md
deleted file mode 100644
index cf1b5585a0c..00000000000
--- a/doc/user/infrastructure/clusters/manage/clusters_health.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Deploy
-group: Environments
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../index.md'
----
-
-# Clusters health (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/user/markdown.md b/doc/user/markdown.md
index c724ae465b8..c996b29c9a2 100644
--- a/doc/user/markdown.md
+++ b/doc/user/markdown.md
@@ -691,11 +691,6 @@ To update the rendered references if the assignee, milestone, or health status c
edit the comment or description and save it.
For more information, see issue [420807](https://gitlab.com/gitlab-org/gitlab/-/issues/420807).
-### Embedding metrics
-
-Metric charts can be embedded in GitLab Flavored Markdown. Read
-[Embedding Metrics in GitLab flavored Markdown](../operations/metrics/embed.md) for more details.
-
### Embedding Observability dashboards
You can embed GitLab Observability UI dashboards descriptions and comments, for example in epics, issues, and MRs.
diff --git a/doc/user/permissions.md b/doc/user/permissions.md
index d7510f26e9a..5bc303f690f 100644
--- a/doc/user/permissions.md
+++ b/doc/user/permissions.md
@@ -132,9 +132,6 @@ The following table lists project permissions available for each role:
| [Merge requests](project/merge_requests/index.md):<br>[Resolve a thread](project/merge_requests/index.md#resolve-a-thread) | | | ✓ | ✓ | ✓ |
| [Merge requests](project/merge_requests/index.md):<br>Manage [merge approval rules](project/merge_requests/approvals/settings.md) (project settings) | | | | ✓ | ✓ |
| [Merge requests](project/merge_requests/index.md):<br>Delete | | | | | ✓ |
-| [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>Manage user-starred metrics dashboards (6) | ✓ | ✓ | ✓ | ✓ | ✓ |
-| [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>View metrics dashboard annotations | | ✓ | ✓ | ✓ | ✓ |
-| [Metrics dashboards](../operations/metrics/dashboards/index.md):<br>Create/edit/delete metrics dashboard annotations | | | ✓ | ✓ | ✓ |
| [Package registry](packages/index.md):<br>Pull a package | ✓ (1) | ✓ | ✓ | ✓ | ✓ |
| [Package registry](packages/index.md):<br>Publish a package | | | ✓ | ✓ | ✓ |
| [Package registry](packages/index.md):<br>Delete a package | | | | ✓ | ✓ |
diff --git a/doc/user/profile/service_accounts.md b/doc/user/profile/service_accounts.md
index 8bb9902d93a..8845ee55e14 100644
--- a/doc/user/profile/service_accounts.md
+++ b/doc/user/profile/service_accounts.md
@@ -22,6 +22,11 @@ A service account:
You should use service accounts in pipelines or integrations where credentials must be
set up and maintained without being impacted by changes in human user membership.
+You can authenticate as a service account with a [personal access token](personal_access_tokens.md).
+Service account users with a personal access token have the same abilities as a standard user.
+This includes interacting with [registries](../packages/index.md) and using the personal access
+token for [Git operations](personal_access_tokens.md#clone-repository-using-personal-access-token).
+
## Create a service account
The number of service accounts you can create is restricted by the number of service
@@ -50,10 +55,8 @@ Prerequisite:
The response includes the personal access token value.
-1. Use the returned personal access token value to authenticate with the GitLab API as the service account user.
-
-This service account user is provisioned by the top-level group, but is not yet a group member.
-You must [manually add the service account user to the group](#add-a-service-account-to-subgroup-or-project).
+1. Make this service account a group or project member by [manually adding the service account user to the group or project](#add-a-service-account-to-subgroup-or-project).
+1. Use the returned personal access token value to authenticate as the service account user.
### Self-managed GitLab
@@ -73,7 +76,9 @@ Prerequisite:
The response includes the personal access token value.
-1. Use the returned personal access token value to authenticate with the GitLab API as the service account user.
+1. Make this service account a group or project member by
+ [manually adding the service account user to the group or project](#add-a-service-account-to-subgroup-or-project).
+1. Use the returned personal access token value to authenticate as the service account user.
## Add a service account to subgroup or project
diff --git a/doc/user/project/import/phabricator.md b/doc/user/project/import/phabricator.md
deleted file mode 100644
index b316d469f0c..00000000000
--- a/doc/user/project/import/phabricator.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Manage
-group: Import and Integrate
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../../index.md'
----
-
-# Import Phabricator tasks into a GitLab project (removed) **(FREE SELF)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106369) in GitLab 15.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117649) in 16.0.
diff --git a/doc/user/project/integrations/prometheus.md b/doc/user/project/integrations/prometheus.md
deleted file mode 100644
index c0b2591d824..00000000000
--- a/doc/user/project/integrations/prometheus.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: 'index.md'
----
-
-# Prometheus (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/user/project/integrations/prometheus_library/cloudwatch.md b/doc/user/project/integrations/prometheus_library/cloudwatch.md
deleted file mode 100644
index e31f3b26e66..00000000000
--- a/doc/user/project/integrations/prometheus_library/cloudwatch.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../../../operations/index.md'
----
-
-# Monitoring AWS resources (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/user/project/integrations/prometheus_library/haproxy.md b/doc/user/project/integrations/prometheus_library/haproxy.md
deleted file mode 100644
index 4a0d324932b..00000000000
--- a/doc/user/project/integrations/prometheus_library/haproxy.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../../../operations/index.md'
----
-
-# Monitoring HAProxy (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/user/project/integrations/prometheus_library/index.md b/doc/user/project/integrations/prometheus_library/index.md
deleted file mode 100644
index 49345f41514..00000000000
--- a/doc/user/project/integrations/prometheus_library/index.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../../../operations/index.md'
----
-
-# Prometheus Metrics library (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/user/project/integrations/prometheus_library/kubernetes.md b/doc/user/project/integrations/prometheus_library/kubernetes.md
deleted file mode 100644
index f5bbaffa58e..00000000000
--- a/doc/user/project/integrations/prometheus_library/kubernetes.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../../../operations/index.md'
----
-
-# Monitoring Kubernetes (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/user/project/integrations/prometheus_library/nginx.md b/doc/user/project/integrations/prometheus_library/nginx.md
deleted file mode 100644
index e38f26710fc..00000000000
--- a/doc/user/project/integrations/prometheus_library/nginx.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../../../operations/index.md'
----
-
-# Monitoring NGINX (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/user/project/integrations/prometheus_library/nginx_ingress.md b/doc/user/project/integrations/prometheus_library/nginx_ingress.md
deleted file mode 100644
index 189cf59a514..00000000000
--- a/doc/user/project/integrations/prometheus_library/nginx_ingress.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../../../operations/index.md'
----
-
-# Monitoring NGINX Ingress Controller (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md b/doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md
deleted file mode 100644
index e4edd63314f..00000000000
--- a/doc/user/project/integrations/prometheus_library/nginx_ingress_vts.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-stage: Monitor
-group: Respond
-info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
-remove_date: '2023-08-22'
-redirect_to: '../../../../operations/index.md'
----
-
-# Monitoring NGINX Ingress Controller with VTS metrics (removed) **(FREE ALL)**
-
-This feature was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/346541) in GitLab 14.7
-and [removed](https://gitlab.com/gitlab-org/gitlab/-/issues/399231) in 16.0.
diff --git a/doc/user/project/repository/code_suggestions.md b/doc/user/project/repository/code_suggestions.md
deleted file mode 100644
index 8bcfcd0e5c2..00000000000
--- a/doc/user/project/repository/code_suggestions.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: 'code_suggestions/index.md'
-remove_date: '2021-11-25'
----
-
-This document was moved to [another location](code_suggestions/index.md).
-
-<!-- This redirect file can be deleted after <2021-11-25>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/project/web_ide_beta/index.md b/doc/user/project/web_ide_beta/index.md
deleted file mode 100644
index a4c733be376..00000000000
--- a/doc/user/project/web_ide_beta/index.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-redirect_to: '../web_ide/index.md'
-remove_date: '2023-08-22'
----
-
-This document was moved to [another location](../web_ide/index.md).
-
-<!-- This redirect file can be deleted after <2023-08-22>. -->
-<!-- Redirects that point to other docs in the same project expire in three months. -->
-<!-- Redirects that point to docs in a different project or site (for example, link is not relative and starts with `https:`) expire in one year. -->
-<!-- Before deletion, see: https://docs.gitlab.com/ee/development/documentation/redirects.html -->
diff --git a/doc/user/storage_management_automation.md b/doc/user/storage_management_automation.md
index 210aca4ee35..625c8e542d9 100644
--- a/doc/user/storage_management_automation.md
+++ b/doc/user/storage_management_automation.md
@@ -71,7 +71,7 @@ see [Efficient DevSecOps workflows: Hands-on `python-gitlab` API automation](htt
For more information about other API client libraries, see [Third-party clients](../api/rest/index.md#third-party-clients).
NOTE:
-Use [GitLab Duo Code Suggestions](project/repository/code_suggestions.md) to write code more efficiently.
+Use [GitLab Duo Code Suggestions](project/repository/code_suggestions/index.md) to write code more efficiently.
## Strategies for storage analysis
diff --git a/lib/gitlab/doorkeeper_secret_storing/token/unique_application_token.rb b/lib/gitlab/doorkeeper_secret_storing/token/unique_application_token.rb
new file mode 100644
index 00000000000..e2ad2544b6c
--- /dev/null
+++ b/lib/gitlab/doorkeeper_secret_storing/token/unique_application_token.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module DoorkeeperSecretStoring
+ module Token
+ class UniqueApplicationToken
+ # Acronym for 'GitLab OAuth Application Secret'
+ OAUTH_APPLICATION_SECRET_PREFIX_FORMAT = "gloas-%{token}"
+
+ # Maintains compatibility with ::Doorkeeper::OAuth::Helpers::UniqueToken
+ # Returns a secure random token, prefixed with a GitLab identifier.
+ def self.generate(*)
+ format(OAUTH_APPLICATION_SECRET_PREFIX_FORMAT, token: SecureRandom.hex(32))
+ end
+ end
+ end
+ end
+end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 5136b675680..f65a35d2697 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -1908,9 +1908,6 @@ msgstr ""
msgid "AI| %{link_start}How is my data used?%{link_end}"
msgstr ""
-msgid "AI| %{link_start}What are Experiment features?%{link_end}"
-msgstr ""
-
msgid "AI|%{tool} is %{transition} an answer"
msgstr ""
@@ -1947,15 +1944,9 @@ msgstr ""
msgid "AI|Description is required"
msgstr ""
-msgid "AI|Enabling these features is your acceptance of the %{link_start}GitLab Testing Agreement%{link_end}."
-msgstr ""
-
msgid "AI|Experiment"
msgstr ""
-msgid "AI|Experiment features"
-msgstr ""
-
msgid "AI|Explain the code from %{filePath} in human understandable language presented in Markdown format. In the response add neither original code snippet nor any title. `%{text}`. If it is not programming code, say `The selected text is not code. I am afraid this feature is for explaining code only. Would you like to ask a different question about the selected text?` and wait for another question."
msgstr ""
@@ -2031,9 +2022,6 @@ msgstr ""
msgid "AI|There is too much text in the chat. Please try again with a shorter text."
msgstr ""
-msgid "AI|These features can cause performance and stability issues and may change over time."
-msgstr ""
-
msgid "AI|Third-party AI services"
msgstr ""
@@ -2043,9 +2031,6 @@ msgstr ""
msgid "AI|Unhelpful"
msgstr ""
-msgid "AI|Use Experiment features"
-msgstr ""
-
msgid "AI|Use third-party AI services"
msgstr ""
@@ -2496,6 +2481,9 @@ msgstr ""
msgid "AccessDropdown|Groups"
msgstr ""
+msgid "AccessDropdown|No role"
+msgstr ""
+
msgid "AccessDropdown|Roles"
msgstr ""
@@ -5368,6 +5356,12 @@ msgstr ""
msgid "Analytics|Add a visualization"
msgstr ""
+msgid "Analytics|Add to dashboard"
+msgstr ""
+
+msgid "Analytics|Add visualization"
+msgstr ""
+
msgid "Analytics|Add visualizations"
msgstr ""
@@ -5395,6 +5389,9 @@ msgstr ""
msgid "Analytics|Cancel"
msgstr ""
+msgid "Analytics|Charts"
+msgstr ""
+
msgid "Analytics|Choose a chart type on the right"
msgstr ""
@@ -5524,15 +5521,15 @@ msgstr ""
msgid "Analytics|Select a measurement"
msgstr ""
-msgid "Analytics|Select a visualization from the sidebar to get started."
-msgstr ""
-
msgid "Analytics|Select a visualization type"
msgstr ""
msgid "Analytics|Single Statistic"
msgstr ""
+msgid "Analytics|Single stats"
+msgstr ""
+
msgid "Analytics|Something is wrong with your panel visualization configuration. See %{linkStart}troubleshooting documentation%{linkEnd}."
msgstr ""
@@ -5542,6 +5539,9 @@ msgstr ""
msgid "Analytics|Something went wrong."
msgstr ""
+msgid "Analytics|Tables"
+msgstr ""
+
msgid "Analytics|To create your own dashboards, first configure a project to store your dashboards."
msgstr ""
@@ -12280,9 +12280,6 @@ msgstr ""
msgid "ComplianceReport|No projects found that match filters"
msgstr ""
-msgid "ComplianceReport|No projects with standards adherence checks found"
-msgstr ""
-
msgid "ComplianceReport|No violations found"
msgstr ""
@@ -12316,6 +12313,9 @@ msgstr ""
msgid "ComplianceStandardsAdherence|At least two approvals"
msgstr ""
+msgid "ComplianceStandardsAdherence|Failure reason"
+msgstr ""
+
msgid "ComplianceStandardsAdherence|Have a valid rule that prevents author approved merge requests"
msgstr ""
@@ -12325,12 +12325,39 @@ msgstr ""
msgid "ComplianceStandardsAdherence|Have a valid rule that requires any merge request to have more than two approvals"
msgstr ""
+msgid "ComplianceStandardsAdherence|How to fix"
+msgstr ""
+
+msgid "ComplianceStandardsAdherence|Merge request approval rules"
+msgstr ""
+
+msgid "ComplianceStandardsAdherence|No projects with standards adherence checks found"
+msgstr ""
+
+msgid "ComplianceStandardsAdherence|No rule configured to prevent merge requests approved by committers."
+msgstr ""
+
+msgid "ComplianceStandardsAdherence|No rule is configured to prevent author approved merge requests."
+msgstr ""
+
+msgid "ComplianceStandardsAdherence|No rule is configured to require two approvals."
+msgstr ""
+
msgid "ComplianceStandardsAdherence|Prevent authors as approvers"
msgstr ""
msgid "ComplianceStandardsAdherence|Prevent committers as approvers"
msgstr ""
+msgid "ComplianceStandardsAdherence|Requirement"
+msgstr ""
+
+msgid "ComplianceStandardsAdherence|The following features help satisfy this requirement."
+msgstr ""
+
+msgid "ComplianceStandardsAdherence|Update approval settings in the project's merge request settings to satisfy this requirement."
+msgstr ""
+
msgid "ComplianceStandardsAdherence|View details"
msgstr ""
@@ -17242,6 +17269,9 @@ msgstr ""
msgid "Do not force push over diverged refs. After the mirror is created, this setting can only be modified using the API. %{mirroring_docs_link_start}Learn more about this option%{link_closing_tag} and %{mirroring_api_docs_link_start}the API.%{link_closing_tag}"
msgstr ""
+msgid "Do not include the username in the URL, use the username field below if required: %{code_open}https://gitlab.company.com/group/project.git%{code_close}."
+msgstr ""
+
msgid "Do you want to remove this deploy key?"
msgstr ""
@@ -22752,6 +22782,9 @@ msgstr ""
msgid "GroupSelect|Select a group"
msgstr ""
+msgid "GroupSettings| %{link_start}What are Experiment features?%{link_end}"
+msgstr ""
+
msgid "GroupSettings|After the instance reaches the user cap, any user who is added or requests access must be approved by an administrator. Leave empty for an unlimited user cap. If you change the user cap to unlimited, you must re-enable %{project_sharing_docs_link_start}project sharing%{link_end} and %{group_sharing_docs_link_start}group sharing%{link_end}."
msgstr ""
@@ -22824,6 +22857,12 @@ msgstr ""
msgid "GroupSettings|Enable overview background aggregation for Value Streams Dashboard"
msgstr ""
+msgid "GroupSettings|Enabling these features is your acceptance of the %{link_start}GitLab Testing Agreement%{link_end}."
+msgstr ""
+
+msgid "GroupSettings|Experiment features"
+msgstr ""
+
msgid "GroupSettings|Export group"
msgstr ""
@@ -22902,6 +22941,9 @@ msgstr ""
msgid "GroupSettings|There was a problem updating the pipeline settings: %{error_messages}."
msgstr ""
+msgid "GroupSettings|These features can cause performance and stability issues and may change over time."
+msgstr ""
+
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
msgstr ""
@@ -22914,6 +22956,9 @@ msgstr ""
msgid "GroupSettings|Transfer group"
msgstr ""
+msgid "GroupSettings|Use Experiment features"
+msgstr ""
+
msgid "GroupSettings|Users can create %{link_start_project}project access tokens%{link_end} and %{link_start_group}group access tokens%{link_end} in this group"
msgstr ""
@@ -24798,9 +24843,6 @@ msgstr ""
msgid "Include the name of the author of the issue, merge request or comment in the email body. By default, GitLab overrides the email sender's name. Some email servers don't support that option."
msgstr ""
-msgid "Include the username in the URL if required: %{code_open}https://username@gitlab.company.com/group/project.git%{code_close}."
-msgstr ""
-
msgid "Includes LFS objects. It can be overridden per group, or per project. Set to 0 for no limit."
msgstr ""
@@ -28384,6 +28426,9 @@ msgstr ""
msgid "Manage projects."
msgstr ""
+msgid "Manage rules"
+msgstr ""
+
msgid "Manage two-factor authentication"
msgstr ""
@@ -35672,9 +35717,6 @@ msgstr ""
msgid "ProductAnalytics|Compares page views of all pages against each other"
msgstr ""
-msgid "ProductAnalytics|Create a visualization"
-msgstr ""
-
msgid "ProductAnalytics|Creating your product analytics instance..."
msgstr ""
@@ -37652,9 +37694,6 @@ msgstr ""
msgid "PrometheusService|Monitor application health with Prometheus metrics and dashboards"
msgstr ""
-msgid "PrometheusService|More information"
-msgstr ""
-
msgid "PrometheusService|New metric"
msgstr ""
@@ -51513,6 +51552,9 @@ msgstr ""
msgid "Username (optional)"
msgstr ""
+msgid "Username and Password"
+msgstr ""
+
msgid "Username is already taken."
msgstr ""
diff --git a/qa/qa/page/project/pipeline/index.rb b/qa/qa/page/project/pipeline/index.rb
index 85ef81da91b..a1086794b1f 100644
--- a/qa/qa/page/project/pipeline/index.rb
+++ b/qa/qa/page/project/pipeline/index.rb
@@ -38,14 +38,16 @@ module QA
wait ||= Support::Repeater::DEFAULT_MAX_WAIT_TIME
finished_status = %w[passed failed canceled skipped manual]
- wait_until(max_duration: wait, reload: reload, sleep_interval: 1) do
+ wait_until(max_duration: wait, reload: reload, sleep_interval: 1, message: "Wait for latest pipeline") do
status ? latest_pipeline_status == status : finished_status.include?(latest_pipeline_status)
end
end
def has_any_pipeline?(wait: nil)
wait ||= Support::Repeater::DEFAULT_MAX_WAIT_TIME
- wait_until(max_duration: wait) { has_element?(:pipeline_row_container) }
+ wait_until(max_duration: wait, message: "Wait for any pipeline") do
+ has_element?(:pipeline_row_container)
+ end
end
def has_no_pipeline?
diff --git a/spec/controllers/oauth/applications_controller_spec.rb b/spec/controllers/oauth/applications_controller_spec.rb
index 5b9fd192ad4..44deeb6c47e 100644
--- a/spec/controllers/oauth/applications_controller_spec.rb
+++ b/spec/controllers/oauth/applications_controller_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Oauth::ApplicationsController do
+RSpec.describe Oauth::ApplicationsController, feature_category: :system_access do
let(:user) { create(:user) }
let(:application) { create(:oauth_application, owner: user) }
@@ -86,10 +86,10 @@ RSpec.describe Oauth::ApplicationsController do
it_behaves_like 'redirects to login page when the user is not signed in'
it_behaves_like 'redirects to 2fa setup page when the user requires it'
- it 'returns the secret in json format' do
+ it 'returns the prefixed secret in json format' do
subject
- expect(json_response['secret']).not_to be_nil
+ expect(json_response['secret']).to match(/gloas-\h{64}/)
end
context 'when renew fails' do
@@ -153,6 +153,15 @@ RSpec.describe Oauth::ApplicationsController do
expect(response).to render_template :show
end
+ context 'the secret' do
+ render_views
+
+ it 'is in the response' do
+ subject
+ expect(response.body).to match(/gloas-\h{64}/)
+ end
+ end
+
it 'redirects back to profile page if OAuth applications are disabled' do
disable_user_oauth
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index 04a83a1f6ab..fbd9c4d32cc 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -14,8 +14,7 @@ RSpec.describe 'Database schema', feature_category: :database do
# but in Search::NamespaceIndexAssignment model, only `search_index_id` is used as foreign key and indexed
search_namespace_index_assignments: [%w[search_index_id index_type]],
slack_integrations_scopes: [%w[slack_api_scope_id]],
- notes: %w[namespace_id], # this index is added in an async manner, hence it needs to be ignored in the first phase.
- vulnerabilities: [%w[finding_id]] # index will be created in https://gitlab.com/gitlab-org/gitlab/-/issues/423541
+ notes: %w[namespace_id] # this index is added in an async manner, hence it needs to be ignored in the first phase.
}.with_indifferent_access.freeze
TABLE_PARTITIONS = %w[ci_builds_metadata].freeze
diff --git a/spec/finders/groups/accepting_group_transfers_finder_spec.rb b/spec/finders/groups/accepting_group_transfers_finder_spec.rb
index 2a61150acf9..5c78ec3124b 100644
--- a/spec/finders/groups/accepting_group_transfers_finder_spec.rb
+++ b/spec/finders/groups/accepting_group_transfers_finder_spec.rb
@@ -137,18 +137,6 @@ RSpec.describe Groups::AcceptingGroupTransfersFinder, feature_category: :groups_
expect(result.first).to eq(great_grandparent_group)
expect(result[1..]).to match_array(other_groups)
end
-
- context 'when exact_matches_first_group_transfer feature flag is disabled' do
- let(:expected_groups) { other_groups + [great_grandparent_group] }
-
- before do
- stub_feature_flags(exact_matches_first_group_transfer: false)
- end
-
- it 'returns matching groups sorted by namespace path' do
- expect(result).to match_array(expected_groups.sort_by(&:path))
- end
- end
end
end
end
diff --git a/spec/frontend/boards/board_card_inner_spec.js b/spec/frontend/boards/board_card_inner_spec.js
index 1740676161f..95b5712bab0 100644
--- a/spec/frontend/boards/board_card_inner_spec.js
+++ b/spec/frontend/boards/board_card_inner_spec.js
@@ -91,6 +91,7 @@ describe('Board card component', () => {
rootPath: '/',
scopedLabelsAvailable: false,
isEpicBoard,
+ allowSubEpics: isEpicBoard,
issuableType: TYPE_ISSUE,
isGroupBoard,
isApolloBoard: false,
diff --git a/spec/frontend/boards/components/board_card_spec.js b/spec/frontend/boards/components/board_card_spec.js
index 167efb94fcc..f0d40af94fe 100644
--- a/spec/frontend/boards/components/board_card_spec.js
+++ b/spec/frontend/boards/components/board_card_spec.js
@@ -72,6 +72,7 @@ describe('Board card', () => {
issuableType: 'issue',
isGroupBoard: true,
disabled: false,
+ allowSubEpics: false,
isApolloBoard: false,
...provide,
},
diff --git a/spec/frontend/boards/components/sidebar/board_sidebar_title_spec.js b/spec/frontend/boards/components/sidebar/board_sidebar_title_spec.js
index 1b526e6fbec..f354067e226 100644
--- a/spec/frontend/boards/components/sidebar/board_sidebar_title_spec.js
+++ b/spec/frontend/boards/components/sidebar/board_sidebar_title_spec.js
@@ -8,6 +8,7 @@ import BoardEditableItem from '~/boards/components/sidebar/board_editable_item.v
import BoardSidebarTitle from '~/boards/components/sidebar/board_sidebar_title.vue';
import { createStore } from '~/boards/stores';
import issueSetTitleMutation from '~/boards/graphql/issue_set_title.mutation.graphql';
+import * as cacheUpdates from '~/boards/graphql/cache_updates';
import updateEpicTitleMutation from '~/sidebar/queries/update_epic_title.mutation.graphql';
import { updateIssueTitleResponse, updateEpicTitleResponse } from '../../mock_data';
@@ -40,6 +41,10 @@ describe('BoardSidebarTitle', () => {
.fn()
.mockResolvedValue(updateEpicTitleResponse);
+ beforeEach(() => {
+ cacheUpdates.setError = jest.fn();
+ });
+
afterEach(() => {
localStorage.clear();
store = null;
@@ -207,8 +212,7 @@ describe('BoardSidebarTitle', () => {
it('collapses sidebar and renders former item title', () => {
expect(findCollapsed().isVisible()).toBe(true);
expect(findTitle().text()).toContain(TEST_ISSUE_B.title);
- expect(storeDispatch).toHaveBeenCalledWith(
- 'setError',
+ expect(cacheUpdates.setError).toHaveBeenCalledWith(
expect.objectContaining({ message: 'An error occurred when updating the title' }),
);
});
diff --git a/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js b/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js
index ad20d7682ed..bc77b7b89dd 100644
--- a/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js
+++ b/spec/frontend/ci/runner/components/cells/runner_summary_cell_spec.js
@@ -13,7 +13,6 @@ import {
INSTANCE_TYPE,
I18N_INSTANCE_TYPE,
PROJECT_TYPE,
- I18N_NO_DESCRIPTION,
I18N_CREATED_AT_LABEL,
I18N_CREATED_AT_BY_LABEL,
} from '~/ci/runner/constants';
@@ -102,15 +101,6 @@ describe('RunnerTypeCell', () => {
it('Displays the runner description', () => {
expect(wrapper.text()).toContain(mockRunner.description);
- expect(wrapper.findByText(I18N_NO_DESCRIPTION).exists()).toBe(false);
- });
-
- it('Displays "No description" for missing runner description', () => {
- createComponent({
- runner: { description: null },
- });
-
- expect(wrapper.findByText(I18N_NO_DESCRIPTION).classes()).toContain('gl-text-secondary');
});
it('Displays last contact', () => {
diff --git a/spec/frontend/lib/utils/array_utility_spec.js b/spec/frontend/lib/utils/array_utility_spec.js
index 64ddd400114..94461c72106 100644
--- a/spec/frontend/lib/utils/array_utility_spec.js
+++ b/spec/frontend/lib/utils/array_utility_spec.js
@@ -42,4 +42,40 @@ describe('array_utility', () => {
expect(arrayUtils.getDuplicateItemsFromArray(array)).toEqual(result);
});
});
+
+ describe('toggleArrayItem', () => {
+ it('adds an item to the array if it does not exist', () => {
+ expect(arrayUtils.toggleArrayItem([], 'item')).toStrictEqual(['item']);
+ });
+
+ it('removes an item from the array if it already exists', () => {
+ expect(arrayUtils.toggleArrayItem(['item'], 'item')).toStrictEqual([]);
+ });
+
+ describe('pass by value', () => {
+ it('does not toggle the array item when passed a new object', () => {
+ expect(arrayUtils.toggleArrayItem([{ a: 1 }], { a: 1 })).toStrictEqual([
+ { a: 1 },
+ { a: 1 },
+ ]);
+ });
+
+ it('does not toggle the array item when passed a new array', () => {
+ expect(arrayUtils.toggleArrayItem([[1]], [1])).toStrictEqual([[1], [1]]);
+ });
+ });
+
+ describe('pass by reference', () => {
+ const array = [1];
+ const object = { a: 1 };
+
+ it('toggles the array item when passed a object reference', () => {
+ expect(arrayUtils.toggleArrayItem([object], object)).toStrictEqual([]);
+ });
+
+ it('toggles the array item when passed an array reference', () => {
+ expect(arrayUtils.toggleArrayItem([array], array)).toStrictEqual([]);
+ });
+ });
+ });
});
diff --git a/spec/frontend/lib/utils/secret_detection_spec.js b/spec/frontend/lib/utils/secret_detection_spec.js
index 3213ecf3fe1..761062f0340 100644
--- a/spec/frontend/lib/utils/secret_detection_spec.js
+++ b/spec/frontend/lib/utils/secret_detection_spec.js
@@ -28,6 +28,7 @@ describe('containsSensitiveToken', () => {
'token: feed_token=ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'token: feed_token=glft-ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'token: feed_token=glft-a8cc74ccb0de004d09a968705ba49099229b288b3de43f26c473a9d8d7fb7693-1234',
+ 'token: gloas-a8cc74ccb0de004d09a968705ba49099229b288b3de43f26c473a9d8d7fb7693',
'https://example.com/feed?feed_token=123456789_abcdefghij',
'glpat-1234567890 and feed_token=ABCDEFGHIJKLMNOPQRSTUVWXYZ',
];
diff --git a/spec/frontend/projects/settings/components/new_access_dropdown_spec.js b/spec/frontend/projects/settings/components/new_access_dropdown_spec.js
index 2bce933cc0f..0ed2e51e8c3 100644
--- a/spec/frontend/projects/settings/components/new_access_dropdown_spec.js
+++ b/spec/frontend/projects/settings/components/new_access_dropdown_spec.js
@@ -62,6 +62,10 @@ describe('Access Level Dropdown', () => {
id: 3,
text: 'role3',
},
+ {
+ id: 0,
+ text: 'No one',
+ },
];
const createComponent = ({
@@ -139,7 +143,7 @@ describe('Access Level Dropdown', () => {
});
it('renders dropdown item for each access level type', () => {
- expect(findAllDropdownItems()).toHaveLength(12);
+ expect(findAllDropdownItems()).toHaveLength(13);
});
it.each`
@@ -184,12 +188,12 @@ describe('Access Level Dropdown', () => {
expect(findDropdown().props('toggleClass')[defaultToggleClass]).toBe(true);
});
- it('displays a number of selected items for each group level', async () => {
+ it('displays selected items for each group level', async () => {
dropdownItems.wrappers.forEach((item) => {
item.trigger('click');
});
await nextTick();
- expect(findDropdownToggleLabel()).toBe('3 roles, 3 users, 3 deploy keys, 3 groups');
+ expect(findDropdownToggleLabel()).toBe('No role, 3 users, 3 deploy keys, 3 groups');
});
it('with only role selected displays the role name and has no class applied', async () => {
diff --git a/spec/frontend/silent_mode_settings/components/app_spec.js b/spec/frontend/silent_mode_settings/components/app_spec.js
index dfa2b1bfcbb..5997bfd1b5f 100644
--- a/spec/frontend/silent_mode_settings/components/app_spec.js
+++ b/spec/frontend/silent_mode_settings/components/app_spec.js
@@ -1,4 +1,4 @@
-import { GlToggle } from '@gitlab/ui';
+import { GlToggle, GlBadge } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import waitForPromises from 'helpers/wait_for_promises';
import { createAlert } from '~/alert';
@@ -29,8 +29,19 @@ describe('SilentModeSettingsApp', () => {
};
const findGlToggle = () => wrapper.findComponent(GlToggle);
+ const findGlBadge = () => wrapper.findComponent(GlBadge);
describe('template', () => {
+ describe('experiment badge', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders properly', () => {
+ expect(findGlBadge().exists()).toBe(true);
+ });
+ });
+
describe('when silent mode is already enabled', () => {
beforeEach(() => {
createComponent({ isSilentModeEnabled: true });
diff --git a/spec/frontend/snippets/components/embed_dropdown_spec.js b/spec/frontend/snippets/components/embed_dropdown_spec.js
index d8c6ad3278a..cb9b9800bfe 100644
--- a/spec/frontend/snippets/components/embed_dropdown_spec.js
+++ b/spec/frontend/snippets/components/embed_dropdown_spec.js
@@ -1,6 +1,6 @@
import { GlFormInputGroup } from '@gitlab/ui';
-import { mount } from '@vue/test-utils';
import { escape as esc } from 'lodash';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { TEST_HOST } from 'helpers/test_constants';
import EmbedDropdown from '~/snippets/components/embed_dropdown.vue';
@@ -10,56 +10,24 @@ describe('snippets/components/embed_dropdown', () => {
let wrapper;
const createComponent = () => {
- wrapper = mount(EmbedDropdown, {
+ wrapper = shallowMountExtended(EmbedDropdown, {
propsData: {
url: TEST_URL,
},
});
};
- const findSectionsData = () => {
- const sections = [];
- let current = {};
-
- wrapper.findAll('[data-testid="header"],[data-testid="input"]').wrappers.forEach((x) => {
- const type = x.attributes('data-testid');
-
- if (type === 'header') {
- current = {
- header: x.text(),
- };
-
- sections.push(current);
- } else {
- const value = x.findComponent(GlFormInputGroup).props('value');
- const copyValue = x.find('button[title="Copy"]').attributes('data-clipboard-text');
-
- Object.assign(current, {
- value,
- copyValue,
- });
- }
- });
-
- return sections;
- };
+ const findEmbedSection = () => wrapper.findByTestId('section-Embed');
+ const findShareSection = () => wrapper.findByTestId('section-Share');
it('renders dropdown items', () => {
createComponent();
const embedValue = `<script src="${esc(TEST_URL)}.js"></script>`;
- expect(findSectionsData()).toEqual([
- {
- header: 'Embed',
- value: embedValue,
- copyValue: embedValue,
- },
- {
- header: 'Share',
- value: TEST_URL,
- copyValue: TEST_URL,
- },
- ]);
+ expect(findEmbedSection().text()).toBe('Embed');
+ expect(findShareSection().text()).toBe('Share');
+ expect(findEmbedSection().findComponent(GlFormInputGroup).attributes('value')).toBe(embedValue);
+ expect(findShareSection().findComponent(GlFormInputGroup).attributes('value')).toBe(TEST_URL);
});
});
diff --git a/spec/graphql/types/project_type_spec.rb b/spec/graphql/types/project_type_spec.rb
index cd9a0642ae6..a20a4767bb5 100644
--- a/spec/graphql/types/project_type_spec.rb
+++ b/spec/graphql/types/project_type_spec.rb
@@ -892,22 +892,25 @@ RSpec.describe GitlabSchema.types['Project'] do
subject { GitlabSchema.execute(query, context: { current_user: user }).as_json }
- before do
+ before_all do
fork_reporter.add_reporter(user)
fork_developer.add_developer(user)
fork_group_developer.group.add_developer(user)
+ fork_private.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
end
it 'contains all forks' do
- expect(forks.count).to eq(5)
+ expect(forks.count).to eq(4)
end
context 'with minimum_access_level DEVELOPER' do
let(:minimum_access_level) { '(minimumAccessLevel: DEVELOPER)' }
it 'contains forks with developer access' do
- expect(forks).to contain_exactly(a_hash_including('fullPath' => fork_developer.full_path),
-a_hash_including('fullPath' => fork_group_developer.full_path))
+ expect(forks).to contain_exactly(
+ a_hash_including('fullPath' => fork_developer.full_path),
+ a_hash_including('fullPath' => fork_group_developer.full_path)
+ )
end
context 'when current user is not set' do
diff --git a/spec/models/concerns/transitionable_spec.rb b/spec/models/concerns/transitionable_spec.rb
index a1f011ff72e..b80d363ef78 100644
--- a/spec/models/concerns/transitionable_spec.rb
+++ b/spec/models/concerns/transitionable_spec.rb
@@ -3,6 +3,8 @@
require 'spec_helper'
RSpec.describe Transitionable, feature_category: :code_review_workflow do
+ using RSpec::Parameterized::TableSyntax
+
let(:klass) do
Class.new do
include Transitionable
@@ -19,24 +21,20 @@ RSpec.describe Transitionable, feature_category: :code_review_workflow do
let(:object) { klass.new(transitioning) }
- describe 'For a class' do
- using RSpec::Parameterized::TableSyntax
+ describe '#transitioning?' do
+ where(:transitioning, :feature_flag, :result) do
+ true | true | true
+ false | false | false
+ true | false | false
+ false | true | false
+ end
- describe '#transitioning?' do
- where(:transitioning, :feature_flag, :result) do
- true | true | true
- false | false | false
- true | false | false
- false | true | false
+ with_them do
+ before do
+ stub_feature_flags(skip_validations_during_transitions: feature_flag)
end
- with_them do
- before do
- stub_feature_flags(skip_validations_during_transitions: feature_flag)
- end
-
- it { expect(object.transitioning?).to eq(result) }
- end
+ it { expect(object.transitioning?).to eq(result) }
end
end
end
diff --git a/spec/models/doorkeeper/application_spec.rb b/spec/models/doorkeeper/application_spec.rb
new file mode 100644
index 00000000000..85b28346dfa
--- /dev/null
+++ b/spec/models/doorkeeper/application_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Doorkeeper::Application, type: :model, feature_category: :system_access do
+ let(:application) { create(:oauth_application) }
+
+ it 'uses a prefixed secret' do
+ expect(application.plaintext_secret).to match(/gloas-\h{64}/)
+ end
+end
diff --git a/spec/models/oauth_access_token_spec.rb b/spec/models/oauth_access_token_spec.rb
index b21a2bf2079..55c82369f33 100644
--- a/spec/models/oauth_access_token_spec.rb
+++ b/spec/models/oauth_access_token_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe OauthAccessToken do
+RSpec.describe OauthAccessToken, feature_category: :system_access do
let(:app_one) { create(:oauth_application) }
let(:app_two) { create(:oauth_application) }
let(:app_three) { create(:oauth_application) }
@@ -23,6 +23,10 @@ RSpec.describe OauthAccessToken do
end
describe 'Doorkeeper secret storing' do
+ it 'does not have a prefix' do
+ expect(token.plaintext_token).not_to start_with('gl')
+ end
+
it 'stores the token in hashed format' do
expect(token.token).not_to eq(token.plaintext_token)
end
diff --git a/spec/models/pages_deployment_spec.rb b/spec/models/pages_deployment_spec.rb
index bff69485e43..916197fe5e9 100644
--- a/spec/models/pages_deployment_spec.rb
+++ b/spec/models/pages_deployment_spec.rb
@@ -81,6 +81,57 @@ RSpec.describe PagesDeployment, feature_category: :pages do
end
end
+ describe '.deactivate_deployments_older_than', :freeze_time do
+ let!(:other_project_deployment) do
+ create(:pages_deployment)
+ end
+
+ let!(:other_path_prefix_deployment) do
+ create(:pages_deployment, project: project, path_prefix: 'other')
+ end
+
+ let!(:deactivated_deployment) do
+ create(:pages_deployment, project: project, deleted_at: 5.minutes.ago)
+ end
+
+ it 'updates only older deployments for the same project and path prefix' do
+ deployment1 = create(:pages_deployment, project: project, updated_at: 5.minutes.ago)
+ deployment2 = create(:pages_deployment, project: project, updated_at: 5.minutes.ago)
+ deployment3 = create(:pages_deployment, project: project, updated_at: 5.minutes.ago)
+
+ expect { described_class.deactivate_deployments_older_than(deployment2) }
+ .to change { deployment1.reload.deleted_at }
+ .from(nil).to(Time.zone.now)
+ .and change { deployment1.reload.updated_at }
+ .to(Time.zone.now)
+
+ expect(deployment2.reload.deleted_at).to be_nil
+ expect(deployment3.reload.deleted_at).to be_nil
+ expect(other_project_deployment.deleted_at).to be_nil
+ expect(other_path_prefix_deployment.reload.deleted_at).to be_nil
+ expect(deactivated_deployment.reload.deleted_at).to eq(5.minutes.ago)
+ end
+
+ it 'updates only older deployments for the same project with the given time' do
+ deployment1 = create(:pages_deployment, project: project, updated_at: 5.minutes.ago)
+ deployment2 = create(:pages_deployment, project: project, updated_at: 5.minutes.ago)
+ deployment3 = create(:pages_deployment, project: project, updated_at: 5.minutes.ago)
+ time = 30.minutes.from_now
+
+ expect { described_class.deactivate_deployments_older_than(deployment2, time: time) }
+ .to change { deployment1.reload.deleted_at }
+ .from(nil).to(time)
+ .and change { deployment1.reload.updated_at }
+ .to(Time.zone.now)
+
+ expect(deployment2.reload.deleted_at).to be_nil
+ expect(deployment3.reload.deleted_at).to be_nil
+ expect(other_project_deployment.deleted_at).to be_nil
+ expect(other_path_prefix_deployment.reload.deleted_at).to be_nil
+ expect(deactivated_deployment.reload.deleted_at).to eq(5.minutes.ago)
+ end
+ end
+
describe '#migrated?' do
it 'returns false for normal deployment' do
deployment = create(:pages_deployment)
diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb
index a250be0c94f..6c767876d05 100644
--- a/spec/services/projects/update_pages_service_spec.rb
+++ b/spec/services/projects/update_pages_service_spec.rb
@@ -282,27 +282,28 @@ RSpec.describe Projects::UpdatePagesService, feature_category: :pages do
end
end
- shared_examples 'successfully deploys' do
- it 'succeeds' do
- expect do
- expect(service.execute[:status]).to eq(:success)
- end.to change { project.pages_deployments.count }.by(1)
+ it 'creates a new pages deployment and mark it as deployed' do
+ expect do
+ expect(service.execute[:status]).to eq(:success)
+ end.to change { project.pages_deployments.count }.by(1)
- deployment = project.pages_deployments.last
- expect(deployment.ci_build_id).to eq(build.id)
- end
+ deployment = project.pages_deployments.last
+ expect(deployment.ci_build_id).to eq(build.id)
end
- include_examples 'successfully deploys'
-
context 'when old deployment present' do
+ let!(:old_build) { create(:ci_build, name: 'pages', pipeline: old_pipeline, ref: 'HEAD') }
+ let!(:old_deployment) { create(:pages_deployment, ci_build: old_build, project: project) }
+
before do
- old_build = create(:ci_build, name: 'pages', pipeline: old_pipeline, ref: 'HEAD')
- old_deployment = create(:pages_deployment, ci_build: old_build, project: project)
project.update_pages_deployment!(old_deployment)
end
- include_examples 'successfully deploys'
+ it 'deactivates old deployments' do
+ expect(service.execute[:status]).to eq(:success)
+
+ expect(old_deployment.reload.deleted_at).not_to be_nil
+ end
end
context 'when newer deployment present' do