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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab/CODEOWNERS151
-rw-r--r--.gitlab/ci/caching.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/dev-fixtures.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/docs.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/frontend.gitlab-ci.yml4
-rw-r--r--.gitlab/ci/global.gitlab-ci.yml4
-rw-r--r--.gitlab/ci/graphql.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/memory.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/qa-common/main.gitlab-ci.yml3
-rw-r--r--.gitlab/ci/rails/shared.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/setup.gitlab-ci.yml2
-rw-r--r--.gitlab/ci/test-on-gdk/main.gitlab-ci.yml3
-rw-r--r--.gitlab/issue_templates/Design Sprint.md32
-rw-r--r--.gitlab/issue_templates/Documentation.md2
-rw-r--r--.gitlab/issue_templates/Feature Proposal - lean.md32
-rw-r--r--.gitlab/issue_templates/Feature proposal - detailed.md34
-rw-r--r--.gitlab/issue_templates/Fulfillment Group UX Issue.md32
-rw-r--r--.gitlab/issue_templates/Problem Validation.md2
-rw-r--r--Gemfile2
-rw-r--r--Gemfile.checksum6
-rw-r--r--Gemfile.lock4
-rw-r--r--app/assets/javascripts/analytics/cycle_analytics/components/value_stream_filters.vue1
-rw-r--r--app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue11
-rw-r--r--app/assets/javascripts/ci/artifacts/components/job_artifacts_table.vue10
-rw-r--r--app/assets/javascripts/ci/artifacts/constants.js1
-rw-r--r--app/assets/javascripts/ci/artifacts/utils.js5
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/constants.js5
-rw-r--r--app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index.vue2
-rw-r--r--app/assets/javascripts/whats_new/components/app.vue5
-rw-r--r--app/assets/javascripts/whats_new/utils/notification.js2
-rw-r--r--app/assets/javascripts/work_items/components/work_item_detail.vue40
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_children_wrapper.vue64
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue36
-rw-r--r--app/assets/javascripts/work_items/components/work_item_links/work_item_tree.vue10
-rw-r--r--app/helpers/search_helper.rb9
-rw-r--r--app/models/release_highlight.rb16
-rw-r--r--app/services/concerns/search/filter.rb2
-rw-r--r--app/services/jira_connect_installations/update_service.rb2
-rw-r--r--app/services/search/global_service.rb2
-rw-r--r--app/views/admin/application_settings/_signin.html.haml2
-rw-r--r--app/views/admin/sessions/two_factor.html.haml2
-rw-r--r--app/views/devise/sessions/two_factor.html.haml2
-rw-r--r--doc/api/graphql/reference/index.md38
-rw-r--r--doc/api/merge_requests.md2
-rw-r--r--doc/architecture/blueprints/cells/index.md27
-rw-r--r--doc/ci/pipelines/pipeline_artifacts.md29
-rw-r--r--doc/ci/runners/saas/linux_saas_runner.md5
-rw-r--r--doc/ci/testing/test_coverage_visualization.md7
-rw-r--r--doc/ci/yaml/index.md4
-rw-r--r--doc/development/ai_features.md19
-rw-r--r--doc/development/code_review.md6
-rw-r--r--doc/development/pipelines/internals.md2
-rw-r--r--doc/development/pipelines/performance.md1
-rw-r--r--doc/integration/jira/configure.md6
-rw-r--r--doc/integration/jira/connect-app.md9
-rw-r--r--doc/integration/jira/dvcs/index.md13
-rw-r--r--doc/integration/jira/jira_server_configuration.md77
-rw-r--r--doc/topics/offline/quick_start_guide.md2
-rw-r--r--doc/tutorials/develop.md5
-rw-r--r--doc/user/search/index.md8
-rw-r--r--lib/gitlab/search_results.rb4
-rw-r--r--lib/gitlab/usage_data.rb10
-rw-r--r--lib/tasks/gitlab/tw/codeowners.rake2
-rw-r--r--locale/gitlab.pot26
-rw-r--r--spec/controllers/admin/application_settings_controller_spec.rb2
-rw-r--r--spec/controllers/admin/instance_review_controller_spec.rb2
-rw-r--r--spec/controllers/search_controller_spec.rb1
-rw-r--r--spec/features/admin/admin_settings_spec.rb2
-rw-r--r--spec/features/boards/sidebar_assignee_spec.rb2
-rw-r--r--spec/features/issues/user_creates_branch_and_merge_request_spec.rb2
-rw-r--r--spec/features/users/signup_spec.rb2
-rw-r--r--spec/frontend/ci/artifacts/components/job_artifacts_table_spec.js32
-rw-r--r--spec/frontend/fixtures/static/whats_new_notification.html1
-rw-r--r--spec/frontend/whats_new/components/app_spec.js194
-rw-r--r--spec/frontend/whats_new/utils/notification_spec.js15
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_children_wrapper_spec.js76
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_links_spec.js64
-rw-r--r--spec/frontend/work_items/components/work_item_links/work_item_tree_spec.js12
-rw-r--r--spec/helpers/search_helper_spec.rb28
-rw-r--r--spec/lib/gitlab/group_search_results_spec.rb15
-rw-r--r--spec/lib/gitlab/search_results_spec.rb15
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb8
-rw-r--r--spec/models/release_highlight_spec.rb42
-rw-r--r--spec/requests/api/usage_data_non_sql_metrics_spec.rb2
-rw-r--r--spec/requests/api/usage_data_queries_spec.rb2
-rw-r--r--spec/requests/jira_connect/installations_controller_spec.rb10
-rw-r--r--spec/services/jira_connect_installations/update_service_spec.rb12
-rw-r--r--spec/services/search/global_service_spec.rb21
-rw-r--r--spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb3
-rw-r--r--spec/support/shared_examples/lib/gitlab/search_archived_filter_shared_examples.rb30
-rw-r--r--spec/support/shared_examples/services/service_ping/complete_service_ping_payload_shared_examples.rb2
-rw-r--r--spec/tasks/gitlab/usage_data_rake_spec.rb2
-rw-r--r--vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml8
-rw-r--r--vendor/gems/omniauth-gitlab/.gitlab-ci.yml8
-rw-r--r--vendor/gems/omniauth-google-oauth2/examples/Gemfile.lock72
-rw-r--r--vendor/gems/omniauth-salesforce/.gitlab-ci.yml8
-rw-r--r--vendor/gems/omniauth-salesforce/Gemfile.lock23
-rwxr-xr-xvendor/gems/omniauth-salesforce/omniauth-salesforce.gemspec2
98 files changed, 887 insertions, 689 deletions
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index 6a494d30c70..7a45d32b666 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -414,7 +414,7 @@ lib/gitlab/checks/**
/doc/administration/file_hooks.md @eread @ashrafkhamis
/doc/administration/geo/ @axil
/doc/administration/get_started.md @kpaizee
-/doc/administration/git_protocol.md @aqualls
+/doc/administration/git_protocol.md @aqualls @msedlakjakubowski
/doc/administration/gitaly/ @eread
/doc/administration/housekeeping.md @eread
/doc/administration/inactive_project_deletion.md @eread
@@ -423,19 +423,19 @@ lib/gitlab/checks/**
/doc/administration/instance_limits.md @axil
/doc/administration/integration/kroki.md @msedlakjakubowski
/doc/administration/integration/mailgun.md @msedlakjakubowski
-/doc/administration/integration/plantuml.md @aqualls
+/doc/administration/integration/plantuml.md @aqualls @msedlakjakubowski
/doc/administration/integration/terminal.md @phillipwells
/doc/administration/invalidate_markdown_cache.md @msedlakjakubowski
/doc/administration/issue_closing_pattern.md @aqualls
/doc/administration/job_artifacts.md @marcel.amirault
/doc/administration/job_logs.md @fneill
-/doc/administration/lfs/ @aqualls
+/doc/administration/lfs/ @aqualls @msedlakjakubowski
/doc/administration/libravatar.md @axil
/doc/administration/load_balancer.md @axil
/doc/administration/logs/ @axil
/doc/administration/logs/index.md @msedlakjakubowski
/doc/administration/maintenance_mode/ @axil
-/doc/administration/merge_request_diffs.md @aqualls
+/doc/administration/merge_request_diffs.md @aqualls @msedlakjakubowski
/doc/administration/monitoring/github_imports.md @eread @ashrafkhamis
/doc/administration/monitoring/index.md @msedlakjakubowski
/doc/administration/monitoring/ip_allowlist.md @jglassman1
@@ -452,8 +452,8 @@ lib/gitlab/checks/**
/doc/administration/nfs.md @axil
/doc/administration/object_storage.md @axil
/doc/administration/operations/ @axil
-/doc/administration/operations/fast_ssh_key_lookup.md @aqualls
-/doc/administration/operations/gitlab_sshd.md @aqualls
+/doc/administration/operations/fast_ssh_key_lookup.md @aqualls @msedlakjakubowski
+/doc/administration/operations/gitlab_sshd.md @aqualls @msedlakjakubowski
/doc/administration/operations/moving_repositories.md @eread
/doc/administration/package_information/ @axil
/doc/administration/packages/ @marcel.amirault
@@ -477,7 +477,7 @@ lib/gitlab/checks/**
/doc/administration/sidekiq/sidekiq_memory_killer.md @jglassman1
/doc/administration/silent_mode/ @axil
/doc/administration/smime_signing_email.md @axil
-/doc/administration/snippets/ @aqualls
+/doc/administration/snippets/ @aqualls @msedlakjakubowski
/doc/administration/static_objects_external_storage.md @ashrafkhamis
/doc/administration/system_hooks.md @eread @ashrafkhamis
/doc/administration/terraform_state.md @phillipwells
@@ -496,10 +496,10 @@ lib/gitlab/checks/**
/doc/api/avatar.md @jglassman1
/doc/api/award_emoji.md @msedlakjakubowski
/doc/api/boards.md @msedlakjakubowski
-/doc/api/branches.md @aqualls
+/doc/api/branches.md @aqualls @msedlakjakubowski
/doc/api/bulk_imports.md @eread @ashrafkhamis
/doc/api/cluster_agents.md @phillipwells
-/doc/api/commits.md @aqualls
+/doc/api/commits.md @aqualls @msedlakjakubowski
/doc/api/container_registry.md @marcel.amirault
/doc/api/custom_attributes.md @msedlakjakubowski
/doc/api/dependencies.md @rdickenson
@@ -507,7 +507,7 @@ lib/gitlab/checks/**
/doc/api/deploy_keys.md @phillipwells
/doc/api/deploy_tokens.md @phillipwells
/doc/api/deployments.md @phillipwells
-/doc/api/discussions.md @aqualls
+/doc/api/discussions.md @aqualls @msedlakjakubowski
/doc/api/dora/ @lciutacu
/doc/api/draft_notes.md @aqualls
/doc/api/environments.md @phillipwells
@@ -522,7 +522,7 @@ lib/gitlab/checks/**
/doc/api/geo_nodes.md @axil
/doc/api/geo_sites.md @axil
/doc/api/graphql/audit_report.md @eread
-/doc/api/graphql/branch_rules.md @aqualls
+/doc/api/graphql/branch_rules.md @aqualls @msedlakjakubowski
/doc/api/graphql/custom_emoji.md @msedlakjakubowski
/doc/api/graphql/getting_started.md @eread @ashrafkhamis
/doc/api/graphql/index.md @eread @ashrafkhamis
@@ -541,7 +541,7 @@ lib/gitlab/checks/**
/doc/api/group_labels.md @msedlakjakubowski
/doc/api/group_level_variables.md @marcel.amirault
/doc/api/group_milestones.md @msedlakjakubowski
-/doc/api/group_protected_branches.md @aqualls
+/doc/api/group_protected_branches.md @aqualls @msedlakjakubowski
/doc/api/group_protected_environments.md @phillipwells
/doc/api/group_relations_export.md @eread @ashrafkhamis
/doc/api/group_releases.md @phillipwells
@@ -558,7 +558,7 @@ lib/gitlab/checks/**
/doc/api/iterations.md @msedlakjakubowski
/doc/api/job_artifacts.md @marcel.amirault
/doc/api/jobs.md @marcel.amirault
-/doc/api/keys.md @aqualls
+/doc/api/keys.md @aqualls @msedlakjakubowski
/doc/api/labels.md @msedlakjakubowski
/doc/api/license.md @fneill
/doc/api/linked_epics.md @msedlakjakubowski
@@ -566,7 +566,7 @@ lib/gitlab/checks/**
/doc/api/markdown.md @msedlakjakubowski
/doc/api/member_roles.md @jglassman1
/doc/api/members.md @jglassman1
-/doc/api/merge_request_approvals.md @aqualls
+/doc/api/merge_request_approvals.md @aqualls @msedlakjakubowski
/doc/api/merge_request_context_commits.md @aqualls
/doc/api/merge_requests.md @aqualls
/doc/api/merge_trains.md @marcel.amirault
@@ -588,27 +588,27 @@ lib/gitlab/checks/**
/doc/api/plan_limits.md @jglassman1
/doc/api/product_analytics.md @lciutacu
/doc/api/project_access_tokens.md @jglassman1
-/doc/api/project_aliases.md @aqualls
-/doc/api/project_badges.md @aqualls
+/doc/api/project_aliases.md @aqualls @msedlakjakubowski
+/doc/api/project_badges.md @aqualls @msedlakjakubowski
/doc/api/project_clusters.md @phillipwells
-/doc/api/project_import_export.md @aqualls
+/doc/api/project_import_export.md @aqualls @msedlakjakubowski
/doc/api/project_job_token_scopes.md @marcel.amirault
/doc/api/project_level_variables.md @marcel.amirault
/doc/api/project_relations_export.md @eread @ashrafkhamis
/doc/api/project_repository_storage_moves.md @eread
-/doc/api/project_snippets.md @aqualls
-/doc/api/project_statistics.md @aqualls
-/doc/api/project_templates.md @aqualls
+/doc/api/project_snippets.md @aqualls @msedlakjakubowski
+/doc/api/project_statistics.md @aqualls @msedlakjakubowski
+/doc/api/project_templates.md @aqualls @msedlakjakubowski
/doc/api/project_vulnerabilities.md @rdickenson
/doc/api/projects.md @lciutacu
-/doc/api/protected_branches.md @aqualls
+/doc/api/protected_branches.md @aqualls @msedlakjakubowski
/doc/api/protected_environments.md @phillipwells
-/doc/api/protected_tags.md @aqualls
+/doc/api/protected_tags.md @aqualls @msedlakjakubowski
/doc/api/releases/ @phillipwells
-/doc/api/remote_mirrors.md @aqualls
-/doc/api/repositories.md @aqualls
-/doc/api/repository_files.md @aqualls
-/doc/api/repository_submodules.md @aqualls
+/doc/api/remote_mirrors.md @aqualls @msedlakjakubowski
+/doc/api/repositories.md @aqualls @msedlakjakubowski
+/doc/api/repository_files.md @aqualls @msedlakjakubowski
+/doc/api/repository_submodules.md @aqualls @msedlakjakubowski
/doc/api/resource_groups.md @phillipwells
/doc/api/resource_iteration_events.md @msedlakjakubowski
/doc/api/resource_label_events.md @eread
@@ -624,15 +624,15 @@ lib/gitlab/checks/**
/doc/api/secure_files.md @marcel.amirault
/doc/api/settings.md @jglassman1
/doc/api/sidekiq_metrics.md @axil
-/doc/api/snippet_repository_storage_moves.md @aqualls
-/doc/api/snippets.md @aqualls
+/doc/api/snippet_repository_storage_moves.md @aqualls @msedlakjakubowski
+/doc/api/snippets.md @aqualls @msedlakjakubowski
/doc/api/statistics.md @jglassman1
/doc/api/status_checks.md @eread
-/doc/api/suggestions.md @aqualls
+/doc/api/suggestions.md @aqualls @msedlakjakubowski
/doc/api/system_hooks.md @eread @ashrafkhamis
-/doc/api/tags.md @aqualls
-/doc/api/templates/dockerfiles.md @aqualls
-/doc/api/templates/gitignores.md @aqualls
+/doc/api/tags.md @aqualls @msedlakjakubowski
+/doc/api/templates/dockerfiles.md @aqualls @msedlakjakubowski
+/doc/api/templates/gitignores.md @aqualls @msedlakjakubowski
/doc/api/templates/gitlab_ci_ymls.md @marcel.amirault
/doc/api/templates/licenses.md @rdickenson
/doc/api/todos.md @msedlakjakubowski
@@ -665,7 +665,7 @@ lib/gitlab/checks/**
/doc/development/audit_event_guide/ @eread
/doc/development/auto_devops.md @phillipwells
/doc/development/backend/ @sselhorn
-/doc/development/backend/create_source_code_be/ @aqualls
+/doc/development/backend/create_source_code_be/ @aqualls @msedlakjakubowski
/doc/development/build_test_package.md @axil
/doc/development/bulk_import.md @eread @ashrafkhamis
/doc/development/cached_queries.md @jglassman1
@@ -673,13 +673,13 @@ lib/gitlab/checks/**
/doc/development/chatops_on_gitlabcom.md @eread @ashrafkhamis
/doc/development/cicd/ @marcel.amirault
/doc/development/code_intelligence/ @aqualls
-/doc/development/code_owners/ @aqualls
+/doc/development/code_owners/ @aqualls @msedlakjakubowski
/doc/development/contributing/ @sselhorn
/doc/development/database/ @aqualls
/doc/development/database/filtering_by_label.md @msedlakjakubowski
/doc/development/database/multiple_databases.md @lciutacu
/doc/development/database_review.md @aqualls
-/doc/development/developing_with_solargraph.md @aqualls
+/doc/development/developing_with_solargraph.md @aqualls @msedlakjakubowski
/doc/development/development_processes.md @sselhorn
/doc/development/distributed_tracing.md @msedlakjakubowski
/doc/development/distribution/ @axil
@@ -689,18 +689,18 @@ lib/gitlab/checks/**
/doc/development/fe_guide/dark_mode.md @sselhorn
/doc/development/fe_guide/graphql.md @sselhorn
/doc/development/fe_guide/merge_request_widget_extensions.md @aqualls
-/doc/development/fe_guide/source_editor.md @aqualls
+/doc/development/fe_guide/source_editor.md @aqualls @msedlakjakubowski
/doc/development/fe_guide/view_component.md @sselhorn
/doc/development/feature_categorization/ @sselhorn
/doc/development/feature_development.md @sselhorn
/doc/development/feature_flags/ @sselhorn
-/doc/development/fips_compliance.md @aqualls
+/doc/development/fips_compliance.md @aqualls @msedlakjakubowski
/doc/development/geo.md @axil
/doc/development/geo/ @axil
/doc/development/git_object_deduplication.md @eread
/doc/development/gitaly.md @eread
/doc/development/gitlab_flavored_markdown/ @ashrafkhamis
-/doc/development/gitlab_shell/ @aqualls
+/doc/development/gitlab_shell/ @aqualls @msedlakjakubowski
/doc/development/graphql_guide/ @eread @ashrafkhamis
/doc/development/graphql_guide/batchloader.md @aqualls
/doc/development/i18n/ @eread @ashrafkhamis
@@ -710,16 +710,17 @@ lib/gitlab/checks/**
/doc/development/integrations/ @eread @ashrafkhamis
/doc/development/integrations/secure.md @rdickenson
/doc/development/integrations/secure_partner_integration.md @rdickenson
-/doc/development/internal_api/ @aqualls
+/doc/development/internal_api/ @aqualls @msedlakjakubowski
/doc/development/internal_users.md @sselhorn
/doc/development/issuable-like-models.md @msedlakjakubowski
/doc/development/issue_types.md @msedlakjakubowski
/doc/development/kubernetes.md @phillipwells
/doc/development/labels/ @sselhorn
-/doc/development/lfs.md @aqualls
+/doc/development/lfs.md @aqualls @msedlakjakubowski
/doc/development/logging.md @msedlakjakubowski
/doc/development/maintenance_mode.md @axil
/doc/development/merge_request_concepts/ @aqualls
+/doc/development/merge_request_concepts/rate_limits.md @aqualls @msedlakjakubowski
/doc/development/migration_style_guide.md @aqualls
/doc/development/navigation_sidebar.md @sselhorn
/doc/development/omnibus.md @axil
@@ -727,9 +728,9 @@ lib/gitlab/checks/**
/doc/development/packages/ @marcel.amirault
/doc/development/permissions.md @jglassman1
/doc/development/policies.md @jglassman1
-/doc/development/project_templates.md @aqualls
+/doc/development/project_templates.md @aqualls @msedlakjakubowski
/doc/development/prometheus_metrics.md @msedlakjakubowski
-/doc/development/rails_endpoints/ @aqualls
+/doc/development/rails_endpoints/ @aqualls @msedlakjakubowski
/doc/development/real_time.md @jglassman1
/doc/development/rubocop_development_guide.md @sselhorn
/doc/development/search/ @ashrafkhamis
@@ -744,10 +745,10 @@ lib/gitlab/checks/**
/doc/development/value_stream_analytics/ @lciutacu
/doc/development/work_items.md @msedlakjakubowski
/doc/development/work_items_widgets.md @msedlakjakubowski
-/doc/development/workhorse/ @aqualls
+/doc/development/workhorse/ @aqualls @msedlakjakubowski
/doc/downgrade_ee_to_ce/ @axil
/doc/drawers/ @ashrafkhamis
-/doc/gitlab-basics/ @aqualls
+/doc/gitlab-basics/ @aqualls @msedlakjakubowski
/doc/install/ @axil
/doc/install/postgresql_extensions.md @aqualls
/doc/integration/ @jglassman1
@@ -767,7 +768,7 @@ lib/gitlab/checks/**
/doc/integration/recaptcha.md @phillipwells
/doc/integration/security_partners/ @rdickenson
/doc/integration/slash_commands.md @eread @ashrafkhamis
-/doc/integration/sourcegraph.md @aqualls
+/doc/integration/sourcegraph.md @aqualls @msedlakjakubowski
/doc/integration/trello_power_up.md @eread @ashrafkhamis
/doc/integration/vault.md @phillipwells
/doc/operations/feature_flags.md @phillipwells
@@ -778,15 +779,15 @@ lib/gitlab/checks/**
/doc/raketasks/generate_sample_prometheus_data.md @msedlakjakubowski
/doc/raketasks/migrate_snippets.md @ashrafkhamis
/doc/raketasks/spdx.md @rdickenson
-/doc/raketasks/x509_signatures.md @aqualls
+/doc/raketasks/x509_signatures.md @aqualls @msedlakjakubowski
/doc/security/ @jglassman1
/doc/security/email_verification.md @phillipwells
/doc/subscriptions/ @fneill
/doc/topics/authentication/ @jglassman1
/doc/topics/autodevops/ @phillipwells
/doc/topics/data_seeder.md @sselhorn
-/doc/topics/git/ @aqualls
-/doc/topics/gitlab_flow.md @aqualls
+/doc/topics/git/ @aqualls @msedlakjakubowski
+/doc/topics/gitlab_flow.md @aqualls @msedlakjakubowski
/doc/topics/offline/ @axil
/doc/topics/plan_and_track.md @msedlakjakubowski
/doc/tutorials/ @kpaizee
@@ -801,34 +802,34 @@ lib/gitlab/checks/**
/doc/update/background_migrations.md @aqualls
/doc/user/admin_area/analytics/ @lciutacu
/doc/user/admin_area/credentials_inventory.md @jglassman1
-/doc/user/admin_area/custom_project_templates.md @aqualls
-/doc/user/admin_area/diff_limits.md @aqualls
+/doc/user/admin_area/custom_project_templates.md @aqualls @msedlakjakubowski
+/doc/user/admin_area/diff_limits.md @aqualls @msedlakjakubowski
/doc/user/admin_area/external_users.md @jglassman1
/doc/user/admin_area/geo_sites.md @axil
/doc/user/admin_area/labels.md @msedlakjakubowski
/doc/user/admin_area/license.md @fneill
/doc/user/admin_area/license_file.md @fneill
-/doc/user/admin_area/merge_requests_approvals.md @aqualls
+/doc/user/admin_area/merge_requests_approvals.md @aqualls @msedlakjakubowski
/doc/user/admin_area/moderate_users.md @jglassman1
/doc/user/admin_area/monitoring/ @msedlakjakubowski
/doc/user/admin_area/reporting/git_abuse_rate_limit.md @phillipwells
/doc/user/admin_area/reporting/spamcheck.md @axil
/doc/user/admin_area/review_abuse_reports.md @phillipwells
-/doc/user/admin_area/settings/account_and_limit_settings.md @aqualls
+/doc/user/admin_area/settings/account_and_limit_settings.md @aqualls @msedlakjakubowski
/doc/user/admin_area/settings/continuous_integration.md @marcel.amirault
-/doc/user/admin_area/settings/deprecated_api_rate_limits.md @aqualls
+/doc/user/admin_area/settings/deprecated_api_rate_limits.md @aqualls @msedlakjakubowski
/doc/user/admin_area/settings/email.md @msedlakjakubowski
/doc/user/admin_area/settings/external_authorization.md @jglassman1
-/doc/user/admin_area/settings/files_api_rate_limits.md @aqualls
-/doc/user/admin_area/settings/git_lfs_rate_limits.md @aqualls
+/doc/user/admin_area/settings/files_api_rate_limits.md @aqualls @msedlakjakubowski
+/doc/user/admin_area/settings/git_lfs_rate_limits.md @aqualls @msedlakjakubowski
/doc/user/admin_area/settings/gitaly_timeouts.md @eread
/doc/user/admin_area/settings/import_export_rate_limits.md @eread @ashrafkhamis
/doc/user/admin_area/settings/incident_management_rate_limits.md @msedlakjakubowski
-/doc/user/admin_area/settings/index.md @aqualls
-/doc/user/admin_area/settings/instance_template_repository.md @aqualls
+/doc/user/admin_area/settings/index.md @aqualls @msedlakjakubowski
+/doc/user/admin_area/settings/instance_template_repository.md @aqualls @msedlakjakubowski
/doc/user/admin_area/settings/package_registry_rate_limits.md @marcel.amirault
/doc/user/admin_area/settings/project_integration_management.md @eread @ashrafkhamis
-/doc/user/admin_area/settings/push_event_activities_limit.md @aqualls
+/doc/user/admin_area/settings/push_event_activities_limit.md @aqualls @msedlakjakubowski
/doc/user/admin_area/settings/rate_limit_on_issues_creation.md @msedlakjakubowski
/doc/user/admin_area/settings/rate_limit_on_notes_creation.md @msedlakjakubowski
/doc/user/admin_area/settings/rate_limit_on_pipelines_creation.md @marcel.amirault
@@ -839,11 +840,11 @@ lib/gitlab/checks/**
/doc/user/admin_area/settings/terraform_limits.md @phillipwells
/doc/user/admin_area/settings/third_party_offers.md @lciutacu
/doc/user/admin_area/settings/usage_statistics.md @lciutacu
-/doc/user/admin_area/settings/visibility_and_access_controls.md @aqualls
+/doc/user/admin_area/settings/visibility_and_access_controls.md @aqualls @msedlakjakubowski
/doc/user/analytics/ @lciutacu
/doc/user/analytics/ci_cd_analytics.md @phillipwells
/doc/user/application_security/ @rdickenson
-/doc/user/asciidoc.md @aqualls
+/doc/user/asciidoc.md @aqualls @msedlakjakubowski
/doc/user/award_emojis.md @msedlakjakubowski
/doc/user/clusters/ @phillipwells
/doc/user/compliance/ @rdickenson
@@ -856,7 +857,7 @@ lib/gitlab/checks/**
/doc/user/group/ @lciutacu
/doc/user/group/clusters/ @phillipwells
/doc/user/group/compliance_frameworks.md @eread
-/doc/user/group/custom_project_templates.md @aqualls
+/doc/user/group/custom_project_templates.md @aqualls @msedlakjakubowski
/doc/user/group/epics/ @msedlakjakubowski
/doc/user/group/import/ @eread @ashrafkhamis
/doc/user/group/issues_analytics/ @msedlakjakubowski
@@ -887,19 +888,19 @@ lib/gitlab/checks/**
/doc/user/profile/notifications.md @msedlakjakubowski
/doc/user/profile/personal_access_tokens.md @jglassman1
/doc/user/profile/user_passwords.md @jglassman1
-/doc/user/project/autocomplete_characters.md @aqualls
+/doc/user/project/autocomplete_characters.md @aqualls @msedlakjakubowski
/doc/user/project/badges.md @lciutacu
-/doc/user/project/changelogs.md @aqualls
+/doc/user/project/changelogs.md @aqualls @msedlakjakubowski
/doc/user/project/clusters/ @phillipwells
/doc/user/project/code_intelligence.md @aqualls
-/doc/user/project/codeowners/ @aqualls
+/doc/user/project/codeowners/ @aqualls @msedlakjakubowski
/doc/user/project/deploy_boards.md @phillipwells
/doc/user/project/deploy_keys/ @phillipwells
/doc/user/project/deploy_tokens/ @phillipwells
/doc/user/project/description_templates.md @msedlakjakubowski
-/doc/user/project/file_lock.md @aqualls
-/doc/user/project/git_attributes.md @aqualls
-/doc/user/project/highlighting.md @aqualls
+/doc/user/project/file_lock.md @aqualls @msedlakjakubowski
+/doc/user/project/git_attributes.md @aqualls @msedlakjakubowski
+/doc/user/project/highlighting.md @aqualls @msedlakjakubowski
/doc/user/project/import/ @eread @ashrafkhamis
/doc/user/project/import/jira.md @msedlakjakubowski
/doc/user/project/index.md @lciutacu
@@ -911,18 +912,22 @@ lib/gitlab/checks/**
/doc/user/project/labels.md @msedlakjakubowski
/doc/user/project/members/ @lciutacu
/doc/user/project/merge_requests/ @aqualls
+/doc/user/project/merge_requests/approvals/ @aqualls @msedlakjakubowski
+/doc/user/project/merge_requests/cherry_pick_changes.md @aqualls @msedlakjakubowski
/doc/user/project/merge_requests/csv_export.md @eread
+/doc/user/project/merge_requests/methods/ @aqualls @msedlakjakubowski
+/doc/user/project/merge_requests/squash_and_merge.md @aqualls @msedlakjakubowski
/doc/user/project/merge_requests/status_checks.md @eread
/doc/user/project/milestones/ @msedlakjakubowski
/doc/user/project/organize_work_with_projects.md @lciutacu
-/doc/user/project/protected_branches.md @aqualls
-/doc/user/project/protected_tags.md @aqualls
-/doc/user/project/push_options.md @aqualls
+/doc/user/project/protected_branches.md @aqualls @msedlakjakubowski
+/doc/user/project/protected_tags.md @aqualls @msedlakjakubowski
+/doc/user/project/push_options.md @aqualls @msedlakjakubowski
/doc/user/project/quick_actions.md @msedlakjakubowski
/doc/user/project/releases/ @phillipwells
/doc/user/project/releases/release_evidence.md @eread
/doc/user/project/remote_development/ @ashrafkhamis
-/doc/user/project/repository/ @aqualls
+/doc/user/project/repository/ @aqualls @msedlakjakubowski
/doc/user/project/repository/file_finder.md @ashrafkhamis
/doc/user/project/repository/managing_large_repositories.md @axil
/doc/user/project/repository/reducing_the_repo_size_using_git.md @eread
@@ -934,7 +939,7 @@ lib/gitlab/checks/**
/doc/user/project/settings/import_export_troubleshooting.md @eread @ashrafkhamis
/doc/user/project/settings/index.md @lciutacu
/doc/user/project/settings/project_access_tokens.md @jglassman1
-/doc/user/project/system_notes.md @aqualls
+/doc/user/project/system_notes.md @aqualls @msedlakjakubowski
/doc/user/project/time_tracking.md @msedlakjakubowski
/doc/user/project/web_ide/ @ashrafkhamis
/doc/user/project/working_with_projects.md @lciutacu
@@ -943,7 +948,7 @@ lib/gitlab/checks/**
/doc/user/reserved_names.md @lciutacu
/doc/user/search/ @ashrafkhamis
/doc/user/shortcuts.md @ashrafkhamis
-/doc/user/snippets.md @aqualls
+/doc/user/snippets.md @aqualls @msedlakjakubowski
/doc/user/ssh.md @jglassman1
/doc/user/tasks.md @msedlakjakubowski
/doc/user/todos.md @msedlakjakubowski
diff --git a/.gitlab/ci/caching.gitlab-ci.yml b/.gitlab/ci/caching.gitlab-ci.yml
index 31975e481bc..ae4bb94b301 100644
--- a/.gitlab/ci/caching.gitlab-ci.yml
+++ b/.gitlab/ci/caching.gitlab-ci.yml
@@ -2,7 +2,7 @@ cache-workhorse:
extends:
- .default-retry
- .default-before_script
- - .rails-cache
+ - .ruby-cache
- .setup-test-env-cache
- .caching:rules:cache-workhorse
stage: prepare
diff --git a/.gitlab/ci/dev-fixtures.gitlab-ci.yml b/.gitlab/ci/dev-fixtures.gitlab-ci.yml
index 891a5dd79ad..5464e154b3f 100644
--- a/.gitlab/ci/dev-fixtures.gitlab-ci.yml
+++ b/.gitlab/ci/dev-fixtures.gitlab-ci.yml
@@ -1,7 +1,7 @@
.run-dev-fixtures:
extends:
- .default-retry
- - .rails-cache
+ - .ruby-cache
- .default-before_script
- .use-pg13
stage: test
diff --git a/.gitlab/ci/docs.gitlab-ci.yml b/.gitlab/ci/docs.gitlab-ci.yml
index 8862302803c..6c426749af3 100644
--- a/.gitlab/ci/docs.gitlab-ci.yml
+++ b/.gitlab/ci/docs.gitlab-ci.yml
@@ -116,7 +116,7 @@ docs-lint deprecations-and-removals:
SETUP_DB: "false"
extends:
- .default-retry
- - .rails-cache
+ - .ruby-cache
- .default-before_script
- .docs:rules:deprecations-and-removals
stage: lint
diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml
index dbef92c9c35..790a9140445 100644
--- a/.gitlab/ci/frontend.gitlab-ci.yml
+++ b/.gitlab/ci/frontend.gitlab-ci.yml
@@ -128,7 +128,7 @@ retrieve-frontend-fixtures:
extends:
- .default-retry
- .default-before_script
- - .rails-cache
+ - .ruby-cache
- .use-pg13
stage: fixtures
needs: ["setup-test-env", "retrieve-tests-metadata", "retrieve-frontend-fixtures"]
@@ -206,7 +206,7 @@ graphql-schema-dump:
SETUP_DB: "false"
extends:
- .default-retry
- - .rails-cache
+ - .ruby-cache
- .default-before_script
- .frontend:rules:default-frontend-jobs
stage: fixtures
diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml
index 7d359dbc5c9..120e5117fb2 100644
--- a/.gitlab/ci/global.gitlab-ci.yml
+++ b/.gitlab/ci/global.gitlab-ci.yml
@@ -146,10 +146,6 @@
cache:
- *ruby-gems-cache
-.rails-cache:
- cache:
- - *ruby-gems-cache
-
.static-analysis-cache:
cache:
- *ruby-gems-cache
diff --git a/.gitlab/ci/graphql.gitlab-ci.yml b/.gitlab/ci/graphql.gitlab-ci.yml
index c4c4d500fb5..e67a7753da7 100644
--- a/.gitlab/ci/graphql.gitlab-ci.yml
+++ b/.gitlab/ci/graphql.gitlab-ci.yml
@@ -3,7 +3,7 @@ graphql-verify:
SETUP_DB: "false"
extends:
- .default-retry
- - .rails-cache
+ - .ruby-cache
- .default-before_script
- .graphql:rules:graphql-verify
stage: test
diff --git a/.gitlab/ci/memory.gitlab-ci.yml b/.gitlab/ci/memory.gitlab-ci.yml
index afef2b11ee7..004188b502c 100644
--- a/.gitlab/ci/memory.gitlab-ci.yml
+++ b/.gitlab/ci/memory.gitlab-ci.yml
@@ -1,7 +1,7 @@
.only-code-memory-job-base:
extends:
- .default-retry
- - .rails-cache
+ - .ruby-cache
- .default-before_script
- .memory:rules
variables:
diff --git a/.gitlab/ci/qa-common/main.gitlab-ci.yml b/.gitlab/ci/qa-common/main.gitlab-ci.yml
index 67b341ee760..9a9e918e83d 100644
--- a/.gitlab/ci/qa-common/main.gitlab-ci.yml
+++ b/.gitlab/ci/qa-common/main.gitlab-ci.yml
@@ -62,9 +62,6 @@ stages:
GITLAB_LICENSE_MODE: test
GITLAB_QA_ADMIN_ACCESS_TOKEN: $QA_ADMIN_ACCESS_TOKEN
GITLAB_QA_OPTS: $EXTRA_GITLAB_QA_OPTS
- # todo: remove in 16.1 milestone when not needed for backwards compatibility anymore
- EE_LICENSE: $QA_EE_LICENSE
- GITHUB_ACCESS_TOKEN: $QA_GITHUB_ACCESS_TOKEN
# Allow QA jobs to fail as they are flaky. The top level `package-and-e2e:ee`
# pipeline is not allowed to fail, so without allowing QA to fail, we will be
# blocking merges due to flaky tests.
diff --git a/.gitlab/ci/rails/shared.gitlab-ci.yml b/.gitlab/ci/rails/shared.gitlab-ci.yml
index 47226032d4f..98cc4cc44c8 100644
--- a/.gitlab/ci/rails/shared.gitlab-ci.yml
+++ b/.gitlab/ci/rails/shared.gitlab-ci.yml
@@ -16,7 +16,7 @@ include:
extends:
- .default-retry
- .default-before_script
- - .rails-cache
+ - .ruby-cache
.base-script:
script:
diff --git a/.gitlab/ci/setup.gitlab-ci.yml b/.gitlab/ci/setup.gitlab-ci.yml
index cf71081a37f..bacd7efce3e 100644
--- a/.gitlab/ci/setup.gitlab-ci.yml
+++ b/.gitlab/ci/setup.gitlab-ci.yml
@@ -84,7 +84,7 @@ generate-frontend-fixtures-mapping:
extends:
- .setup:rules:generate-frontend-fixtures-mapping
- .use-pg13
- - .rails-cache
+ - .ruby-cache
needs: ["setup-test-env"]
stage: prepare
before_script:
diff --git a/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml b/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml
index 51f88cdfddf..3f177f87a30 100644
--- a/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml
+++ b/.gitlab/ci/test-on-gdk/main.gitlab-ci.yml
@@ -25,9 +25,6 @@ variables:
QA_GENERATE_ALLURE_REPORT: "true"
QA_CAN_TEST_PRAEFECT: "false"
QA_INTERCEPT_REQUESTS: "false"
- TEST_LICENSE_MODE: $QA_TEST_LICENSE_MODE
- EE_LICENSE: $QA_EE_LICENSE
- GITHUB_ACCESS_TOKEN: $QA_GITHUB_ACCESS_TOKEN
GITLAB_QA_ADMIN_ACCESS_TOKEN: $QA_ADMIN_ACCESS_TOKEN
RSPEC_REPORT_OPTS: "--order random --force-color --format documentation --format RspecJunitFormatter --out tmp/rspec-${CI_JOB_ID}.xml --format QA::Support::JsonFormatter --out tmp/rspec-${CI_JOB_ID}.json --format html --out tmp/rspec-${CI_JOB_ID}.htm"
FF_NETWORK_PER_BUILD: 1
diff --git a/.gitlab/issue_templates/Design Sprint.md b/.gitlab/issue_templates/Design Sprint.md
index f85d41a112e..9e7e6f56e8b 100644
--- a/.gitlab/issue_templates/Design Sprint.md
+++ b/.gitlab/issue_templates/Design Sprint.md
@@ -139,24 +139,24 @@ Each exercise should be explained and documented in a separate issue. You can us
Deciding which persona we are focusing on will be part of the Day 1 discussions in the workshop. The personas we are going to consider are:
-<!-- Choose which personas could be target users so that you choose from this list during the Sprint. Personas are described at https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/
-
-* [Cameron (Compliance Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#cameron-compliance-manager)
-* [Parker (Product Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#parker-product-manager)
-* [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#delaney-development-team-lead)
-* [Presley (Product Designer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#presley-product-designer)
-* [Sasha (Software Developer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sasha-software-developer)
-* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer)
-* [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sidney-systems-administrator)
-* [Sam (Security Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sam-security-analyst)
-* [Rachel (Release Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#rachel-release-manager)
-* [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#alex-security-operations-engineer)
-* [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#simone-software-engineer-in-test)
-* [Allison (Application Ops)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#allison-application-ops)
+<!-- Choose which personas could be target users so that you choose from this list during the Sprint. Personas are described at https://about.gitlab.com/handbook/product/personas/
+
+* [Cameron (Compliance Manager)](https://about.gitlab.com/handbook/product/personas/#cameron-compliance-manager)
+* [Parker (Product Manager)](https://about.gitlab.com/handbook/product/personas/#parker-product-manager)
+* [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/product/personas/#delaney-development-team-lead)
+* [Presley (Product Designer)](https://about.gitlab.com/handbook/product/personas/#presley-product-designer)
+* [Sasha (Software Developer)](https://about.gitlab.com/handbook/product/personas/#sasha-software-developer)
+* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/product/personas/#priyanka-platform-engineer)
+* [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/product/personas/#sidney-systems-administrator)
+* [Sam (Security Analyst)](https://about.gitlab.com/handbook/product/personas/#sam-security-analyst)
+* [Rachel (Release Manager)](https://about.gitlab.com/handbook/product/personas/#rachel-release-manager)
+* [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/product/personas/#alex-security-operations-engineer)
+* [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/product/personas/#simone-software-engineer-in-test)
+* [Allison (Application Ops)](https://about.gitlab.com/handbook/product/personas/#allison-application-ops)
* [Ingrid (Infrastructure Operator)](https://about.gitlab.com/handbook/product/personas/#ingrid-infrastructure-operator)
* [Dakota (Application Development Director)](https://about.gitlab.com/handbook/product/personas/#dakota-application-development-director)
-* [Dana (Data Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#dana-data-analyst)
-* [Eddie (Content Editor)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#eddie-content-editor)
+* [Dana (Data Analyst)](https://about.gitlab.com/handbook/product/personas/#dana-data-analyst)
+* [Eddie (Content Editor)](https://about.gitlab.com/handbook/product/personas/#eddie-content-editor)
-->
diff --git a/.gitlab/issue_templates/Documentation.md b/.gitlab/issue_templates/Documentation.md
index c58b6d0cf06..82de14717a6 100644
--- a/.gitlab/issue_templates/Documentation.md
+++ b/.gitlab/issue_templates/Documentation.md
@@ -24,7 +24,7 @@
* Any concepts, procedures, reference info we could add to make it easier to successfully use GitLab?
* Include use cases, benefits, and/or goals for this work.
* If adding content: What audience is it intended for? (What roles and scenarios?)
- For ideas, see personas at https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/ or the persona labels at
+ For ideas, see personas at https://about.gitlab.com/handbook/product/personas/ or the persona labels at
https://gitlab.com/groups/gitlab-org/-/labels?subscribed=&search=persona%3A
-->
diff --git a/.gitlab/issue_templates/Feature Proposal - lean.md b/.gitlab/issue_templates/Feature Proposal - lean.md
index 3997ffa5c85..05df47fee0b 100644
--- a/.gitlab/issue_templates/Feature Proposal - lean.md
+++ b/.gitlab/issue_templates/Feature Proposal - lean.md
@@ -18,24 +18,24 @@ The goal of this template is brevity for quick/smaller iterations. For a more th
<!-- Who will use this feature? If known, include any of the following: types of users (e.g. Developer), personas, or specific company roles (e.g. Release Manager). It's okay to write "Unknown" and fill this field in later.
-Personas are described at https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/
-
-* [Cameron (Compliance Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#cameron-compliance-manager)
-* [Parker (Product Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#parker-product-manager)
-* [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#delaney-development-team-lead)
-* [Presley (Product Designer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#presley-product-designer)
-* [Sasha (Software Developer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sasha-software-developer)
-* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer)
-* [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sidney-systems-administrator)
-* [Sam (Security Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sam-security-analyst)
-* [Rachel (Release Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#rachel-release-manager)
-* [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#alex-security-operations-engineer)
-* [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#simone-software-engineer-in-test)
-* [Allison (Application Ops)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#allison-application-ops)
+Personas are described at https://about.gitlab.com/handbook/product/personas/
+
+* [Cameron (Compliance Manager)](https://about.gitlab.com/handbook/product/personas/#cameron-compliance-manager)
+* [Parker (Product Manager)](https://about.gitlab.com/handbook/product/personas/#parker-product-manager)
+* [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/product/personas/#delaney-development-team-lead)
+* [Presley (Product Designer)](https://about.gitlab.com/handbook/product/personas/#presley-product-designer)
+* [Sasha (Software Developer)](https://about.gitlab.com/handbook/product/personas/#sasha-software-developer)
+* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/product/personas/#priyanka-platform-engineer)
+* [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/product/personas/#sidney-systems-administrator)
+* [Sam (Security Analyst)](https://about.gitlab.com/handbook/product/personas/#sam-security-analyst)
+* [Rachel (Release Manager)](https://about.gitlab.com/handbook/product/personas/#rachel-release-manager)
+* [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/product/personas/#alex-security-operations-engineer)
+* [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/product/personas/#simone-software-engineer-in-test)
+* [Allison (Application Ops)](https://about.gitlab.com/handbook/product/personas/#allison-application-ops)
* [Ingrid (Infrastructure Operator)](https://about.gitlab.com/handbook/product/personas/#ingrid-infrastructure-operator)
* [Dakota (Application Development Director)](https://about.gitlab.com/handbook/product/personas/#dakota-application-development-director)
-* [Dana (Data Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#dana-data-analyst)
-* [Eddie (Content Editor)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#eddie-content-editor)
+* [Dana (Data Analyst)](https://about.gitlab.com/handbook/product/personas/#dana-data-analyst)
+* [Eddie (Content Editor)](https://about.gitlab.com/handbook/product/personas/#eddie-content-editor)
-->
### Feature Usage Metrics
diff --git a/.gitlab/issue_templates/Feature proposal - detailed.md b/.gitlab/issue_templates/Feature proposal - detailed.md
index dcf6d417155..87fc4f508a7 100644
--- a/.gitlab/issue_templates/Feature proposal - detailed.md
+++ b/.gitlab/issue_templates/Feature proposal - detailed.md
@@ -12,24 +12,24 @@
<!-- Who will use this feature? If known, include any of the following: types of users (e.g. Developer), personas, or specific company roles (e.g. Release Manager). It's okay to write "Unknown" and fill this field in later.
-Personas are described at https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/
-
-* [Cameron (Compliance Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#cameron-compliance-manager)
-* [Parker (Product Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#parker-product-manager)
-* [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#delaney-development-team-lead)
-* [Presley (Product Designer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#presley-product-designer)
-* [Sasha (Software Developer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sasha-software-developer)
-* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer)
-* [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sidney-systems-administrator)
-* [Sam (Security Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sam-security-analyst)
-* [Rachel (Release Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#rachel-release-manager)
-* [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#alex-security-operations-engineer)
-* [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#simone-software-engineer-in-test)
-* [Allison (Application Ops)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#allison-application-ops)
+Personas are described at https://about.gitlab.com/handbook/product/personas/
+
+* [Cameron (Compliance Manager)](https://about.gitlab.com/handbook/product/personas/#cameron-compliance-manager)
+* [Parker (Product Manager)](https://about.gitlab.com/handbook/product/personas/#parker-product-manager)
+* [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/product/personas/#delaney-development-team-lead)
+* [Presley (Product Designer)](https://about.gitlab.com/handbook/product/personas/#presley-product-designer)
+* [Sasha (Software Developer)](https://about.gitlab.com/handbook/product/personas/#sasha-software-developer)
+* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/product/personas/#priyanka-platform-engineer)
+* [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/product/personas/#sidney-systems-administrator)
+* [Sam (Security Analyst)](https://about.gitlab.com/handbook/product/personas/#sam-security-analyst)
+* [Rachel (Release Manager)](https://about.gitlab.com/handbook/product/personas/#rachel-release-manager)
+* [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/product/personas/#alex-security-operations-engineer)
+* [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/product/personas/#simone-software-engineer-in-test)
+* [Allison (Application Ops)](https://about.gitlab.com/handbook/product/personas/#allison-application-ops)
* [Ingrid (Infrastructure Operator)](https://about.gitlab.com/handbook/product/personas/#ingrid-infrastructure-operator)
* [Dakota (Application Development Director)](https://about.gitlab.com/handbook/product/personas/#dakota-application-development-director)
-* [Dana (Data Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#dana-data-analyst)
-* [Eddie (Content Editor)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#eddie-content-editor)
+* [Dana (Data Analyst)](https://about.gitlab.com/handbook/product/personas/#dana-data-analyst)
+* [Eddie (Content Editor)](https://about.gitlab.com/handbook/product/personas/#eddie-content-editor)
-->
@@ -112,7 +112,7 @@ Create tracking issue using the Snowplow event tracking template. See https://gi
### What is the type of buyer?
-<!-- What is the buyer persona for this feature? See https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/buyer-persona/
+<!-- What is the buyer persona for this feature? See https://about.gitlab.com/handbook/product/personas/buyer-persona/
In which enterprise tier should this feature go? See https://about.gitlab.com/handbook/product/pricing/#three-tiers -->
### Is this a cross-stage feature?
diff --git a/.gitlab/issue_templates/Fulfillment Group UX Issue.md b/.gitlab/issue_templates/Fulfillment Group UX Issue.md
index 86db27e1c53..4c70f4039ab 100644
--- a/.gitlab/issue_templates/Fulfillment Group UX Issue.md
+++ b/.gitlab/issue_templates/Fulfillment Group UX Issue.md
@@ -6,24 +6,24 @@ The goal of this template is to ensure we have captured all the information avai
<!-- If known, include any of the following: types of users (e.g. Developer), personas, or specific company roles (e.g. Release Manager). It's okay to write "Unknown" and fill this field in later.
-Personas are described at https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/
-
-* [Cameron (Compliance Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#cameron-compliance-manager)
-* [Parker (Product Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#parker-product-manager)
-* [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#delaney-development-team-lead)
-* [Presley (Product Designer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#presley-product-designer)
-* [Sasha (Software Developer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sasha-software-developer)
-* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer)
-* [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sidney-systems-administrator)
-* [Sam (Security Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sam-security-analyst)
-* [Rachel (Release Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#rachel-release-manager)
-* [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#alex-security-operations-engineer)
-* [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#simone-software-engineer-in-test)
-* [Allison (Application Ops)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#allison-application-ops)
+Personas are described at https://about.gitlab.com/handbook/product/personas/
+
+* [Cameron (Compliance Manager)](https://about.gitlab.com/handbook/product/personas/#cameron-compliance-manager)
+* [Parker (Product Manager)](https://about.gitlab.com/handbook/product/personas/#parker-product-manager)
+* [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/product/personas/#delaney-development-team-lead)
+* [Presley (Product Designer)](https://about.gitlab.com/handbook/product/personas/#presley-product-designer)
+* [Sasha (Software Developer)](https://about.gitlab.com/handbook/product/personas/#sasha-software-developer)
+* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/product/personas/#priyanka-platform-engineer)
+* [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/product/personas/#sidney-systems-administrator)
+* [Sam (Security Analyst)](https://about.gitlab.com/handbook/product/personas/#sam-security-analyst)
+* [Rachel (Release Manager)](https://about.gitlab.com/handbook/product/personas/#rachel-release-manager)
+* [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/product/personas/#alex-security-operations-engineer)
+* [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/product/personas/#simone-software-engineer-in-test)
+* [Allison (Application Ops)](https://about.gitlab.com/handbook/product/personas/#allison-application-ops)
* [Ingrid (Infrastructure Operator)](https://about.gitlab.com/handbook/product/personas/#ingrid-infrastructure-operator)
* [Dakota (Application Development Director)](https://about.gitlab.com/handbook/product/personas/#dakota-application-development-director)
-* [Dana (Data Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#dana-data-analyst)
-* [Eddie (Content Editor)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#eddie-content-editor)
+* [Dana (Data Analyst)](https://about.gitlab.com/handbook/product/personas/#dana-data-analyst)
+* [Eddie (Content Editor)](https://about.gitlab.com/handbook/product/personas/#eddie-content-editor)
-->
diff --git a/.gitlab/issue_templates/Problem Validation.md b/.gitlab/issue_templates/Problem Validation.md
index dee026ee752..dcd2283f4b6 100644
--- a/.gitlab/issue_templates/Problem Validation.md
+++ b/.gitlab/issue_templates/Problem Validation.md
@@ -8,7 +8,7 @@ Learn more about it in the handbook: https://about.gitlab.com/handbook/product-d
## Reach
-<!-- Please describe who suffers from this problem. Consider referring to our personas, which are described at https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/ -->
+<!-- Please describe who suffers from this problem. Consider referring to our personas, which are described at https://about.gitlab.com/handbook/product/personas/ -->
<!-- Please also quantify the problem's reach using the following values, considering an aggregate across GitLab.com and self-managed:
diff --git a/Gemfile b/Gemfile
index 38bddb8b87f..ff3f645ecc4 100644
--- a/Gemfile
+++ b/Gemfile
@@ -586,7 +586,7 @@ gem 'cvss-suite', '~> 3.0.1', require: 'cvss_suite'
gem 'arr-pm', '~> 0.0.12'
# Remote Development
-gem 'devfile', '~> 0.0.17.pre.alpha1'
+gem 'devfile', '~> 0.0.18.pre.alpha1'
# Apple plist parsing
gem 'CFPropertyList', '~> 3.0.0'
diff --git a/Gemfile.checksum b/Gemfile.checksum
index b2b79849738..a7492e77dc2 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -109,9 +109,9 @@
{"name":"deprecation_toolkit","version":"1.5.1","platform":"ruby","checksum":"a8a1ab1a19ae40ea12560b65010e099f3459ebde390b76621ef0c21c516a04ba"},
{"name":"derailed_benchmarks","version":"2.1.2","platform":"ruby","checksum":"eaadc6206ceeb5538ff8f5e04a0023d54ebdd95d04f33e8960fb95a5f189a14f"},
{"name":"descendants_tracker","version":"0.0.4","platform":"ruby","checksum":"e9c41dd4cfbb85829a9301ea7e7c48c2a03b26f09319db230e6479ccdc780897"},
-{"name":"devfile","version":"0.0.17.pre.alpha1","platform":"arm64-darwin","checksum":"a6e4d970914399a3acce38d81c42ba5b98f849d878031ff83decd6575369d0c3"},
-{"name":"devfile","version":"0.0.17.pre.alpha1","platform":"ruby","checksum":"2855e7513ab8322e456d3080bf2449109cf4a5785e262443128db0ebf48e646c"},
-{"name":"devfile","version":"0.0.17.pre.alpha1","platform":"x86_64-linux","checksum":"da045e7cbeb2f0685b9b6c7f3d54147403720dced01f727e2f8ca53cef333eaa"},
+{"name":"devfile","version":"0.0.18.pre.alpha1","platform":"arm64-darwin","checksum":"ddf6a8a389ea823fb22c60d9ee715476aa1fd2504f3ed325d69787a4e9e6046b"},
+{"name":"devfile","version":"0.0.18.pre.alpha1","platform":"ruby","checksum":"5003234358a47b7c45b1bcde0b5bfa3c12c185406d9e8a103b0ef4de8a6de24c"},
+{"name":"devfile","version":"0.0.18.pre.alpha1","platform":"x86_64-linux","checksum":"6d970c8af0ebfda46a8bc950d5f7e9d5da62f899e01b68e51e5e18c89be89452"},
{"name":"device_detector","version":"1.0.0","platform":"ruby","checksum":"b800fb3150b00c23e87b6768011808ac1771fffaae74c3238ebaf2b782947a7d"},
{"name":"devise","version":"4.8.1","platform":"ruby","checksum":"fdd48bbe79a89e7c1152236a70479842ede48bea4fa7f4f2d8da1f872559803e"},
{"name":"devise-two-factor","version":"4.0.2","platform":"ruby","checksum":"6548d2696ed090d27046f888f4fa7380f151e0f823902d46fd9b91e7d0cac511"},
diff --git a/Gemfile.lock b/Gemfile.lock
index 6014d0935d6..0d6f2d36e9a 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -367,7 +367,7 @@ GEM
thor (>= 0.19, < 2)
descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1)
- devfile (0.0.17.pre.alpha1)
+ devfile (0.0.18.pre.alpha1)
device_detector (1.0.0)
devise (4.8.1)
bcrypt (~> 3.0)
@@ -1702,7 +1702,7 @@ DEPENDENCIES
declarative_policy (~> 1.1.0)
deprecation_toolkit (~> 1.5.1)
derailed_benchmarks
- devfile (~> 0.0.17.pre.alpha1)
+ devfile (~> 0.0.18.pre.alpha1)
device_detector
devise (~> 4.8.1)
devise-pbkdf2-encryptable (~> 0.0.0)!
diff --git a/app/assets/javascripts/analytics/cycle_analytics/components/value_stream_filters.vue b/app/assets/javascripts/analytics/cycle_analytics/components/value_stream_filters.vue
index b9d1c4b0fe0..0de62013a63 100644
--- a/app/assets/javascripts/analytics/cycle_analytics/components/value_stream_filters.vue
+++ b/app/assets/javascripts/analytics/cycle_analytics/components/value_stream_filters.vue
@@ -82,6 +82,7 @@ export default {
<div>
<projects-dropdown-filter
v-if="hasProjectFilter"
+ toggle-classes="gl-max-w-26"
class="js-projects-dropdown-filter project-select gl-mb-2 gl-lg-mb-0"
:group-namespace="groupPath"
:query-params="projectsQueryParams"
diff --git a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
index fc37e413961..f881c924ae5 100644
--- a/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
+++ b/app/assets/javascripts/analytics/shared/components/projects_dropdown_filter.vue
@@ -50,6 +50,11 @@ export default {
required: false,
default: false,
},
+ toggleClasses: {
+ type: String,
+ required: false,
+ default: '',
+ },
},
data() {
return {
@@ -222,7 +227,6 @@ export default {
<template>
<gl-collapsible-listbox
ref="projectsDropdown"
- toggle-class="gl-shadow-none gl-mb-0"
:header-text="__('Projects')"
:items="listBoxItems"
:reset-button-label="__('Clear All')"
@@ -238,7 +242,10 @@ export default {
@select="onSelected"
>
<template #toggle>
- <gl-button class="dropdown-projects">
+ <gl-button
+ button-text-classes="gl-w-full gl-justify-content-space-between gl-display-flex gl-shadow-none gl-mb-0"
+ :class="['dropdown-projects', toggleClasses]"
+ >
<gl-avatar
v-if="isOnlyOneProjectSelected"
:src="selectedProjects[0].avatarUrl"
diff --git a/app/assets/javascripts/ci/artifacts/components/job_artifacts_table.vue b/app/assets/javascripts/ci/artifacts/components/job_artifacts_table.vue
index 035e26d09e6..81739db9be2 100644
--- a/app/assets/javascripts/ci/artifacts/components/job_artifacts_table.vue
+++ b/app/assets/javascripts/ci/artifacts/components/job_artifacts_table.vue
@@ -313,7 +313,13 @@ export default {
return !job.archive?.downloadPath;
},
browseButtonDisabled(job) {
- return !job.browseArtifactsPath;
+ return !job.browseArtifactsPath || !job.hasMetadata;
+ },
+ browseButtonHref(job) {
+ // make href blank when button is disabled so `cursor: not-allowed` is applied
+ if (this.browseButtonDisabled(job)) return '';
+
+ return job.browseArtifactsPath;
},
deleteButtonDisabled(job) {
return !job.hasArtifacts || !this.canBulkDestroyArtifacts;
@@ -500,7 +506,7 @@ export default {
<gl-button
icon="folder-open"
:disabled="browseButtonDisabled(item)"
- :href="item.browseArtifactsPath"
+ :href="browseButtonHref(item)"
:title="$options.i18n.browse"
:aria-label="$options.i18n.browse"
data-testid="job-artifacts-browse-button"
diff --git a/app/assets/javascripts/ci/artifacts/constants.js b/app/assets/javascripts/ci/artifacts/constants.js
index 7ba65e0f98f..4fb4b45fd7f 100644
--- a/app/assets/javascripts/ci/artifacts/constants.js
+++ b/app/assets/javascripts/ci/artifacts/constants.js
@@ -104,6 +104,7 @@ export const JOBS_PER_PAGE = 20;
export const INITIAL_LAST_PAGE_SIZE = null;
export const ARCHIVE_FILE_TYPE = 'ARCHIVE';
+export const METADATA_FILE_TYPE = 'METADATA';
export const ARTIFACT_ROW_HEIGHT = 56;
export const ARTIFACTS_SHOWN_WITHOUT_SCROLLING = 4;
diff --git a/app/assets/javascripts/ci/artifacts/utils.js b/app/assets/javascripts/ci/artifacts/utils.js
index ebcf0af8d2a..2ed78261ade 100644
--- a/app/assets/javascripts/ci/artifacts/utils.js
+++ b/app/assets/javascripts/ci/artifacts/utils.js
@@ -1,5 +1,5 @@
import { numberToHumanSize } from '~/lib/utils/number_utils';
-import { ARCHIVE_FILE_TYPE, JOB_STATUS_GROUP_SUCCESS } from './constants';
+import { ARCHIVE_FILE_TYPE, METADATA_FILE_TYPE, JOB_STATUS_GROUP_SUCCESS } from './constants';
export const totalArtifactsSizeForJob = (job) =>
numberToHumanSize(
@@ -21,6 +21,9 @@ export const mapBooleansToJobNodes = (jobNode) => {
return {
succeeded: jobNode.detailedStatus.group === JOB_STATUS_GROUP_SUCCESS,
hasArtifacts: jobNode.artifacts.nodes.length > 0,
+ hasMetadata: jobNode.artifacts.nodes.some(
+ (artifact) => artifact.fileType === METADATA_FILE_TYPE,
+ ),
...jobNode,
};
};
diff --git a/app/assets/javascripts/jira_connect/subscriptions/constants.js b/app/assets/javascripts/jira_connect/subscriptions/constants.js
index 321d10205e6..05c315e7b8a 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/constants.js
+++ b/app/assets/javascripts/jira_connect/subscriptions/constants.js
@@ -24,7 +24,7 @@ export const I18N_ADD_SUBSCRIPTIONS_ERROR_MESSAGE = s__(
'Integrations|Failed to link namespace. Please try again.',
);
export const I18N_UPDATE_INSTALLATION_ERROR_MESSAGE = s__(
- 'Integrations|Failed to update GitLab version. Please try again.',
+ 'Integrations|Failed to update the GitLab instance. See the %{linkStart}troubleshooting documentation%{linkEnd}.',
);
export const I18N_OAUTH_APPLICATION_ID_ERROR_MESSAGE = s__(
'Integrations|Failed to load Jira Connect Application ID. Please try again.',
@@ -40,6 +40,9 @@ export const INTEGRATIONS_DOC_LINK = helpPagePath('integration/jira/development_
export const OAUTH_SELF_MANAGED_DOC_LINK = helpPagePath('integration/jira/connect-app', {
anchor: 'connect-the-gitlab-for-jira-cloud-app-for-self-managed-instances',
});
+export const FAILED_TO_UPDATE_DOC_LINK = helpPagePath('integration/jira/connect-app', {
+ anchor: 'failed-to-update-the-gitlab-instance-for-self-managed-instances',
+});
export const GITLAB_COM_BASE_PATH = 'https://gitlab.com';
diff --git a/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index.vue b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index.vue
index 8cc107930d1..d9ce272563b 100644
--- a/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index.vue
+++ b/app/assets/javascripts/jira_connect/subscriptions/pages/sign_in/sign_in_gitlab_multiversion/index.vue
@@ -8,6 +8,7 @@ import { updateInstallation, setApiBaseURL } from '~/jira_connect/subscriptions/
import {
GITLAB_COM_BASE_PATH,
I18N_UPDATE_INSTALLATION_ERROR_MESSAGE,
+ FAILED_TO_UPDATE_DOC_LINK,
} from '~/jira_connect/subscriptions/constants';
import { SET_ALERT } from '~/jira_connect/subscriptions/store/mutation_types';
@@ -56,6 +57,7 @@ export default {
.catch(() => {
this.setAlert({
message: I18N_UPDATE_INSTALLATION_ERROR_MESSAGE,
+ linkUrl: FAILED_TO_UPDATE_DOC_LINK,
variant: 'danger',
});
this.loadingVersionSelect = false;
diff --git a/app/assets/javascripts/whats_new/components/app.vue b/app/assets/javascripts/whats_new/components/app.vue
index 472bc1dfacc..a439675d467 100644
--- a/app/assets/javascripts/whats_new/components/app.vue
+++ b/app/assets/javascripts/whats_new/components/app.vue
@@ -22,7 +22,8 @@ export default {
props: {
versionDigest: {
type: String,
- required: true,
+ required: false,
+ default: undefined,
},
},
computed: {
@@ -75,7 +76,7 @@ export default {
<template #title>
<h4 class="page-title gl-my-2">{{ __("What's new") }}</h4>
</template>
- <template v-if="features.length">
+ <template v-if="features.length || !fetching">
<gl-infinite-scroll
:fetched-items="features.length"
:max-list-height="drawerBodyHeight"
diff --git a/app/assets/javascripts/whats_new/utils/notification.js b/app/assets/javascripts/whats_new/utils/notification.js
index f9b725ed429..1621c4d5f27 100644
--- a/app/assets/javascripts/whats_new/utils/notification.js
+++ b/app/assets/javascripts/whats_new/utils/notification.js
@@ -9,7 +9,7 @@ export const setNotification = (appEl) => {
let notificationCountEl = notificationEl.querySelector('.js-whats-new-notification-count');
- if (localStorage.getItem(STORAGE_KEY) === versionDigest) {
+ if (localStorage.getItem(STORAGE_KEY) === versionDigest || versionDigest === undefined) {
notificationEl.classList.remove('with-notifications');
if (notificationCountEl) {
notificationCountEl.parentElement.removeChild(notificationCountEl);
diff --git a/app/assets/javascripts/work_items/components/work_item_detail.vue b/app/assets/javascripts/work_items/components/work_item_detail.vue
index d25416d0397..0b7d9edd765 100644
--- a/app/assets/javascripts/work_items/components/work_item_detail.vue
+++ b/app/assets/javascripts/work_items/components/work_item_detail.vue
@@ -12,7 +12,6 @@ import {
GlEmptyState,
} from '@gitlab/ui';
import noAccessSvg from '@gitlab/svgs/dist/illustrations/analytics/no-access.svg?raw';
-import * as Sentry from '@sentry/browser';
import { s__ } from '~/locale';
import { getParameterByName, updateHistory, setUrlParams } from '~/lib/utils/url_utility';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
@@ -426,44 +425,6 @@ export default {
store.writeQuery({ ...query, data: newData });
},
- async updateWorkItem(workItem, childId, parentId) {
- return this.$apollo.mutate({
- mutation: updateWorkItemMutation,
- variables: { input: { id: childId, hierarchyWidget: { parentId } } },
- update: (store) => this.toggleChildFromCache(workItem, childId, store),
- });
- },
- async undoChildRemoval(workItem, childId) {
- try {
- const { data } = await this.updateWorkItem(workItem, childId, this.workItem.id);
-
- if (data.workItemUpdate.errors.length === 0) {
- this.activeToast?.hide();
- }
- } catch (error) {
- this.updateError = s__('WorkItem|Something went wrong while undoing child removal.');
- Sentry.captureException(error);
- } finally {
- this.activeToast?.hide();
- }
- },
- async removeChild({ id }) {
- try {
- const { data } = await this.updateWorkItem(null, id, null);
-
- if (data.workItemUpdate.errors.length === 0) {
- this.activeToast = this.$toast.show(s__('WorkItem|Child removed'), {
- action: {
- text: s__('WorkItem|Undo'),
- onClick: this.undoChildRemoval.bind(this, data.workItemUpdate.workItem, id),
- },
- });
- }
- } catch (error) {
- this.updateError = s__('WorkItem|Something went wrong while removing child.');
- Sentry.captureException(error);
- }
- },
updateHasNotes() {
this.$emit('has-notes');
},
@@ -716,7 +677,6 @@ export default {
:can-update="canUpdate"
:confidential="workItem.confidential"
@addWorkItemChild="addChild"
- @removeChild="removeChild"
@show-modal="openInModal"
/>
<work-item-notes
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_children_wrapper.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_children_wrapper.vue
index bca74bad3df..a18dfd4d9e3 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_children_wrapper.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_children_wrapper.vue
@@ -1,15 +1,20 @@
<script>
+import * as Sentry from '@sentry/browser';
import produce from 'immer';
import Draggable from 'vuedraggable';
import { isLoggedIn } from '~/lib/utils/common_utils';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
+import { s__ } from '~/locale';
import { defaultSortableOptions } from '~/sortable/constants';
import { WORK_ITEM_TYPE_VALUE_OBJECTIVE } from '../../constants';
import { findHierarchyWidgets } from '../../utils';
-import workItemByIidQuery from '../../graphql/work_item_by_iid.query.graphql';
+import addHierarchyChildMutation from '../../graphql/add_hierarchy_child.mutation.graphql';
+import removeHierarchyChildMutation from '../../graphql/remove_hierarchy_child.mutation.graphql';
import reorderWorkItem from '../../graphql/reorder_work_item.mutation.graphql';
+import updateWorkItemMutation from '../../graphql/update_work_item.mutation.graphql';
+import workItemByIidQuery from '../../graphql/work_item_by_iid.query.graphql';
import WorkItemLinkChild from './work_item_link_child.vue';
export default {
@@ -74,6 +79,58 @@ export default {
},
},
methods: {
+ async removeChild(child) {
+ try {
+ const { data } = await this.$apollo.mutate({
+ mutation: updateWorkItemMutation,
+ variables: { input: { id: child.id, hierarchyWidget: { parentId: null } } },
+ });
+
+ if (data.workItemUpdate.errors.length) {
+ throw new Error(data.workItemUpdate.errors);
+ }
+
+ await this.$apollo.mutate({
+ mutation: removeHierarchyChildMutation,
+ variables: { fullPath: this.fullPath, iid: this.workItemIid, workItem: child },
+ });
+
+ this.$toast.show(s__('WorkItem|Child removed'), {
+ action: {
+ text: s__('WorkItem|Undo'),
+ onClick: (_, toast) => {
+ this.undoChildRemoval(child);
+ toast.hide();
+ },
+ },
+ });
+ } catch (error) {
+ this.$emit('error', s__('WorkItem|Something went wrong while removing child.'));
+ Sentry.captureException(error);
+ }
+ },
+ async undoChildRemoval(child) {
+ try {
+ const { data } = await this.$apollo.mutate({
+ mutation: updateWorkItemMutation,
+ variables: { input: { id: child.id, hierarchyWidget: { parentId: this.workItemId } } },
+ });
+
+ if (data.workItemUpdate.errors.length) {
+ throw new Error(data.workItemUpdate.errors);
+ }
+
+ await this.$apollo.mutate({
+ mutation: addHierarchyChildMutation,
+ variables: { fullPath: this.fullPath, iid: this.workItemIid, workItem: child },
+ });
+
+ this.$toast.show(s__('WorkItem|Child removal reverted'));
+ } catch (error) {
+ this.$emit('error', s__('WorkItem|Something went wrong while undoing child removal.'));
+ Sentry.captureException(error);
+ }
+ },
addWorkItemQuery({ iid }) {
this.$apollo.addSmartQuery('prefetchedWorkItem', {
query: workItemByIidQuery,
@@ -188,7 +245,8 @@ export default {
},
)
.catch((error) => {
- this.updateError = error.message;
+ this.$emit('error', error.message);
+ Sentry.captureException(error);
});
},
},
@@ -213,7 +271,7 @@ export default {
:has-indirect-children="hasIndirectChildren"
@mouseover="prefetchWorkItem(child)"
@mouseout="clearPrefetching"
- @removeChild="$emit('removeChild', $event)"
+ @removeChild="removeChild"
@click="$emit('show-modal', { event: $event, child: $event.childItem || child })"
/>
</component>
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue
index 338fe55cb40..efcbe8062e0 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue
@@ -13,7 +13,6 @@ import { FORM_TYPES, WIDGET_ICONS, WORK_ITEM_STATUS_TEXT } from '../../constants
import { findHierarchyWidgetChildren } from '../../utils';
import addHierarchyChildMutation from '../../graphql/add_hierarchy_child.mutation.graphql';
import removeHierarchyChildMutation from '../../graphql/remove_hierarchy_child.mutation.graphql';
-import updateWorkItemMutation from '../../graphql/update_work_item.mutation.graphql';
import workItemByIidQuery from '../../graphql/work_item_by_iid.query.graphql';
import WidgetWrapper from '../widget_wrapper.vue';
import WorkItemDetailModal from '../work_item_detail_modal.vue';
@@ -92,7 +91,6 @@ export default {
return {
isShownAddForm: false,
activeChild: {},
- activeToast: null,
error: undefined,
parentIssue: null,
formType: null,
@@ -168,7 +166,7 @@ export default {
},
handleWorkItemDeleted(child) {
this.removeHierarchyChild(child);
- this.activeToast = this.$toast.show(s__('WorkItem|Task deleted'));
+ this.$toast.show(s__('WorkItem|Task deleted'));
},
updateWorkItemIdUrlQuery({ iid } = {}) {
updateHistory({ url: setUrlParams({ work_item_iid: iid }), replace: true });
@@ -185,36 +183,6 @@ export default {
variables: { fullPath: this.fullPath, iid: this.iid, workItem },
});
},
- async undoChildRemoval(workItem, childId) {
- const { data } = await this.$apollo.mutate({
- mutation: updateWorkItemMutation,
- variables: { input: { id: childId, hierarchyWidget: { parentId: this.issuableGid } } },
- });
-
- await this.addHierarchyChild(workItem);
-
- if (data.workItemUpdate.errors.length === 0) {
- this.activeToast?.hide();
- }
- },
- async removeChild(workItem) {
- const childId = workItem.id;
- const { data } = await this.$apollo.mutate({
- mutation: updateWorkItemMutation,
- variables: { input: { id: childId, hierarchyWidget: { parentId: null } } },
- });
-
- await this.removeHierarchyChild(workItem);
-
- if (data.workItemUpdate.errors.length === 0) {
- this.activeToast = this.$toast.show(s__('WorkItem|Child removed'), {
- action: {
- text: s__('WorkItem|Undo'),
- onClick: this.undoChildRemoval.bind(this, data.workItemUpdate.workItem, childId),
- },
- });
- }
- },
toggleReportAbuseDrawer(isOpen, reply = {}) {
this.isReportDrawerOpen = isOpen;
this.reportedUrl = reply.url;
@@ -307,7 +275,7 @@ export default {
:can-update="canUpdate"
:work-item-id="issuableGid"
:work-item-iid="iid"
- @removeChild="removeChild"
+ @error="error = $event"
@show-modal="openChild"
/>
<work-item-detail-modal
diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_tree.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_tree.vue
index 93c570e9bd0..4e80e0071ae 100644
--- a/app/assets/javascripts/work_items/components/work_item_links/work_item_tree.vue
+++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_tree.vue
@@ -60,6 +60,7 @@ export default {
},
data() {
return {
+ error: undefined,
isShownAddForm: false,
formType: null,
childType: null,
@@ -98,7 +99,12 @@ export default {
</script>
<template>
- <widget-wrapper ref="wrapper" data-testid="work-item-tree">
+ <widget-wrapper
+ ref="wrapper"
+ :error="error"
+ data-testid="work-item-tree"
+ @dismissAlert="error = undefined"
+ >
<template #header>
{{ $options.WORK_ITEMS_TREE_TEXT_MAP[workItemType].title }}
</template>
@@ -144,7 +150,7 @@ export default {
:work-item-id="workItemId"
:work-item-iid="workItemIid"
:work-item-type="workItemType"
- @removeChild="$emit('removeChild', $event)"
+ @error="error = $event"
@show-modal="showModal"
/>
</template>
diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb
index b4c2d80d8e7..a1ce4221b19 100644
--- a/app/helpers/search_helper.rb
+++ b/app/helpers/search_helper.rb
@@ -612,7 +612,14 @@ module SearchHelper
def sanitized_search_params
sanitized_params = params.dup
- sanitized_params[:confidential] = Gitlab::Utils.to_boolean(sanitized_params[:confidential]) if sanitized_params.key?(:confidential)
+
+ if sanitized_params.key?(:confidential)
+ sanitized_params[:confidential] = Gitlab::Utils.to_boolean(sanitized_params[:confidential])
+ end
+
+ if sanitized_params.key?(:include_archived)
+ sanitized_params[:include_archived] = Gitlab::Utils.to_boolean(sanitized_params[:include_archived])
+ end
sanitized_params
end
diff --git a/app/models/release_highlight.rb b/app/models/release_highlight.rb
index 7cead8a42cd..5a6f708f689 100644
--- a/app/models/release_highlight.rb
+++ b/app/models/release_highlight.rb
@@ -8,6 +8,12 @@ class ReleaseHighlight
ULTIMATE_PACKAGE = 'Ultimate'
def self.paginated(page: 1)
+ result = self.paginated_query(page: page)
+ result = self.paginated_query(page: result.next_page) while next_page?(result)
+ result
+ end
+
+ def self.paginated_query(page:)
key = self.cache_key("items:page-#{page}")
Rails.cache.fetch(key, expires_in: CACHE_DURATION) do
@@ -44,7 +50,7 @@ class ReleaseHighlight
rescue Psych::Exception => e
Gitlab::ErrorTracking.track_exception(e, file_path: file_path)
- nil
+ []
end
def self.whats_new_path
@@ -121,6 +127,14 @@ class ReleaseHighlight
item['available_in']&.include?(current_package)
end
+
+ def self.next_page?(result)
+ return false unless result
+
+ # if all items for the current page doesn't belong to the current tier
+ # or failed to parse current YAML, loading next page
+ result.items == [] && result.next_page.present?
+ end
end
ReleaseHighlight.prepend_mod
diff --git a/app/services/concerns/search/filter.rb b/app/services/concerns/search/filter.rb
index c358f49eef1..e234edcfce4 100644
--- a/app/services/concerns/search/filter.rb
+++ b/app/services/concerns/search/filter.rb
@@ -5,7 +5,7 @@ module Search
private
def filters
- { state: params[:state], confidential: params[:confidential] }
+ { state: params[:state], confidential: params[:confidential], include_archived: params[:include_archived] }
end
end
end
diff --git a/app/services/jira_connect_installations/update_service.rb b/app/services/jira_connect_installations/update_service.rb
index ff5b9671e2b..d0cf614a068 100644
--- a/app/services/jira_connect_installations/update_service.rb
+++ b/app/services/jira_connect_installations/update_service.rb
@@ -51,7 +51,7 @@ module JiraConnectInstallations
'Could not be installed on the instance. Network error'
end
- ServiceResponse.error(message: { instance_url: [message] })
+ ServiceResponse.error(message: message)
end
def update_error
diff --git a/app/services/search/global_service.rb b/app/services/search/global_service.rb
index 2d4952dacfd..85ca0b850f5 100644
--- a/app/services/search/global_service.rb
+++ b/app/services/search/global_service.rb
@@ -25,7 +25,7 @@ module Search
# rubocop: disable CodeReuse/ActiveRecord
def projects
- @projects ||= ProjectsFinder.new(params: { non_archived: true }, current_user: current_user).execute.preload(:topics, :project_topics)
+ @projects ||= ProjectsFinder.new(current_user: current_user).execute.preload(:topics, :project_topics)
end
def allowed_scopes
diff --git a/app/views/admin/application_settings/_signin.html.haml b/app/views/admin/application_settings/_signin.html.haml
index 50b5e797559..85841059c5e 100644
--- a/app/views/admin/application_settings/_signin.html.haml
+++ b/app/views/admin/application_settings/_signin.html.haml
@@ -29,7 +29,7 @@
.form-text.text-muted
= _('Maximum time that users are allowed to skip the setup of two-factor authentication (in hours). Set to 0 (zero) to enforce at next sign in.')
.form-group
- = f.label :admin_mode, _('Admin Mode'), class: 'label-bold'
+ = f.label :admin_mode, _('Admin mode'), class: 'label-bold'
= sprite_icon('lock', css_class: 'gl-icon')
- help_text = _('Require additional authentication for administrative tasks.')
- help_link = link_to _('Learn more.'), help_page_path('user/admin_area/settings/sign_in_restrictions', anchor: 'admin-mode'), target: '_blank', rel: 'noopener noreferrer'
diff --git a/app/views/admin/sessions/two_factor.html.haml b/app/views/admin/sessions/two_factor.html.haml
index 3bbf768d7be..69f8a8a3a97 100644
--- a/app/views/admin/sessions/two_factor.html.haml
+++ b/app/views/admin/sessions/two_factor.html.haml
@@ -1,4 +1,4 @@
-- page_title _('Enter 2FA for Admin Mode')
+- page_title _('Two-factor authentication for admin mode')
- add_page_specific_style 'page_bundles/login'
.row.justify-content-center
diff --git a/app/views/devise/sessions/two_factor.html.haml b/app/views/devise/sessions/two_factor.html.haml
index 06152e3dac5..3d77ac35b01 100644
--- a/app/views/devise/sessions/two_factor.html.haml
+++ b/app/views/devise/sessions/two_factor.html.haml
@@ -1,5 +1,5 @@
%div
- = render 'devise/shared/tab_single', tab_title: _('Two-Factor Authentication') if Feature.disabled?(:restyle_login_page, @project)
+ = render 'devise/shared/tab_single', tab_title: _('Two-factor authentication') if Feature.disabled?(:restyle_login_page, @project)
.login-box.gl-p-5
.login-body
- if @user.two_factor_enabled?
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 73ec3ed8781..f3785078393 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -8862,6 +8862,29 @@ The edge type for [`Discussion`](#discussion).
| <a id="discussionedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
| <a id="discussionedgenode"></a>`node` | [`Discussion`](#discussion) | The item at the end of the edge. |
+#### `DoraPerformanceScoreCountConnection`
+
+The connection type for [`DoraPerformanceScoreCount`](#doraperformancescorecount).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="doraperformancescorecountconnectionedges"></a>`edges` | [`[DoraPerformanceScoreCountEdge]`](#doraperformancescorecountedge) | A list of edges. |
+| <a id="doraperformancescorecountconnectionnodes"></a>`nodes` | [`[DoraPerformanceScoreCount]`](#doraperformancescorecount) | A list of nodes. |
+| <a id="doraperformancescorecountconnectionpageinfo"></a>`pageInfo` | [`PageInfo!`](#pageinfo) | Information to aid in pagination. |
+
+#### `DoraPerformanceScoreCountEdge`
+
+The edge type for [`DoraPerformanceScoreCount`](#doraperformancescorecount).
+
+##### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="doraperformancescorecountedgecursor"></a>`cursor` | [`String!`](#string) | A cursor for use in pagination. |
+| <a id="doraperformancescorecountedgenode"></a>`node` | [`DoraPerformanceScoreCount`](#doraperformancescorecount) | The item at the end of the edge. |
+
#### `EgressNodeConnection`
The connection type for [`EgressNode`](#egressnode).
@@ -14315,6 +14338,20 @@ Returns [`[DoraMetric!]`](#dorametric).
| <a id="dorametrictimetorestoreservice"></a>`timeToRestoreService` | [`Float`](#float) | Median time to close an incident. |
| <a id="dorametricvalue"></a>`value` **{warning-solid}** | [`Float`](#float) | **Deprecated** in 15.10. Moved to corresponding metric field. |
+### `DoraPerformanceScoreCount`
+
+Aggregated DORA score counts for projects for the last complete month.
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="doraperformancescorecounthighprojectscount"></a>`highProjectsCount` | [`Int`](#int) | Number of projects that score "high" on the metric. |
+| <a id="doraperformancescorecountlowprojectscount"></a>`lowProjectsCount` | [`Int`](#int) | Number of projects that score "low" on the metric. |
+| <a id="doraperformancescorecountmediumprojectscount"></a>`mediumProjectsCount` | [`Int`](#int) | Number of projects that score "medium" on the metric. |
+| <a id="doraperformancescorecountmetricname"></a>`metricName` | [`String!`](#string) | Name of the DORA metric. |
+| <a id="doraperformancescorecountnodataprojectscount"></a>`noDataProjectsCount` | [`Int`](#int) | Number of projects with no data. |
+
### `EgressNode`
#### Fields
@@ -15405,6 +15442,7 @@ GPG signature for a signed commit.
| <a id="groupdescription"></a>`description` | [`String`](#string) | Description of the namespace. |
| <a id="groupdescriptionhtml"></a>`descriptionHtml` | [`String`](#string) | GitLab Flavored Markdown rendering of `description`. |
| <a id="groupdora"></a>`dora` | [`Dora`](#dora) | Group's DORA metrics. |
+| <a id="groupdoraperformancescorecounts"></a>`doraPerformanceScoreCounts` | [`DoraPerformanceScoreCountConnection`](#doraperformancescorecountconnection) | Group's DORA scores for all projects by DORA key metric for the last complete month. (see [Connections](#connections)) |
| <a id="groupemailsdisabled"></a>`emailsDisabled` | [`Boolean`](#boolean) | Indicates if a group has email notifications disabled. |
| <a id="groupenforcefreeusercap"></a>`enforceFreeUserCap` | [`Boolean`](#boolean) | Indicates whether the group has limited users for a free plan. |
| <a id="groupepicboards"></a>`epicBoards` | [`EpicBoardConnection`](#epicboardconnection) | Find epic boards. (see [Connections](#connections)) |
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index 068a0a0dfd3..14f73fd3aad 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -14,7 +14,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
> - `with_merge_status_recheck` [changed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/115948) in GitLab 15.11 [with a flag](../administration/feature_flags.md) named `restrict_merge_status_recheck` to be ignored for requests from users insufficient permissions. Disabled by default.
> - `approvals_before_merge` was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119503) in GitLab 16.0.
-Every API call to merge requests must be authenticated.
+Authentication is required for API calls to non-public information.
## Removals in API v5
diff --git a/doc/architecture/blueprints/cells/index.md b/doc/architecture/blueprints/cells/index.md
index 94ff12f2c55..ffb005ae636 100644
--- a/doc/architecture/blueprints/cells/index.md
+++ b/doc/architecture/blueprints/cells/index.md
@@ -346,6 +346,33 @@ This is the list of known affected features with the proposed solutions.
- [Cells: GitLab Pages](cells-feature-gitlab-pages.md)
- [Cells: Agent for Kubernetes](cells-feature-agent-for-kubernetes.md)
+## Frequently Asked Questions
+
+### What's the difference between Cells architecture and GitLab Dedicated?
+
+The new Cells architecture is meant to scale GitLab.com. And the way to achieve this is by moving
+organizations into cells, but different organizations can still share each other server resources, even
+if the application provides isolation from other organizations. But all of them still operate under the
+existing GitLab SaaS domain name `gitlab.com`. Also, cells still share some common data, like `users`, and
+routing information of groups and projects. For example, no two users can have the same username
+even if they belong to different organizations that exist on different cells.
+
+With the aforementioned differences, GitLab Dedicated is still offered at higher costs due to the fact
+that it's provisioned via dedicated server resources for each customer, while Cells use shared resources. Which
+makes GitLab Dedicated more suited for bigger customers, and GitLab Cells more suitable for small to mid size
+companies that are starting on GitLab.com.
+
+On the other hand, [GitLab Dedicated](https://about.gitlab.com/dedicated/) is meant to provide completely
+isolated GitLab instance for any organization. Where this instance is running on its own custom domain name, and
+totally isolated from any other GitLab instance, including GitLab SaaS. For example, users on GitLab dedicated
+don't have to have a different and unique username that was already taken on GitLab.com.
+
+### Can different cells communicate with each other?
+
+Up until iteration 3, cells communicate with each other only via a shared database that contains common
+data. In iteration 4 we are going to evaluate the option of cells calling each other via API to provide more
+isolation and reliability.
+
## Decision log
- 2022-03-15: Google Cloud as the cloud service. For details, see [issue 396641](https://gitlab.com/gitlab-org/gitlab/-/issues/396641#note_1314932272).
diff --git a/doc/ci/pipelines/pipeline_artifacts.md b/doc/ci/pipelines/pipeline_artifacts.md
index d8db79a54dc..79435c0276d 100644
--- a/doc/ci/pipelines/pipeline_artifacts.md
+++ b/doc/ci/pipelines/pipeline_artifacts.md
@@ -2,28 +2,13 @@
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'
---
-# Pipeline artifacts **(FREE)**
+This document was moved to [another location](../testing/test_coverage_visualization.md).
-Pipeline artifacts are files created by GitLab after a pipeline finishes. Pipeline artifacts are
-different to [job artifacts](../jobs/job_artifacts.md) because they are not explicitly managed by
-`.gitlab-ci.yml` definitions.
-
-Pipeline artifacts are used by the [test coverage visualization feature](../testing/test_coverage_visualization.md)
-to collect coverage information.
-
-## Storage
-
-Pipeline artifacts are saved to disk or object storage. They count towards a project's [storage usage quota](../../user/usage_quotas.md#storage-usage-quota).
-The **Artifacts** on the Usage Quotas page is the sum of all job artifacts and pipeline artifacts.
-
-## When pipeline artifacts are deleted
-
-Pipeline artifacts from:
-
-- The latest pipeline are kept forever.
-- Pipelines superseded by a newer pipeline are deleted seven days after their creation date.
-
-It can take up to two days for GitLab to delete pipeline artifacts from when they are due to be
-deleted.
+<!-- 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/linux_saas_runner.md b/doc/ci/runners/saas/linux_saas_runner.md
index 055cf651067..f596d4da8c5 100644
--- a/doc/ci/runners/saas/linux_saas_runner.md
+++ b/doc/ci/runners/saas/linux_saas_runner.md
@@ -98,9 +98,10 @@ Below are the settings for SaaS runners on Linux.
and [#4070](https://gitlab.com/gitlab-com/gl-infra/reliability/-/issues/4070).
NOTE:
-SaaS runner instances are provisioned with a 25 GB storage volume. The underlying disk space of the storage volume
+Typical SaaS runner instances are provisioned with a 25 GB storage volume. GPU-enabled runners
+are provisioned with a 50 GB storage volume. The underlying disk space of the storage volume
is shared by the operating system, the Docker image, and a copy of your cloned repository.
-This means that the available free disk space that your jobs can use is **less than 25 GB**.
+This means that the available free disk space that your jobs can use is **less than 25 (or 50) GB**.
<!--- start_remove The following content will be removed on remove_date: '2023-08-22' -->
diff --git a/doc/ci/testing/test_coverage_visualization.md b/doc/ci/testing/test_coverage_visualization.md
index 31d1b7f3337..2fcd1ecfad2 100644
--- a/doc/ci/testing/test_coverage_visualization.md
+++ b/doc/ci/testing/test_coverage_visualization.md
@@ -73,10 +73,11 @@ a [blocking manual job](../jobs/job_control.md#types-of-manual-jobs), the
pipeline waits for the manual job before continuing and is not considered complete.
The visualization cannot be displayed if the blocking manual job did not run.
-### Artifact expiration
+### Data expiration
-By default, the [pipeline artifact](../pipelines/pipeline_artifacts.md#storage) used
-to draw the visualization on the merge request expires **one week** after creation.
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/321323) in GitLab 13.12, the latest data is kept regardless of expiry time.
+
+By default, the data used to draw the visualization on the merge request expires **one week** after creation.
### Coverage report from child pipeline
diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md
index 2cabb4bbaab..6e4effe4298 100644
--- a/doc/ci/yaml/index.md
+++ b/doc/ci/yaml/index.md
@@ -837,7 +837,6 @@ subdirectories of `binaries/`.
> - [Made default behavior](https://gitlab.com/gitlab-org/gitlab/-/issues/229936) in GitLab 13.4.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/241026) in GitLab 13.8, keeping latest job artifacts can be disabled at the project level.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276583) in GitLab 13.9, keeping latest job artifacts can be disabled instance-wide.
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/321323) in GitLab 13.12, the latest pipeline artifacts are kept regardless of expiry time.
Use `expire_in` to specify how long [job artifacts](../jobs/job_artifacts.md) are stored before
they expire and are deleted. The `expire_in` setting does not affect:
@@ -845,9 +844,6 @@ they expire and are deleted. The `expire_in` setting does not affect:
- Artifacts from the latest job, unless keeping the latest job artifacts is disabled
[at the project level](../jobs/job_artifacts.md#keep-artifacts-from-most-recent-successful-jobs).
or [instance-wide](../../user/admin_area/settings/continuous_integration.md#keep-the-latest-artifacts-for-all-jobs-in-the-latest-successful-pipelines).
-- [Pipeline artifacts](../pipelines/pipeline_artifacts.md). You can't specify an expiration date for
- pipeline artifacts. See [When pipeline artifacts are deleted](../pipelines/pipeline_artifacts.md#when-pipeline-artifacts-are-deleted)
- for more information.
After their expiry, artifacts are deleted hourly by default (using a cron job), and are not
accessible anymore.
diff --git a/doc/development/ai_features.md b/doc/development/ai_features.md
index b18345d3afa..e5d5581f704 100644
--- a/doc/development/ai_features.md
+++ b/doc/development/ai_features.md
@@ -107,7 +107,7 @@ In order to obtain a GCP service key for local development, please follow the st
- Create a sandbox GCP environment by visiting [this page](https://about.gitlab.com/handbook/infrastructure-standards/#individual-environment) and following the instructions, or by requesting access to our existing group environment by using [this template](https://gitlab.com/gitlab-com/it/infra/issue-tracker/-/issues/new?issuable_template=gcp_group_account_iam_update_request). At this time, access to any endpoints outside of `text-bison` or `chat-bison` must be made through the group environment.
- In the GCP console, go to `IAM & Admin` > `Service Accounts` and click on the "Create new service account" button
- Name the service account something specific to what you're using it for. Select Create and Continue. Under `Grant this service account access to project`, select the role `Vertex AI User`. Select `Continue` then `Done`
-- Select your new service account and `Manage keys` > `Add Key` > `Create new key`. This will download the **private** JSON credentials for your service account.
+- Select your new service account and `Manage keys` > `Add Key` > `Create new key`. This will download the **private** JSON credentials for your service account.
- Open the Rails console. Update the settings to:
```ruby
@@ -321,7 +321,6 @@ We recommend to use [policies](policies.md) to deal with authorization for a fea
1. Feature specific feature flag is enabled
1. The namespace has the required license for the feature
1. User is a member of the group/project
-1. Resource is allowed to be sent (see `send_to_ai?` method)
1. `experiment_features_enabled` and `third_party_ai_features_enabled` flags are set on the `Namespace`
For our example, we need to implement the `allowed?(:amazing_new_ai_feature)` call. As an example, you can look at the [Issue Policy for the summarize comments feature](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/app/policies/ee/issue_policy.rb). In our example case, we want to implement the feature for Issues as well:
@@ -335,8 +334,7 @@ module EE
prepended do
with_scope :subject
condition(:ai_available) do
- ::Feature.enabled?(:openai_experimentation) &&
- @subject.send_to_ai?
+ ::Feature.enabled?(:openai_experimentation)
end
with_scope :subject
@@ -353,19 +351,6 @@ module EE
end
```
-### Implement `send_to_ai?`
-
-To make sure we only send data that is allowed to be sent, we have the `send_to_ai?` method. It checks if the resource is not confidential and public data.
-Some resources already implement `send_to_ai?`. Make sure yours does as well. In our case, `Issue` is already covered with the `Issuable` concern. This is an example how it could look like:
-
-```ruby
-# ee/app/models/concerns/ee
-
-def send_to_ai?
- !try(:confidential) && resource_parent.public?
-end
-```
-
### Check if feature is allowed for this resource based on namespace settings
There are two settings allowed on root namespace level that restrict the use of AI features:
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index 81d340a0e4e..e590eb60812 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -47,6 +47,12 @@ The **Approved** button is in the merge request widget.
Getting your merge request **merged** also requires a maintainer. If it requires
more than one approval, the last maintainer to review and approve merges it.
+Some domain areas (like `Verify`) require an approval from a domain expert, based on
+CODEOWNERS rules. Because CODEOWNERS sections are independent approval rules, we could have certain
+rules (for example `Verify`) that may be a subset of other more generic approval rules (for example `backend`).
+For a more efficient process, authors should look for domain-specific approvals before generic approvals.
+Domain-specific approvers may also be maintainers, and if so they should review the domain specifics and broader change at the same time and approve once for both roles.
+
Read more about [author responsibilities](#the-responsibility-of-the-merge-request-author) below.
### Domain experts
diff --git a/doc/development/pipelines/internals.md b/doc/development/pipelines/internals.md
index 678297eb3e5..9e511fb88f6 100644
--- a/doc/development/pipelines/internals.md
+++ b/doc/development/pipelines/internals.md
@@ -130,7 +130,7 @@ that are scoped to a single [configuration keyword](../../ci/yaml/index.md#job-k
| `.default-retry` | Allows a job to [retry](../../ci/yaml/index.md#retry) upon `unknown_failure`, `api_failure`, `runner_system_failure`, `job_execution_timeout`, or `stuck_or_timeout_failure`. |
| `.default-before_script` | Allows a job to use a default `before_script` definition suitable for Ruby/Rails tasks that may need a database running (for example, tests). |
| `.setup-test-env-cache` | Allows a job to use a default `cache` definition suitable for setting up test environment for subsequent Ruby/Rails tasks. |
-| `.rails-cache` | Allows a job to use a default `cache` definition suitable for Ruby/Rails tasks. |
+| `.ruby-cache` | Allows a job to use a default `cache` definition suitable for Ruby tasks. |
| `.static-analysis-cache` | Allows a job to use a default `cache` definition suitable for static analysis tasks. |
| `.coverage-cache` | Allows a job to use a default `cache` definition suitable for coverage tasks. |
| `.qa-cache` | Allows a job to use a default `cache` definition suitable for QA tasks. |
diff --git a/doc/development/pipelines/performance.md b/doc/development/pipelines/performance.md
index b31d239eb6b..2dbed640fbb 100644
--- a/doc/development/pipelines/performance.md
+++ b/doc/development/pipelines/performance.md
@@ -38,7 +38,6 @@ This works well for the following reasons:
with fixed keys:
- `.setup-test-env-cache`
- `.ruby-cache`
- - `.rails-cache`
- `.static-analysis-cache`
- `.rubocop-cache`
- `.coverage-cache`
diff --git a/doc/integration/jira/configure.md b/doc/integration/jira/configure.md
index 22c12786060..1ce91d5f88f 100644
--- a/doc/integration/jira/configure.md
+++ b/doc/integration/jira/configure.md
@@ -22,7 +22,7 @@ Prerequisites:
- Jira personal access token (GitLab 16.0 and later).
You can enable the Jira issue integration by configuring your project settings in GitLab.
-You can also configure these settings at the [group level](../../user/admin_area/settings/project_integration_management.md#manage-group-level-default-settings-for-a-project-integration) or [instance level](../../user/admin_area/settings/project_integration_management.md#manage-instance-level-default-settings-for-a-project-integration) for self-managed GitLab.
+You can configure these settings at the [group level](../../user/admin_area/settings/project_integration_management.md#manage-group-level-default-settings-for-a-project-integration) or at the [instance level](../../user/admin_area/settings/project_integration_management.md#manage-instance-level-default-settings-for-a-project-integration) for self-managed GitLab.
To configure your project settings in GitLab:
@@ -83,7 +83,7 @@ To create a Jira Cloud API token:
1. Select **Create API token**.
1. In the dialog, enter a label for your token and select **Create**.
-To copy the API token, select **Copy** and paste the token somewhere safe.
+To copy the API token, select **Copy**.
## Migrate from Jira Server to Jira Cloud in GitLab
@@ -93,7 +93,7 @@ To migrate from Jira Server to Jira Cloud in GitLab and maintain your Jira integ
1. On the left sidebar, select **Settings > Integrations**.
1. Select **Jira**.
1. In **Web URL**, enter the new Jira site URL (for example, `https://myjirasite.atlassian.net`).
-1. In **Email or username**, enter the email or username registered on your Jira profile.
+1. In **Email or username**, enter the email registered on your Jira profile.
1. [Create a Jira Cloud API token](#create-a-jira-cloud-api-token), and copy the token value.
1. In **API token or password**, paste the API token value.
1. Optional. Select **Test settings**.
diff --git a/doc/integration/jira/connect-app.md b/doc/integration/jira/connect-app.md
index 221e41b86f3..42d6091c26f 100644
--- a/doc/integration/jira/connect-app.md
+++ b/doc/integration/jira/connect-app.md
@@ -304,14 +304,9 @@ To resolve this issue on GitLab self-managed, follow one of the solutions below,
- In all GitLab versions:
- Re-install the GitLab for Jira Cloud app. This method might remove all synced data from the Jira development panel.
-### `Failed to update GitLab version` error when setting up the GitLab for Jira Cloud app for self-managed instances
+### `Failed to update the GitLab instance` for self-managed instances
-When you set up the GitLab for Jira Cloud app, you might get the following message after you enter your
-self-managed instance URL:
-
-```plaintext
-Failed to update GitLab version. Please try again.
-```
+When you set up the GitLab for Jira Cloud app, you might get a `Failed to update the GitLab instance` error after you enter your self-managed instance URL.
To resolve this issue, ensure all prerequisites for your installation method have been met:
diff --git a/doc/integration/jira/dvcs/index.md b/doc/integration/jira/dvcs/index.md
index 0406fef3f1e..80666a2d9f9 100644
--- a/doc/integration/jira/dvcs/index.md
+++ b/doc/integration/jira/dvcs/index.md
@@ -49,7 +49,8 @@ To create a GitLab application for DVCS:
To configure Jira for DVCS:
-1. Go to your DVCS account. **For Jira Server**, select **Settings (gear) > Applications > DVCS accounts**.
+1. On the top bar, in the upper-right corner, select **Administration** (**{settings}**) > **Applications**.
+1. On the left sidebar, select **DVCS accounts**.
1. To create a new integration, for **Host**, select **GitLab** or **GitLab Self-Managed**.
1. For **Team or User Account**, enter the relative path of a top-level GitLab group that [the GitLab user](#create-a-gitlab-application-for-dvcs) can access.
1. In the **Host URL** text box, enter the appropriate URL.
@@ -72,6 +73,10 @@ personal namespaces, repeat the previous steps with additional Jira DVCS account
Jira imports commits and branches for GitLab projects every 60 minutes. To refresh the data manually in Jira:
1. Sign in to your Jira instance as the user you configured the integration with.
-1. Go to **Settings (gear) > Applications**.
-1. Select **DVCS accounts**.
-1. In the **Last activity** column, next to the repository you want to refresh, select **Refresh** (**{retry}**).
+1. On the top bar, in the upper-right corner, select **Administration** (**{settings}**) > **Applications**.
+1. On the left sidebar, select **DVCS accounts**.
+1. To refresh one or more repositories in a DVCS account:
+ - **For all repositories**, next to the account, select the ellipsis (**{ellipsis_h}**) > **Refresh repositories**.
+ - **For a single repository**:
+ 1. Select the account.
+ 1. Hover over the repository you want to refresh, and in the **Last activity** column, select **Click to sync repository** (**{retry}**).
diff --git a/doc/integration/jira/jira_server_configuration.md b/doc/integration/jira/jira_server_configuration.md
index c840e1ebde5..672df5d615f 100644
--- a/doc/integration/jira/jira_server_configuration.md
+++ b/doc/integration/jira/jira_server_configuration.md
@@ -4,55 +4,55 @@ 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
---
-# Jira Server credentials **(FREE)**
+# Tutorial: Create Jira credentials **(FREE)**
-To [integrate Jira with GitLab](configure.md), you should create a separate Jira user account for your Jira projects
-to access projects in GitLab. This Jira user account must have write access to your Jira projects.
-To create the credentials:
+This tutorial shows you how to create Jira credentials. You can use your new Jira credentials to
+configure the [Jira issue integration](configure.md) in GitLab for Jira Data Center or Jira Server.
-1. [Create a Jira Server user](#create-a-jira-server-user).
-1. [Create a Jira Server group for the user](#create-a-jira-server-group-for-the-user).
+To create Jira credentials, here's what we're going to do:
+
+1. [Create a Jira user](#create-a-jira-user).
+1. [Create a Jira group for the user](#create-a-jira-group-for-the-user).
1. [Create a permission scheme for the group](#create-a-permission-scheme-for-the-group).
-Alternatively, you can use an existing Jira user account, provided the user belongs to a Jira group that
-has been granted the **Administer Projects** [permission scheme](#create-a-permission-scheme-for-the-group).
+Prerequisite:
+
+- You must have administrator access to the Jira instance.
+
+## Create a Jira user
-After you select a Jira user account, [configure the integration](configure.md#configure-the-integration) in GitLab to use the account.
+To create a Jira user:
-## Create a Jira Server user
+1. Sign in to your Jira instance as an administrator.
+1. On the top bar, in the upper-right corner, select **Administration** (**{settings}**) > **User management**.
+1. [Create a new user account](https://confluence.atlassian.com/adminjiraserver/create-edit-or-remove-a-user-938847025.html#Create,edit,orremoveauser-CreateusersmanuallyinJira) with write access to your Jira projects.
-To create a Jira Server user:
+ Alternatively, you can use an existing user account, provided the user belongs to a Jira group that has been granted
+ the **Administer Projects** [permission scheme](#create-a-permission-scheme-for-the-group).
-1. Sign in to your Jira instance as a Jira administrator.
-1. On the top bar, in the upper-right corner, select the gear icon, then
- select **User Management**.
-1. [Create a new user account manually](https://confluence.atlassian.com/adminjiraserver/create-edit-or-remove-a-user-938847025.html#Create,edit,orremoveauser-CreateusersmanuallyinJira) with write access to
- projects in Jira.
- - **Email address**: You should use a valid email address.
- - **Username**: Set the username to `gitlab`.
- - **Password**: You must set a password because the Jira issue integration does not
- support SSO such as SAML.
+ - In **Email address**, enter a valid email address.
+ - In **Username**, enter `gitlab`.
+ - In **Password**, enter a password (the Jira issue integration does not support SSO such as SAML).
1. Select **Create user**.
Now that you've created a user named `gitlab`, it's time to create a group for the user.
-## Create a Jira Server group for the user
+## Create a Jira group for the user
-To create a Jira Server group for the user:
+To create a Jira group for the user:
-1. Sign in to your Jira instance as a Jira administrator.
-1. On the top bar, in the upper-right corner, select the gear icon, then
- select **User Management**.
+1. Sign in to your Jira instance as an administrator.
+1. On the top bar, in the upper-right corner, select **Administration** (**{settings}**) > **User management**.
1. On the left sidebar, select **Groups**.
-1. In the **Add group** section, enter a **Name** for the group (for example,
+1. In the **Add group** section, enter a name for the group (for example,
`gitlab-developers`), then select **Add group**.
-1. To add the `gitlab` user to the `gitlab-developers` group, select **Edit members**.
+1. To add the `gitlab` user to the new `gitlab-developers` group, select **Edit members**.
The `gitlab-developers` group appears as a selected group.
<!-- vale gitlab.BadPlurals = NO -->
1. In the **Add members to selected group(s)** section, enter `gitlab`.
+<!-- vale gitlab.BadPlurals = YES -->
1. Select **Add selected users**.
The `gitlab` user appears as a group member.
-<!-- vale gitlab.BadPlurals = YES -->
Now that you've added the `gitlab` user to a new group named `gitlab-developers`,
it's time to create a permission scheme for the group.
@@ -61,15 +61,18 @@ it's time to create a permission scheme for the group.
To create a permission scheme for the group:
-1. Sign in to your Jira instance as a Jira administrator.
-1. On the top bar, in the upper-right corner, select the gear icon, then
- select **Issues**.
-1. On the left sidebar, select **Permission Schemes**.
-1. Select **Add Permission Scheme**, enter a **Name** and (optionally) a
- **Description**, then select **Add**.
-1. In the permissions scheme list, locate your new permissions scheme, and
- select **Permissions**.
+1. Sign in to your Jira instance as an administrator.
+1. On the top bar, in the upper-right corner, select **Administration** (**{settings}**) > **Issues**.
+1. On the left sidebar, select **Permission schemes**.
+1. Select **Add permission scheme**.
+1. In the **Add permission scheme** dialog:
+ - Enter a name for the scheme.
+ - Optional. Enter a description for the scheme.
+1. Select **Add**.
+1. On the **Permission schemes** page, in the **Actions** column, select **Permissions** for the new scheme.
1. Next to **Administer Projects**, select **Edit**.
+1. In the **Grant permission** dialog, for **Granted to**, select **Group**.
1. From the **Group** dropdown list, select `gitlab-developers`, then select **Grant**.
-You need the new Jira username and password when you [configure the integration](configure.md#configure-the-integration) in GitLab.
+You've done it! You can now use your new Jira username and password to configure the
+[Jira issue integration](configure.md) in GitLab for Jira Data Center or Jira Server.
diff --git a/doc/topics/offline/quick_start_guide.md b/doc/topics/offline/quick_start_guide.md
index 57c7a80fa3e..e51e015dddf 100644
--- a/doc/topics/offline/quick_start_guide.md
+++ b/doc/topics/offline/quick_start_guide.md
@@ -4,7 +4,7 @@ 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
---
-# Getting started with an offline GitLab Installation **(FREE SELF)**
+# Install an offline self-managed GitLab instance **(FREE SELF)**
This is a step-by-step guide that helps you install, configure, and use a self-managed GitLab
instance entirely offline.
diff --git a/doc/tutorials/develop.md b/doc/tutorials/develop.md
index 08497a09830..89fa957fd08 100644
--- a/doc/tutorials/develop.md
+++ b/doc/tutorials/develop.md
@@ -13,5 +13,6 @@ enabling you to work with those services directly from GitLab.
| Topic | Description | Good for beginners |
|-------|-------------|--------------------|
-| [Integrate with Jira](https://about.gitlab.com/blog/2021/04/12/gitlab-jira-integration-selfmanaged/) | Configure the Jira integration, so you can work with Jira issues from GitLab. | |
-| [Integrate with Gitpod](https://about.gitlab.com/blog/2021/07/19/teams-gitpod-integration-gitlab-speed-up-development/) | Integrate with Gitpod, to help speed up your development. | |
+| [Create Jira credentials](../integration/jira/jira_server_configuration.md) | Create Jira credentials to configure the Jira issue integration in GitLab. | |
+| [Integrate with Jira](https://about.gitlab.com/blog/2021/04/12/gitlab-jira-integration-selfmanaged/) | Configure the Jira issue integration to connect one or more GitLab projects to a Jira instance. | |
+| [Integrate with Gitpod](https://about.gitlab.com/blog/2021/07/19/teams-gitpod-integration-gitlab-speed-up-development/) | Integrate with Gitpod to set up a development environment for any GitLab project. | |
diff --git a/doc/user/search/index.md b/doc/user/search/index.md
index f6733abd305..24bc31a103f 100644
--- a/doc/user/search/index.md
+++ b/doc/user/search/index.md
@@ -96,8 +96,6 @@ To filter code search results by one or more languages:
## Search for projects by full path
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/108906) in GitLab 15.9 [with a flag](../../administration/feature_flags.md) named `full_path_project_search`. Disabled by default.
-> - [Enabled](https://gitlab.com/gitlab-org/gitlab/-/issues/388473) on GitLab.com in GitLab 15.9.
-> - [Enabled](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/111808) on self-managed GitLab 15.10.
> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/114932) in GitLab 15.11. Feature flag `full_path_project_search` removed.
You can search for a project by entering its full path (including the namespace it belongs to) in the search box.
@@ -108,6 +106,12 @@ For example, the search query:
- `gitlab-org/gitlab` searches for the `gitlab` project in the `gitlab-org` namespace.
- `gitlab-org/` displays autocomplete suggestions for projects that belong to the `gitlab-org` namespace.
+### Search archived projects
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121981) in GitLab 16.1.
+
+By default, archived projects are excluded from the search results. To include archived projects, add the parameter `include_archived=true` to the URL.
+
## Search for a SHA
You can search for a commit SHA.
diff --git a/lib/gitlab/search_results.rb b/lib/gitlab/search_results.rb
index 93befc2df57..5d2dc2f7d19 100644
--- a/lib/gitlab/search_results.rb
+++ b/lib/gitlab/search_results.rb
@@ -174,7 +174,9 @@ module Gitlab
# rubocop: enable CodeReuse/ActiveRecord
def projects
- limit_projects.search(query)
+ scope = limit_projects
+ scope = filters[:include_archived] ? scope : scope.non_archived
+ scope.search(query)
end
def issues(finder_params = {})
diff --git a/lib/gitlab/usage_data.rb b/lib/gitlab/usage_data.rb
index 846bb934a3d..83dc8c5dcf8 100644
--- a/lib/gitlab/usage_data.rb
+++ b/lib/gitlab/usage_data.rb
@@ -42,14 +42,11 @@ module Gitlab
clear_memoized
with_finished_at(:recording_ce_finished_at) do
- usage_data_metrics
+ { recorded_at: recorded_at }
+ .merge(usage_data_metrics)
end
end
- def license_usage_data
- { recorded_at: recorded_at }
- end
-
def recorded_at
@recorded_at ||= Time.current
end
@@ -552,8 +549,7 @@ module Gitlab
end
def usage_data_metrics
- license_usage_data
- .merge(system_usage_data_license)
+ system_usage_data_license
.merge(system_usage_data_settings)
.merge(system_usage_data)
.merge(system_usage_data_monthly)
diff --git a/lib/tasks/gitlab/tw/codeowners.rake b/lib/tasks/gitlab/tw/codeowners.rake
index 3c1bcfdddfa..3b45b217b08 100644
--- a/lib/tasks/gitlab/tw/codeowners.rake
+++ b/lib/tasks/gitlab/tw/codeowners.rake
@@ -71,7 +71,7 @@ namespace :tw do
CodeOwnerRule.new('Runner', '@fneill'),
CodeOwnerRule.new('Runner SaaS', '@fneill'),
CodeOwnerRule.new('Security Policies', '@rdickenson'),
- CodeOwnerRule.new('Source Code', '@aqualls'),
+ CodeOwnerRule.new('Source Code', '@aqualls @msedlakjakubowski'),
CodeOwnerRule.new('Static Analysis', '@rdickenson'),
CodeOwnerRule.new('Style Guide', '@sselhorn'),
CodeOwnerRule.new('Tenant Scale', '@lciutacu'),
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 58d24b3ef68..40516f87ad7 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -2960,9 +2960,6 @@ msgstr ""
msgid "Admin Area / Dashboard"
msgstr ""
-msgid "Admin Mode"
-msgstr ""
-
msgid "Admin Note"
msgstr ""
@@ -2972,6 +2969,9 @@ msgstr ""
msgid "Admin message"
msgstr ""
+msgid "Admin mode"
+msgstr ""
+
msgid "Admin mode already enabled"
msgstr ""
@@ -11911,6 +11911,9 @@ msgstr ""
msgid "Container Scanning"
msgstr ""
+msgid "Container must be a group."
+msgstr ""
+
msgid "Container must be a project or a group."
msgstr ""
@@ -16971,9 +16974,6 @@ msgstr ""
msgid "Enter %{weights_link_start}weights%{weights_link_end} for storages for new repositories. Configured storages appear below."
msgstr ""
-msgid "Enter 2FA for Admin Mode"
-msgstr ""
-
msgid "Enter a name for your comment template"
msgstr ""
@@ -24282,7 +24282,7 @@ msgstr ""
msgid "Integrations|Failed to unlink namespace. Please try again."
msgstr ""
-msgid "Integrations|Failed to update GitLab version. Please try again."
+msgid "Integrations|Failed to update the GitLab instance. See the %{linkStart}troubleshooting documentation%{linkEnd}."
msgstr ""
msgid "Integrations|GitLab administrators can set up integrations that all groups and projects inherit and use by default. These integrations apply to all groups and projects that don't already use custom settings. You can override custom settings for a group or project if the settings are necessary at that level. Learn more about %{integrations_link_start}instance-level integration management%{link_end}."
@@ -29512,6 +29512,9 @@ msgstr ""
msgid "NamespaceLimits|Confirm limits change"
msgstr ""
+msgid "NamespaceLimits|Enter a valid number greater or equal to zero."
+msgstr ""
+
msgid "NamespaceLimits|Exclude"
msgstr ""
@@ -47991,6 +47994,9 @@ msgstr ""
msgid "Two-factor authentication disabled"
msgstr ""
+msgid "Two-factor authentication for admin mode"
+msgstr ""
+
msgid "Two-factor authentication grace period"
msgstr ""
@@ -51340,6 +51346,9 @@ msgstr ""
msgid "WorkItem|Child objectives and key results"
msgstr ""
+msgid "WorkItem|Child removal reverted"
+msgstr ""
+
msgid "WorkItem|Child removed"
msgstr ""
@@ -52086,6 +52095,9 @@ msgstr ""
msgid "You do not have any subscriptions yet"
msgstr ""
+msgid "You do not have permission to access DORA4 metrics."
+msgstr ""
+
msgid "You do not have permission to access dora metrics."
msgstr ""
diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb
index a721722a5c3..537424093fb 100644
--- a/spec/controllers/admin/application_settings_controller_spec.rb
+++ b/spec/controllers/admin/application_settings_controller_spec.rb
@@ -59,7 +59,7 @@ RSpec.describe Admin::ApplicationSettingsController, :do_not_mock_admin_mode_set
end
end
- describe 'GET #usage_data', feature_category: :service_ping do
+ describe 'GET #usage_data', :with_license, feature_category: :service_ping do
before do
stub_usage_data_connections
stub_database_flavor_check
diff --git a/spec/controllers/admin/instance_review_controller_spec.rb b/spec/controllers/admin/instance_review_controller_spec.rb
index f0225a71e00..b69d22ba1e3 100644
--- a/spec/controllers/admin/instance_review_controller_spec.rb
+++ b/spec/controllers/admin/instance_review_controller_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe Admin::InstanceReviewController, feature_category: :service_ping
subject { post :index }
- context 'with usage ping enabled' do
+ context 'with usage ping enabled', :with_license do
before do
stub_application_setting(usage_ping_enabled: true)
stub_usage_data_connections
diff --git a/spec/controllers/search_controller_spec.rb b/spec/controllers/search_controller_spec.rb
index 497e2d84f4f..6c48962210d 100644
--- a/spec/controllers/search_controller_spec.rb
+++ b/spec/controllers/search_controller_spec.rb
@@ -557,6 +557,7 @@ RSpec.describe SearchController, feature_category: :global_search do
project_id: '456',
project_ids: %w(456 789),
confidential: true,
+ include_archived: true,
state: true,
force_search_results: true,
language: 'ruby'
diff --git a/spec/features/admin/admin_settings_spec.rb b/spec/features/admin/admin_settings_spec.rb
index 1f43caf37e7..d3b43029f2a 100644
--- a/spec/features/admin/admin_settings_spec.rb
+++ b/spec/features/admin/admin_settings_spec.rb
@@ -977,7 +977,7 @@ RSpec.describe 'Admin updates settings', feature_category: :shared do
end
end
- context 'Service usage data page' do
+ context 'Service usage data page', :with_license do
before do
stub_usage_data_connections
stub_database_flavor_check
diff --git a/spec/features/boards/sidebar_assignee_spec.rb b/spec/features/boards/sidebar_assignee_spec.rb
index e3de594f856..a912ea28ddc 100644
--- a/spec/features/boards/sidebar_assignee_spec.rb
+++ b/spec/features/boards/sidebar_assignee_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe 'Project issue boards sidebar assignee', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332230',
+RSpec.describe 'Project issue boards sidebar assignee', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332078',
feature_category: :team_planning do
include BoardHelpers
diff --git a/spec/features/issues/user_creates_branch_and_merge_request_spec.rb b/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
index 6d9eb3a7191..1050bc2456f 100644
--- a/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
+++ b/spec/features/issues/user_creates_branch_and_merge_request_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe 'User creates branch and merge request on issue page', :js, featu
end
# In order to improve tests performance, all UI checks are placed in this test.
- it 'shows elements', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/27993' do
+ it 'shows elements' do
button_create_merge_request = find('.js-create-merge-request')
button_toggle_dropdown = find('.create-mr-dropdown-wrap .dropdown-toggle')
diff --git a/spec/features/users/signup_spec.rb b/spec/features/users/signup_spec.rb
index d65eea3671c..ccecd8bfcad 100644
--- a/spec/features/users/signup_spec.rb
+++ b/spec/features/users/signup_spec.rb
@@ -162,7 +162,7 @@ RSpec.describe 'Signup', :js, feature_category: :user_profile do
expect(page).to have_content("Invalid input, please avoid emojis")
end
- it 'shows a pending message if the username availability is being fetched', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/31484' do
+ it 'shows a pending message if the username availability is being fetched' do
fill_in 'new_user_username', with: 'new-user'
expect(find('.username > .validation-pending')).not_to have_css '.hide'
diff --git a/spec/frontend/ci/artifacts/components/job_artifacts_table_spec.js b/spec/frontend/ci/artifacts/components/job_artifacts_table_spec.js
index 046302d07c1..9a16fac7406 100644
--- a/spec/frontend/ci/artifacts/components/job_artifacts_table_spec.js
+++ b/spec/frontend/ci/artifacts/components/job_artifacts_table_spec.js
@@ -370,6 +370,38 @@ describe('JobArtifactsTable component', () => {
expect(findBrowseButton().attributes('disabled')).toBeDefined();
});
+
+ it('is disabled when job has no metadata.gz', async () => {
+ const jobWithoutMetadata = {
+ ...job,
+ artifacts: { nodes: [archiveArtifact] },
+ };
+
+ createComponent({
+ handlers: { getJobArtifactsQuery: jest.fn() },
+ data: { jobArtifacts: [jobWithoutMetadata] },
+ });
+
+ await waitForPromises();
+
+ expect(findBrowseButton().attributes('disabled')).toBe('disabled');
+ });
+
+ it('is disabled when job has no artifacts', async () => {
+ const jobWithoutArtifacts = {
+ ...job,
+ artifacts: { nodes: [] },
+ };
+
+ createComponent({
+ handlers: { getJobArtifactsQuery: jest.fn() },
+ data: { jobArtifacts: [jobWithoutArtifacts] },
+ });
+
+ await waitForPromises();
+
+ expect(findBrowseButton().attributes('disabled')).toBe('disabled');
+ });
});
describe('delete button', () => {
diff --git a/spec/frontend/fixtures/static/whats_new_notification.html b/spec/frontend/fixtures/static/whats_new_notification.html
index 3b4dbdf7d36..bc8a27c779f 100644
--- a/spec/frontend/fixtures/static/whats_new_notification.html
+++ b/spec/frontend/fixtures/static/whats_new_notification.html
@@ -1,5 +1,6 @@
<div class='whats-new-notification-fixture-root'>
<div class='app' data-version-digest='version-digest'></div>
+ <div data-testid='without-digest'></div>
<div class='header-help'>
<div class='js-whats-new-notification-count'></div>
</div>
diff --git a/spec/frontend/whats_new/components/app_spec.js b/spec/frontend/whats_new/components/app_spec.js
index 000b07f4dfd..b74473b5494 100644
--- a/spec/frontend/whats_new/components/app_spec.js
+++ b/spec/frontend/whats_new/components/app_spec.js
@@ -5,6 +5,7 @@ import Vuex from 'vuex';
import { mockTracking, unmockTracking, triggerEvent } from 'helpers/tracking_helper';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import App from '~/whats_new/components/app.vue';
+import SkeletonLoader from '~/whats_new/components/skeleton_loader.vue';
import { getDrawerBodyHeight } from '~/whats_new/utils/get_drawer_body_height';
const MOCK_DRAWER_BODY_HEIGHT = 42;
@@ -38,6 +39,7 @@ describe('App', () => {
open: true,
features: [],
drawerBodyHeight: null,
+ fetching: false,
};
store = new Vuex.Store({
@@ -55,18 +57,18 @@ describe('App', () => {
};
const findInfiniteScroll = () => wrapper.findComponent(GlInfiniteScroll);
+ const findSkeletonLoader = () => wrapper.findComponent(SkeletonLoader);
- const setup = async () => {
+ const setup = async (features, fetching) => {
document.body.dataset.page = 'test-page';
document.body.dataset.namespaceId = 'namespace-840';
trackingSpy = mockTracking('_category_', null, jest.spyOn);
buildWrapper();
- wrapper.vm.$store.state.features = [
- { name: 'Whats New Drawer', documentation_link: 'www.url.com', release: 3.11 },
- ];
- wrapper.vm.$store.state.drawerBodyHeight = MOCK_DRAWER_BODY_HEIGHT;
+ store.state.features = features;
+ store.state.fetching = fetching;
+ store.state.drawerBodyHeight = MOCK_DRAWER_BODY_HEIGHT;
await nextTick();
};
@@ -75,110 +77,144 @@ describe('App', () => {
});
describe('gitlab.com', () => {
- beforeEach(() => {
- setup();
- });
+ describe('with features', () => {
+ beforeEach(() => {
+ setup(
+ [{ name: 'Whats New Drawer', documentation_link: 'www.url.com', release: 3.11 }],
+ false,
+ );
+ });
- const getDrawer = () => wrapper.findComponent(GlDrawer);
- const getBackdrop = () => wrapper.find('.whats-new-modal-backdrop');
+ const getDrawer = () => wrapper.findComponent(GlDrawer);
+ const getBackdrop = () => wrapper.find('.whats-new-modal-backdrop');
- it('contains a drawer', () => {
- expect(getDrawer().exists()).toBe(true);
- });
+ it('contains a drawer', () => {
+ expect(getDrawer().exists()).toBe(true);
+ });
- it('dispatches openDrawer and tracking calls when mounted', () => {
- expect(actions.openDrawer).toHaveBeenCalledWith(expect.any(Object), 'version-digest');
- expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_whats_new_drawer', {
- label: 'namespace_id',
- property: 'navigation_top',
- value: 'namespace-840',
+ it('dispatches openDrawer and tracking calls when mounted', () => {
+ expect(actions.openDrawer).toHaveBeenCalledWith(expect.any(Object), 'version-digest');
+ expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_whats_new_drawer', {
+ label: 'namespace_id',
+ property: 'navigation_top',
+ value: 'namespace-840',
+ });
});
- });
- it('dispatches closeDrawer when clicking close', () => {
- getDrawer().vm.$emit('close');
- expect(actions.closeDrawer).toHaveBeenCalled();
- });
+ it('dispatches closeDrawer when clicking close', () => {
+ getDrawer().vm.$emit('close');
+ expect(actions.closeDrawer).toHaveBeenCalled();
+ });
- it('dispatches closeDrawer when clicking the backdrop', () => {
- getBackdrop().trigger('click');
- expect(actions.closeDrawer).toHaveBeenCalled();
- });
+ it('dispatches closeDrawer when clicking the backdrop', () => {
+ getBackdrop().trigger('click');
+ expect(actions.closeDrawer).toHaveBeenCalled();
+ });
- it.each([true, false])('passes open property', async (openState) => {
- wrapper.vm.$store.state.open = openState;
+ it.each([true, false])('passes open property', async (openState) => {
+ store.state.open = openState;
- await nextTick();
+ await nextTick();
- expect(getDrawer().props('open')).toBe(openState);
- });
+ expect(getDrawer().props('open')).toBe(openState);
+ });
- it('renders features when provided via ajax', () => {
- expect(actions.fetchItems).toHaveBeenCalled();
- expect(wrapper.find('[data-test-id="feature-name"]').text()).toBe('Whats New Drawer');
- });
+ it('renders features when provided via ajax', () => {
+ expect(actions.fetchItems).toHaveBeenCalled();
+ expect(wrapper.find('[data-test-id="feature-name"]').text()).toBe('Whats New Drawer');
+ });
- it('send an event when feature item is clicked', () => {
- trackingSpy = mockTracking('_category_', wrapper.element, jest.spyOn);
+ it('send an event when feature item is clicked', () => {
+ trackingSpy = mockTracking('_category_', wrapper.element, jest.spyOn);
- const link = wrapper.find('.whats-new-item-title-link');
- triggerEvent(link.element);
+ const link = wrapper.find('.whats-new-item-title-link');
+ triggerEvent(link.element);
- expect(trackingSpy.mock.calls[1]).toMatchObject([
- '_category_',
- 'click_whats_new_item',
- {
- label: 'Whats New Drawer',
- property: 'www.url.com',
- },
- ]);
- });
+ expect(trackingSpy.mock.calls[1]).toMatchObject([
+ '_category_',
+ 'click_whats_new_item',
+ {
+ label: 'Whats New Drawer',
+ property: 'www.url.com',
+ },
+ ]);
+ });
- it('renders infinite scroll', () => {
- const scroll = findInfiniteScroll();
+ it('renders infinite scroll', () => {
+ const scroll = findInfiniteScroll();
+ const skeletonLoader = findSkeletonLoader();
- expect(scroll.props()).toMatchObject({
- fetchedItems: wrapper.vm.$store.state.features.length,
- maxListHeight: MOCK_DRAWER_BODY_HEIGHT,
+ expect(skeletonLoader.exists()).toBe(false);
+
+ expect(scroll.props()).toMatchObject({
+ fetchedItems: store.state.features.length,
+ maxListHeight: MOCK_DRAWER_BODY_HEIGHT,
+ });
});
- });
- describe('bottomReached', () => {
- const emitBottomReached = () => findInfiniteScroll().vm.$emit('bottomReached');
+ describe('bottomReached', () => {
+ const emitBottomReached = () => findInfiniteScroll().vm.$emit('bottomReached');
- beforeEach(() => {
- actions.fetchItems.mockClear();
- });
+ beforeEach(() => {
+ actions.fetchItems.mockClear();
+ });
+
+ it('when nextPage exists it calls fetchItems', () => {
+ store.state.pageInfo = { nextPage: 840 };
+ emitBottomReached();
+
+ expect(actions.fetchItems).toHaveBeenCalledWith(expect.anything(), {
+ page: 840,
+ versionDigest: 'version-digest',
+ });
+ });
- it('when nextPage exists it calls fetchItems', () => {
- wrapper.vm.$store.state.pageInfo = { nextPage: 840 };
- emitBottomReached();
+ it('when nextPage does not exist it does not call fetchItems', () => {
+ store.state.pageInfo = { nextPage: null };
+ emitBottomReached();
- expect(actions.fetchItems).toHaveBeenCalledWith(expect.anything(), {
- page: 840,
- versionDigest: 'version-digest',
+ expect(actions.fetchItems).not.toHaveBeenCalled();
});
});
- it('when nextPage does not exist it does not call fetchItems', () => {
- wrapper.vm.$store.state.pageInfo = { nextPage: null };
- emitBottomReached();
+ it('calls getDrawerBodyHeight and setDrawerBodyHeight when resize directive is triggered', () => {
+ const { value } = getBinding(getDrawer().element, 'gl-resize-observer');
- expect(actions.fetchItems).not.toHaveBeenCalled();
+ value();
+
+ expect(getDrawerBodyHeight).toHaveBeenCalledWith(wrapper.findComponent(GlDrawer).element);
+
+ expect(actions.setDrawerBodyHeight).toHaveBeenCalledWith(
+ expect.any(Object),
+ MOCK_DRAWER_BODY_HEIGHT,
+ );
});
});
- it('calls getDrawerBodyHeight and setDrawerBodyHeight when resize directive is triggered', () => {
- const { value } = getBinding(getDrawer().element, 'gl-resize-observer');
+ describe('without features', () => {
+ it('renders skeleton loader when fetching', async () => {
+ setup([], true);
+
+ await nextTick();
+
+ const scroll = findInfiniteScroll();
+ const skeletonLoader = findSkeletonLoader();
- value();
+ expect(scroll.exists()).toBe(false);
+ expect(skeletonLoader.exists()).toBe(true);
+ });
+
+ it('renders infinite scroll loader when NOT fetching', async () => {
+ setup([], false);
- expect(getDrawerBodyHeight).toHaveBeenCalledWith(wrapper.findComponent(GlDrawer).element);
+ await nextTick();
- expect(actions.setDrawerBodyHeight).toHaveBeenCalledWith(
- expect.any(Object),
- MOCK_DRAWER_BODY_HEIGHT,
- );
+ const scroll = findInfiniteScroll();
+ const skeletonLoader = findSkeletonLoader();
+
+ expect(scroll.exists()).toBe(true);
+ expect(skeletonLoader.exists()).toBe(false);
+ });
});
});
});
diff --git a/spec/frontend/whats_new/utils/notification_spec.js b/spec/frontend/whats_new/utils/notification_spec.js
index 8b5663ee764..020d833c578 100644
--- a/spec/frontend/whats_new/utils/notification_spec.js
+++ b/spec/frontend/whats_new/utils/notification_spec.js
@@ -38,6 +38,7 @@ describe('~/whats_new/utils/notification', () => {
it('removes class and count element when storage key has current digest', () => {
const notificationEl = findNotificationEl();
+
notificationEl.classList.add('with-notifications');
localStorage.setItem('display-whats-new-notification', 'version-digest');
@@ -48,6 +49,20 @@ describe('~/whats_new/utils/notification', () => {
expect(findNotificationCountEl()).toBe(null);
expect(notificationEl.classList).not.toContain('with-notifications');
});
+
+ it('removes class and count element when no records and digest undefined', () => {
+ const notificationEl = findNotificationEl();
+
+ notificationEl.classList.add('with-notifications');
+ localStorage.setItem('display-whats-new-notification', 'version-digest');
+
+ expect(findNotificationCountEl()).not.toBe(null);
+
+ setNotification(wrapper.querySelector('[data-testid="without-digest"]'));
+
+ expect(findNotificationCountEl()).toBe(null);
+ expect(notificationEl.classList).not.toContain('with-notifications');
+ });
});
describe('getVersionDigest', () => {
diff --git a/spec/frontend/work_items/components/work_item_links/work_item_children_wrapper_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_children_wrapper_spec.js
index 805f243cc00..bbd114c124d 100644
--- a/spec/frontend/work_items/components/work_item_links/work_item_children_wrapper_spec.js
+++ b/spec/frontend/work_items/components/work_item_links/work_item_children_wrapper_spec.js
@@ -6,16 +6,28 @@ import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import waitForPromises from 'helpers/wait_for_promises';
import WorkItemChildrenWrapper from '~/work_items/components/work_item_links/work_item_children_wrapper.vue';
import WorkItemLinkChild from '~/work_items/components/work_item_links/work_item_link_child.vue';
+import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
-import { childrenWorkItems, workItemByIidResponseFactory } from '../../mock_data';
+import {
+ changeWorkItemParentMutationResponse,
+ childrenWorkItems,
+ updateWorkItemMutationErrorResponse,
+ workItemByIidResponseFactory,
+} from '../../mock_data';
describe('WorkItemChildrenWrapper', () => {
let wrapper;
+ const $toast = {
+ show: jest.fn(),
+ };
const getWorkItemQueryHandler = jest.fn().mockResolvedValue(workItemByIidResponseFactory());
+ const updateWorkItemMutationHandler = jest
+ .fn()
+ .mockResolvedValue(changeWorkItemParentMutationResponse);
const findWorkItemLinkChildItems = () => wrapper.findAllComponents(WorkItemLinkChild);
@@ -25,9 +37,13 @@ describe('WorkItemChildrenWrapper', () => {
workItemType = 'Objective',
confidential = false,
children = childrenWorkItems,
+ mutationHandler = updateWorkItemMutationHandler,
} = {}) => {
wrapper = shallowMountExtended(WorkItemChildrenWrapper, {
- apolloProvider: createMockApollo([[workItemByIidQuery, getWorkItemQueryHandler]]),
+ apolloProvider: createMockApollo([
+ [workItemByIidQuery, getWorkItemQueryHandler],
+ [updateWorkItemMutation, mutationHandler],
+ ]),
provide: {
fullPath: 'test/project',
},
@@ -37,6 +53,9 @@ describe('WorkItemChildrenWrapper', () => {
confidential,
children,
},
+ mocks: {
+ $toast,
+ },
});
};
@@ -50,16 +69,6 @@ describe('WorkItemChildrenWrapper', () => {
);
});
- it('remove event on child triggers `removeChild` event', () => {
- createComponent();
- const workItem = { id: 'gid://gitlab/WorkItem/2' };
- const firstChild = findWorkItemLinkChildItems().at(0);
-
- firstChild.vm.$emit('removeChild', workItem);
-
- expect(wrapper.emitted('removeChild')).toEqual([[workItem]]);
- });
-
it('emits `show-modal` on `click` event', () => {
createComponent();
const firstChild = findWorkItemLinkChildItems().at(0);
@@ -94,4 +103,47 @@ describe('WorkItemChildrenWrapper', () => {
}
},
);
+
+ describe('when removing child work item', () => {
+ const workItem = { id: 'gid://gitlab/WorkItem/2' };
+
+ describe('when successful', () => {
+ beforeEach(async () => {
+ createComponent();
+ findWorkItemLinkChildItems().at(0).vm.$emit('removeChild', workItem);
+ await waitForPromises();
+ });
+
+ it('calls a mutation to update the work item', () => {
+ expect(updateWorkItemMutationHandler).toHaveBeenCalledWith({
+ input: {
+ id: workItem.id,
+ hierarchyWidget: {
+ parentId: null,
+ },
+ },
+ });
+ });
+
+ it('shows a toast', () => {
+ expect($toast.show).toHaveBeenCalledWith('Child removed', {
+ action: { onClick: expect.anything(), text: 'Undo' },
+ });
+ });
+ });
+
+ describe('when not successful', () => {
+ beforeEach(async () => {
+ createComponent({
+ mutationHandler: jest.fn().mockResolvedValue(updateWorkItemMutationErrorResponse),
+ });
+ findWorkItemLinkChildItems().at(0).vm.$emit('removeChild', workItem);
+ await waitForPromises();
+ });
+
+ it('emits an error message', () => {
+ expect(wrapper.emitted('error')).toEqual([['Something went wrong while removing child.']]);
+ });
+ });
+ });
});
diff --git a/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js
index a33177d75a2..7acbd769b6e 100644
--- a/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js
+++ b/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js
@@ -13,18 +13,15 @@ import WorkItemChildrenWrapper from '~/work_items/components/work_item_links/wor
import WorkItemDetailModal from '~/work_items/components/work_item_detail_modal.vue';
import AbuseCategorySelector from '~/abuse_reports/components/abuse_category_selector.vue';
import { FORM_TYPES } from '~/work_items/constants';
-import changeWorkItemParentMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
import {
getIssueDetailsResponse,
workItemHierarchyResponse,
workItemHierarchyEmptyResponse,
workItemHierarchyNoUpdatePermissionResponse,
- changeWorkItemParentMutationResponse,
workItemByIidResponseFactory,
workItemQueryResponse,
mockWorkItemCommentNote,
- childrenWorkItems,
} from '../../mock_data';
Vue.use(VueApollo);
@@ -35,15 +32,6 @@ describe('WorkItemLinks', () => {
let wrapper;
let mockApollo;
- const WORK_ITEM_ID = 'gid://gitlab/WorkItem/2';
-
- const $toast = {
- show: jest.fn(),
- };
-
- const mutationChangeParentHandler = jest
- .fn()
- .mockResolvedValue(changeWorkItemParentMutationResponse);
const responseWithAddChildPermission = jest.fn().mockResolvedValue(workItemHierarchyResponse);
const responseWithoutAddChildPermission = jest
.fn()
@@ -51,14 +39,12 @@ describe('WorkItemLinks', () => {
const createComponent = async ({
fetchHandler = responseWithAddChildPermission,
- mutationHandler = mutationChangeParentHandler,
issueDetailsQueryHandler = jest.fn().mockResolvedValue(getIssueDetailsResponse()),
hasIterationsFeature = false,
} = {}) => {
mockApollo = createMockApollo(
[
[workItemByIidQuery, fetchHandler],
- [changeWorkItemParentMutation, mutationHandler],
[issueDetailsQuery, issueDetailsQueryHandler],
],
resolvers,
@@ -76,9 +62,6 @@ describe('WorkItemLinks', () => {
issuableIid: 1,
},
apolloProvider: mockApollo,
- mocks: {
- $toast,
- },
stubs: {
WorkItemDetailModal: stubComponent(WorkItemDetailModal, {
methods: {
@@ -116,8 +99,7 @@ describe('WorkItemLinks', () => {
`(
'$expectedAssertion "Add" button in hierarchy widget header when "userPermissions.adminParentLink" is $value',
async ({ workItemFetchHandler, value }) => {
- createComponent({ fetchHandler: workItemFetchHandler });
- await waitForPromises();
+ await createComponent({ fetchHandler: workItemFetchHandler });
expect(findToggleFormDropdown().exists()).toBe(value);
},
@@ -224,50 +206,6 @@ describe('WorkItemLinks', () => {
});
});
- describe('remove child', () => {
- let firstChild;
-
- beforeEach(async () => {
- await createComponent({ mutationHandler: mutationChangeParentHandler });
-
- [firstChild] = childrenWorkItems;
- });
-
- it('calls correct mutation with correct variables', async () => {
- findWorkItemLinkChildrenWrapper().vm.$emit('removeChild', firstChild);
-
- await waitForPromises();
-
- expect(mutationChangeParentHandler).toHaveBeenCalledWith({
- input: {
- id: WORK_ITEM_ID,
- hierarchyWidget: {
- parentId: null,
- },
- },
- });
- });
-
- it('shows toast when mutation succeeds', async () => {
- findWorkItemLinkChildrenWrapper().vm.$emit('removeChild', firstChild);
-
- await waitForPromises();
-
- expect($toast.show).toHaveBeenCalledWith('Child removed', {
- action: { onClick: expect.anything(), text: 'Undo' },
- });
- });
-
- it('renders correct number of children after removal', async () => {
- expect(findWorkItemLinkChildrenWrapper().props().children).toHaveLength(4);
-
- findWorkItemLinkChildrenWrapper().vm.$emit('removeChild', firstChild);
- await waitForPromises();
-
- expect(findWorkItemLinkChildrenWrapper().props().children).toHaveLength(3);
- });
- });
-
describe('when parent item is confidential', () => {
it('passes correct confidentiality status to form', async () => {
await createComponent({
diff --git a/spec/frontend/work_items/components/work_item_links/work_item_tree_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_tree_spec.js
index 06716584879..f3aa347f389 100644
--- a/spec/frontend/work_items/components/work_item_links/work_item_tree_spec.js
+++ b/spec/frontend/work_items/components/work_item_links/work_item_tree_spec.js
@@ -1,6 +1,7 @@
import { nextTick } from 'vue';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import WidgetWrapper from '~/work_items/components/widget_wrapper.vue';
import WorkItemTree from '~/work_items/components/work_item_links/work_item_tree.vue';
import WorkItemChildrenWrapper from '~/work_items/components/work_item_links/work_item_children_wrapper.vue';
import WorkItemLinksForm from '~/work_items/components/work_item_links/work_item_links_form.vue';
@@ -19,6 +20,7 @@ describe('WorkItemTree', () => {
const findEmptyState = () => wrapper.findByTestId('tree-empty');
const findToggleFormSplitButton = () => wrapper.findComponent(OkrActionsSplitButton);
const findForm = () => wrapper.findComponent(WorkItemLinksForm);
+ const findWidgetWrapper = () => wrapper.findComponent(WidgetWrapper);
const findWorkItemLinkChildrenWrapper = () => wrapper.findComponent(WorkItemChildrenWrapper);
const createComponent = ({
@@ -70,6 +72,16 @@ describe('WorkItemTree', () => {
expect(findForm().exists()).toBe(false);
});
+ it('shows an error message on error', async () => {
+ const errorMessage = 'Some error';
+ createComponent();
+
+ findWorkItemLinkChildrenWrapper().vm.$emit('error', errorMessage);
+ await nextTick();
+
+ expect(findWidgetWrapper().props('error')).toBe(errorMessage);
+ });
+
it.each`
option | event | formType | childType
${'New objective'} | ${'showCreateObjectiveForm'} | ${FORM_TYPES.create} | ${WORK_ITEM_TYPE_ENUM_OBJECTIVE}
diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb
index b5e5e5a711f..c0f129cefc3 100644
--- a/spec/helpers/search_helper_spec.rb
+++ b/spec/helpers/search_helper_spec.rb
@@ -805,22 +805,38 @@ RSpec.describe SearchHelper, feature_category: :global_search do
allow(self).to receive(:current_user).and_return(:the_current_user)
end
- where(:confidential, :expected) do
+ where(:input, :expected) do
'0' | false
'1' | true
'yes' | true
'no' | false
+ 'true' | true
+ 'false' | false
true | true
false | false
end
- let(:params) { { confidential: confidential } }
+ describe 'for confidential' do
+ let(:params) { { confidential: input } }
- with_them do
- it 'transforms confidentiality param' do
- expect(::SearchService).to receive(:new).with(:the_current_user, { confidential: expected })
+ with_them do
+ it 'transforms param' do
+ expect(::SearchService).to receive(:new).with(:the_current_user, { confidential: expected })
- subject
+ subject
+ end
+ end
+ end
+
+ describe 'for include_archived' do
+ let(:params) { { include_archived: input } }
+
+ with_them do
+ it 'transforms param' do
+ expect(::SearchService).to receive(:new).with(:the_current_user, { include_archived: expected })
+
+ subject
+ end
end
end
end
diff --git a/spec/lib/gitlab/group_search_results_spec.rb b/spec/lib/gitlab/group_search_results_spec.rb
index ec96a069b8f..1206a1c9131 100644
--- a/spec/lib/gitlab/group_search_results_spec.rb
+++ b/spec/lib/gitlab/group_search_results_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::GroupSearchResults do
+RSpec.describe Gitlab::GroupSearchResults, feature_category: :global_search do
# group creation calls GroupFinder, so need to create the group
# before so expect(GroupsFinder) check works
let_it_be(:group) { create(:group) }
@@ -46,6 +46,19 @@ RSpec.describe Gitlab::GroupSearchResults do
include_examples 'search results filtered by state'
end
+ describe '#projects' do
+ let(:scope) { 'projects' }
+ let(:query) { 'Test' }
+
+ describe 'filtering' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:unarchived_project) { create(:project, :public, group: group, name: 'Test1') }
+ let_it_be(:archived_project) { create(:project, :archived, :public, group: group, name: 'Test2') }
+
+ it_behaves_like 'search results filtered by archived'
+ end
+ end
+
describe 'user search' do
subject(:objects) { results.objects('users') }
diff --git a/spec/lib/gitlab/search_results_spec.rb b/spec/lib/gitlab/search_results_spec.rb
index a38073e7c51..18b42da659b 100644
--- a/spec/lib/gitlab/search_results_spec.rb
+++ b/spec/lib/gitlab/search_results_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::SearchResults do
+RSpec.describe Gitlab::SearchResults, feature_category: :global_search do
include ProjectForksHelper
include SearchHelpers
using RSpec::Parameterized::TableSyntax
@@ -260,6 +260,19 @@ RSpec.describe Gitlab::SearchResults do
end
end
+ describe '#projects' do
+ let(:scope) { 'projects' }
+ let(:query) { 'Test' }
+
+ describe 'filtering' do
+ let_it_be(:group) { create(:group) }
+ let_it_be(:unarchived_project) { create(:project, :public, group: group, name: 'Test1') }
+ let_it_be(:archived_project) { create(:project, :archived, :public, group: group, name: 'Test2') }
+
+ it_behaves_like 'search results filtered by archived'
+ end
+ end
+
describe '#users' do
it 'does not call the UsersFinder when the current_user is not allowed to read users list' do
allow(Ability).to receive(:allowed?).and_return(false)
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index 4544cb2eb26..4da5f899ea9 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -661,14 +661,6 @@ RSpec.describe Gitlab::UsageData, :aggregate_failures, feature_category: :servic
end
end
- describe '.license_usage_data' do
- subject { described_class.license_usage_data }
-
- it 'gathers license data' do
- expect(subject[:recorded_at]).to be_a(Time)
- end
- end
-
context 'when not relying on database records' do
describe '.features_usage_data_ce' do
subject { described_class.features_usage_data_ce }
diff --git a/spec/models/release_highlight_spec.rb b/spec/models/release_highlight_spec.rb
index 0391acc3781..d51998cc556 100644
--- a/spec/models/release_highlight_spec.rb
+++ b/spec/models/release_highlight_spec.rb
@@ -15,20 +15,14 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
ReleaseHighlight.instance_variable_set(:@file_paths, nil)
end
- describe '.paginated' do
- let(:dot_com) { false }
-
- before do
- allow(Gitlab).to receive(:com?).and_return(dot_com)
- end
-
+ describe '.paginated_query' do
context 'with page param' do
- subject { ReleaseHighlight.paginated(page: page) }
+ subject { ReleaseHighlight.paginated_query(page: page) }
context 'when there is another page of results' do
let(:page) { 3 }
- it 'responds with paginated results' do
+ it 'responds with paginated query results' do
expect(subject[:items].first['name']).to eq('bright')
expect(subject[:next_page]).to eq(4)
end
@@ -37,7 +31,7 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
context 'when there is NOT another page of results' do
let(:page) { 4 }
- it 'responds with paginated results and no next_page' do
+ it 'responds with paginated query results and no next_page' do
expect(subject[:items].first['name']).to eq("It's gonna be a bright")
expect(subject[:next_page]).to eq(nil)
end
@@ -51,7 +45,9 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
end
end
end
+ end
+ describe '.paginated' do
context 'with no page param' do
subject { ReleaseHighlight.paginated }
@@ -73,15 +69,15 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
end
it 'logs an error if theres an error parsing markdown for an item, and skips it' do
+ whats_new_items_count = 6
+
allow(Banzai).to receive(:render).and_raise
- expect(Gitlab::ErrorTracking).to receive(:track_exception)
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).exactly(whats_new_items_count).times
expect(subject[:items]).to be_empty
end
- context 'when Gitlab.com' do
- let(:dot_com) { true }
-
+ context 'when Gitlab.com', :saas do
it 'responds with a different set of data' do
expect(subject[:items].count).to eq(1)
expect(subject[:items].first['name']).to eq("I think I can make it now the pain is gone")
@@ -90,10 +86,12 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
context 'YAML parsing throws an exception' do
it 'fails gracefully and logs an error' do
+ whats_new_files_count = 4
+
allow(YAML).to receive(:safe_load).and_raise(Psych::Exception)
- expect(Gitlab::ErrorTracking).to receive(:track_exception)
- expect(subject).to be_nil
+ expect(Gitlab::ErrorTracking).to receive(:track_exception).exactly(whats_new_files_count).times
+ expect(subject[:items]).to be_empty
end
end
end
@@ -175,6 +173,18 @@ RSpec.describe ReleaseHighlight, :clean_gitlab_redis_cache, feature_category: :r
expect(items.first['name']).to eq("View epics on a board")
end
end
+
+ context 'YAML parsing throws an exception' do
+ it 'fails gracefully and logs an error' do
+ allow(YAML).to receive(:safe_load).and_raise(Psych::Exception)
+
+ expect(Gitlab::ErrorTracking).to receive(:track_exception)
+
+ items = described_class.load_items(page: 2)
+
+ expect(items).to be_empty
+ end
+ end
end
describe 'QueryResult' do
diff --git a/spec/requests/api/usage_data_non_sql_metrics_spec.rb b/spec/requests/api/usage_data_non_sql_metrics_spec.rb
index b2929caf676..4ca6c5cace3 100644
--- a/spec/requests/api/usage_data_non_sql_metrics_spec.rb
+++ b/spec/requests/api/usage_data_non_sql_metrics_spec.rb
@@ -12,7 +12,7 @@ RSpec.describe API::UsageDataNonSqlMetrics, :aggregate_failures, feature_categor
stub_usage_data_connections
end
- describe 'GET /usage_data/non_sql_metrics' do
+ describe 'GET /usage_data/non_sql_metrics', :with_license do
let(:endpoint) { '/usage_data/non_sql_metrics' }
context 'with authentication' do
diff --git a/spec/requests/api/usage_data_queries_spec.rb b/spec/requests/api/usage_data_queries_spec.rb
index ab3c38adb81..584b0f31a07 100644
--- a/spec/requests/api/usage_data_queries_spec.rb
+++ b/spec/requests/api/usage_data_queries_spec.rb
@@ -14,7 +14,7 @@ RSpec.describe API::UsageDataQueries, :aggregate_failures, feature_category: :se
stub_database_flavor_check
end
- describe 'GET /usage_data/usage_data_queries' do
+ describe 'GET /usage_data/usage_data_queries', :with_license do
let(:endpoint) { '/usage_data/queries' }
context 'with authentication' do
diff --git a/spec/requests/jira_connect/installations_controller_spec.rb b/spec/requests/jira_connect/installations_controller_spec.rb
index 67544bbca2e..8728313569c 100644
--- a/spec/requests/jira_connect/installations_controller_spec.rb
+++ b/spec/requests/jira_connect/installations_controller_spec.rb
@@ -106,13 +106,9 @@ RSpec.describe JiraConnect::InstallationsController, feature_category: :integrat
do_request
expect(response).to have_gitlab_http_status(:unprocessable_entity)
- expect(json_response).to eq({
- 'errors' => {
- 'instance_url' => [
- 'Could not be installed on the instance. Error response code 422'
- ]
- }
- })
+ expect(json_response).to eq(
+ { 'errors' => 'Could not be installed on the instance. Error response code 422' }
+ )
end
end
diff --git a/spec/services/jira_connect_installations/update_service_spec.rb b/spec/services/jira_connect_installations/update_service_spec.rb
index 15f3b485b20..cb45865f6fe 100644
--- a/spec/services/jira_connect_installations/update_service_spec.rb
+++ b/spec/services/jira_connect_installations/update_service_spec.rb
@@ -137,11 +137,7 @@ RSpec.describe JiraConnectInstallations::UpdateService, feature_category: :integ
it 'returns an error message' do
expect(execute_service[:status]).to eq(:error)
- expect(execute_service[:message]).to eq(
- {
- instance_url: ["Could not be installed on the instance. Error response code 422"]
- }
- )
+ expect(execute_service[:message]).to eq("Could not be installed on the instance. Error response code 422")
end
context 'and the installation had a previous instance_url' do
@@ -175,11 +171,7 @@ RSpec.describe JiraConnectInstallations::UpdateService, feature_category: :integ
it 'returns an error message' do
expect(execute_service[:status]).to eq(:error)
- expect(execute_service[:message]).to eq(
- {
- instance_url: ["Could not be installed on the instance. Network error"]
- }
- )
+ expect(execute_service[:message]).to eq("Could not be installed on the instance. Network error")
end
end
end
diff --git a/spec/services/search/global_service_spec.rb b/spec/services/search/global_service_spec.rb
index 6250d32574f..f77d81851e3 100644
--- a/spec/services/search/global_service_spec.rb
+++ b/spec/services/search/global_service_spec.rb
@@ -3,13 +3,14 @@
require 'spec_helper'
RSpec.describe Search::GlobalService, feature_category: :global_search do
- let(:user) { create(:user) }
- let(:internal_user) { create(:user) }
+ let_it_be(:user) { create(:user) }
+ let_it_be(:internal_user) { create(:user) }
- let!(:found_project) { create(:project, :private, name: 'searchable_project') }
- let!(:unfound_project) { create(:project, :private, name: 'unfound_project') }
- let!(:internal_project) { create(:project, :internal, name: 'searchable_internal_project') }
- let!(:public_project) { create(:project, :public, name: 'searchable_public_project') }
+ let_it_be(:found_project) { create(:project, :private, name: 'searchable_project') }
+ let_it_be(:unfound_project) { create(:project, :private, name: 'unfound_project') }
+ let_it_be(:internal_project) { create(:project, :internal, name: 'searchable_internal_project') }
+ let_it_be(:public_project) { create(:project, :public, name: 'searchable_public_project') }
+ let_it_be(:archived_project) { create(:project, :public, archived: true, name: 'archived_project') }
before do
found_project.add_maintainer(user)
@@ -44,12 +45,16 @@ RSpec.describe Search::GlobalService, feature_category: :global_search do
end
it 'does not return archived projects' do
- archived_project = create(:project, :public, archived: true, name: 'archived_project')
-
results = described_class.new(user, search: "archived").execute
expect(results.objects('projects')).not_to include(archived_project)
end
+
+ it 'returns archived projects if the include_archived option is passed' do
+ results = described_class.new(user, { include_archived: true, search: "archived" }).execute
+
+ expect(results.objects('projects')).to include(archived_project)
+ end
end
end
diff --git a/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb b/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb
index cd792ccc4e3..b34d95519a2 100644
--- a/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb
+++ b/spec/support/shared_contexts/services/service_ping/stubbed_service_ping_metrics_definitions_shared_context.rb
@@ -3,9 +3,8 @@
RSpec.shared_context 'stubbed service ping metrics definitions' do
include UsageDataHelpers
- let(:metrics_definitions) { standard_metrics + subscription_metrics + operational_metrics + optional_metrics }
+ let(:metrics_definitions) { standard_metrics + operational_metrics + optional_metrics }
# ToDo: remove during https://gitlab.com/gitlab-org/gitlab/-/issues/396824 (license metrics migration)
- let(:subscription_metrics) { [] }
let(:standard_metrics) do
[
metric_attributes('recorded_at', 'standard'),
diff --git a/spec/support/shared_examples/lib/gitlab/search_archived_filter_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/search_archived_filter_shared_examples.rb
new file mode 100644
index 00000000000..7bcefd07fc4
--- /dev/null
+++ b/spec/support/shared_examples/lib/gitlab/search_archived_filter_shared_examples.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'search results filtered by archived' do
+ context 'when filter not provided (all behavior)' do
+ let(:filters) { {} }
+
+ it 'returns unarchived results only', :aggregate_failures do
+ expect(results.objects('projects')).to include unarchived_project
+ expect(results.objects('projects')).not_to include archived_project
+ end
+ end
+
+ context 'when include_archived is true' do
+ let(:filters) { { include_archived: true } }
+
+ it 'returns archived and unarchived results', :aggregate_failures do
+ expect(results.objects('projects')).to include unarchived_project
+ expect(results.objects('projects')).to include archived_project
+ end
+ end
+
+ context 'when include_archived filter is false' do
+ let(:filters) { { include_archived: false } }
+
+ it 'returns unarchived results only', :aggregate_failures do
+ expect(results.objects('projects')).to include unarchived_project
+ expect(results.objects('projects')).not_to include archived_project
+ end
+ end
+end
diff --git a/spec/support/shared_examples/services/service_ping/complete_service_ping_payload_shared_examples.rb b/spec/support/shared_examples/services/service_ping/complete_service_ping_payload_shared_examples.rb
index 8dcff99fb6f..fd3c53f3675 100644
--- a/spec/support/shared_examples/services/service_ping/complete_service_ping_payload_shared_examples.rb
+++ b/spec/support/shared_examples/services/service_ping/complete_service_ping_payload_shared_examples.rb
@@ -3,7 +3,7 @@
RSpec.shared_examples 'complete service ping payload' do
it_behaves_like 'service ping payload with all expected metrics' do
let(:expected_metrics) do
- standard_metrics + subscription_metrics + operational_metrics + optional_metrics
+ standard_metrics + operational_metrics + optional_metrics
end
end
end
diff --git a/spec/tasks/gitlab/usage_data_rake_spec.rb b/spec/tasks/gitlab/usage_data_rake_spec.rb
index 72f284b0b7f..11aab1b1b42 100644
--- a/spec/tasks/gitlab/usage_data_rake_spec.rb
+++ b/spec/tasks/gitlab/usage_data_rake_spec.rb
@@ -2,7 +2,7 @@
require 'rake_helper'
-RSpec.describe 'gitlab:usage data take tasks', :silence_stdout, feature_category: :service_ping do
+RSpec.describe 'gitlab:usage data take tasks', :silence_stdout, :with_license, feature_category: :service_ping do
include StubRequests
include UsageDataHelpers
diff --git a/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml b/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml
index 575fec39767..816b868915f 100644
--- a/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml
+++ b/vendor/gems/omniauth-azure-oauth2/.gitlab-ci.yml
@@ -26,3 +26,11 @@ rspec-2.7:
rspec-3.0:
image: "ruby:3.0"
extends: .rspec
+
+rspec-3.1:
+ image: "ruby:3.1"
+ extends: .rspec
+
+rspec-3.2:
+ image: "ruby:3.2"
+ extends: .rspec
diff --git a/vendor/gems/omniauth-gitlab/.gitlab-ci.yml b/vendor/gems/omniauth-gitlab/.gitlab-ci.yml
index da6547a1766..a802029c008 100644
--- a/vendor/gems/omniauth-gitlab/.gitlab-ci.yml
+++ b/vendor/gems/omniauth-gitlab/.gitlab-ci.yml
@@ -26,3 +26,11 @@ rspec-2.7:
rspec-3.0:
image: "ruby:3.0"
extends: .rspec
+
+rspec-3.1:
+ image: "ruby:3.1"
+ extends: .rspec
+
+rspec-3.2:
+ image: "ruby:3.2"
+ extends: .rspec
diff --git a/vendor/gems/omniauth-google-oauth2/examples/Gemfile.lock b/vendor/gems/omniauth-google-oauth2/examples/Gemfile.lock
deleted file mode 100644
index 5ac8f1be5e0..00000000000
--- a/vendor/gems/omniauth-google-oauth2/examples/Gemfile.lock
+++ /dev/null
@@ -1,72 +0,0 @@
-GEM
- remote: https://rubygems.org/
- specs:
- ast (2.4.2)
- faraday (2.5.2)
- faraday-net_http (>= 2.0, < 3.1)
- ruby2_keywords (>= 0.0.4)
- faraday-net_http (3.0.0)
- hashie (5.0.0)
- json (2.6.2)
- jwt (2.5.0)
- multi_json (1.15.0)
- multi_xml (0.6.0)
- oauth2 (1.4.11)
- faraday (>= 0.17.3, < 3.0)
- jwt (>= 1.0, < 3.0)
- multi_json (~> 1.3)
- multi_xml (~> 0.5)
- rack (>= 1.2, < 4)
- omniauth (1.9.2)
- hashie (>= 3.4.6)
- rack (>= 1.6.2, < 3)
- omniauth-google-oauth2 (0.8.2)
- jwt (>= 2.0)
- oauth2 (~> 1.1)
- omniauth (~> 1.1)
- omniauth-oauth2 (>= 1.6)
- omniauth-oauth2 (1.7.3)
- oauth2 (>= 1.4, < 3)
- omniauth (>= 1.9, < 3)
- parallel (1.22.1)
- parser (3.1.2.1)
- ast (~> 2.4.1)
- rack (1.6.13)
- rack-protection (1.5.5)
- rack
- rainbow (3.1.1)
- regexp_parser (2.6.0)
- rexml (3.2.5)
- rubocop (1.36.0)
- json (~> 2.3)
- parallel (~> 1.10)
- parser (>= 3.1.2.1)
- rainbow (>= 2.2.2, < 4.0)
- regexp_parser (>= 1.8, < 3.0)
- rexml (>= 3.2.5, < 4.0)
- rubocop-ast (>= 1.20.1, < 2.0)
- ruby-progressbar (~> 1.7)
- unicode-display_width (>= 1.4.0, < 3.0)
- rubocop-ast (1.21.0)
- parser (>= 3.1.1.0)
- ruby-progressbar (1.11.0)
- ruby2_keywords (0.0.5)
- sinatra (1.4.8)
- rack (~> 1.5)
- rack-protection (~> 1.4)
- tilt (>= 1.3, < 3)
- tilt (2.0.11)
- unicode-display_width (2.3.0)
- webrick (1.7.0)
-
-PLATFORMS
- ruby
-
-DEPENDENCIES
- omniauth-google-oauth2 (~> 0.8.1)
- rubocop
- sinatra (~> 1.4)
- webrick
-
-BUNDLED WITH
- 2.3.22
diff --git a/vendor/gems/omniauth-salesforce/.gitlab-ci.yml b/vendor/gems/omniauth-salesforce/.gitlab-ci.yml
index 4e18980d01c..15e7392e46b 100644
--- a/vendor/gems/omniauth-salesforce/.gitlab-ci.yml
+++ b/vendor/gems/omniauth-salesforce/.gitlab-ci.yml
@@ -26,3 +26,11 @@ rspec-2.7:
rspec-3.0:
image: "ruby:3.0"
extends: .rspec
+
+rspec-3.1:
+ image: "ruby:3.1"
+ extends: .rspec
+
+rspec-3.2:
+ image: "ruby:3.2"
+ extends: .rspec
diff --git a/vendor/gems/omniauth-salesforce/Gemfile.lock b/vendor/gems/omniauth-salesforce/Gemfile.lock
index 0317b16dd9f..3f539c79853 100644
--- a/vendor/gems/omniauth-salesforce/Gemfile.lock
+++ b/vendor/gems/omniauth-salesforce/Gemfile.lock
@@ -82,14 +82,19 @@ GEM
rb-inotify (0.10.1)
ffi (~> 1.0)
rexml (3.2.5)
- rspec (2.99.0)
- rspec-core (~> 2.99.0)
- rspec-expectations (~> 2.99.0)
- rspec-mocks (~> 2.99.0)
- rspec-core (2.99.2)
- rspec-expectations (2.99.2)
- diff-lcs (>= 1.1.3, < 2.0)
- rspec-mocks (2.99.4)
+ rspec (3.12.0)
+ rspec-core (~> 3.12.0)
+ rspec-expectations (~> 3.12.0)
+ rspec-mocks (~> 3.12.0)
+ rspec-core (3.12.2)
+ rspec-support (~> 3.12.0)
+ rspec-expectations (3.12.3)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-mocks (3.12.5)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.12.0)
+ rspec-support (3.12.0)
ruby2_keywords (0.0.5)
shellany (0.0.1)
simplecov (0.21.2)
@@ -116,7 +121,7 @@ DEPENDENCIES
omniauth-salesforce!
rack-test
rb-fsevent
- rspec (~> 2.7)
+ rspec (~> 3.1)
simplecov
webmock
diff --git a/vendor/gems/omniauth-salesforce/omniauth-salesforce.gemspec b/vendor/gems/omniauth-salesforce/omniauth-salesforce.gemspec
index 9c87746e9fd..c3564906281 100755
--- a/vendor/gems/omniauth-salesforce/omniauth-salesforce.gemspec
+++ b/vendor/gems/omniauth-salesforce/omniauth-salesforce.gemspec
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
gem.add_dependency 'omniauth', '~> 2.0'
gem.add_dependency 'omniauth-oauth2', '~> 1.0'
- gem.add_development_dependency 'rspec', '~> 2.7'
+ gem.add_development_dependency 'rspec', '~> 3.1'
gem.add_development_dependency 'rack-test'
gem.add_development_dependency 'simplecov'
gem.add_development_dependency 'webmock'