diff --git a/.rubocop.yml b/.rubocop.yml
index 9413360e89e..89a9cbc3744 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -640,3 +640,7 @@ Cop/UserAdmin:
- 'lib/gitlab/auth/current_user_mode.rb'
- 'spec/**/*.rb'
- 'ee/spec/**/*.rb'
+
+Performance/OpenStruct:
+ Exclude:
+ - 'ee/spec/**/*.rb'
diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml
index 4678c7d92af..affe95ffb9f 100644
--- a/.rubocop_manual_todo.yml
+++ b/.rubocop_manual_todo.yml
@@ -568,6 +568,993 @@ Rails/TimeZone:
- 'spec/tooling/rspec_flaky/listener_spec.rb'
- 'spec/tooling/rspec_flaky/report_spec.rb'
+# WIP: https://gitlab.com/gitlab-org/gitlab/-/issues/325836
+RSpec/EmptyLineAfterFinalLetItBe:
+ Exclude:
+ - ee/spec/controllers/admin/geo/projects_controller_spec.rb
+ - ee/spec/controllers/admin/projects_controller_spec.rb
+ - ee/spec/controllers/ee/projects/jobs_controller_spec.rb
+ - ee/spec/controllers/groups/analytics/cycle_analytics/stages_controller_spec.rb
+ - ee/spec/controllers/groups/analytics/cycle_analytics/summary_controller_spec.rb
+ - ee/spec/controllers/groups/analytics/cycle_analytics/value_streams_controller_spec.rb
+ - ee/spec/controllers/groups/analytics/tasks_by_type_controller_spec.rb
+ - ee/spec/controllers/groups/autocomplete_sources_controller_spec.rb
+ - ee/spec/controllers/groups/insights_controller_spec.rb
+ - ee/spec/controllers/groups/todos_controller_spec.rb
+ - ee/spec/controllers/projects/branches_controller_spec.rb
+ - ee/spec/controllers/projects/incident_management/oncall_schedules_controller_spec.rb
+ - ee/spec/controllers/projects/insights_controller_spec.rb
+ - ee/spec/controllers/projects/licenses_controller_spec.rb
+ - ee/spec/controllers/projects/merge_requests_controller_spec.rb
+ - ee/spec/controllers/projects/mirrors_controller_spec.rb
+ - ee/spec/controllers/projects/threat_monitoring_controller_spec.rb
+ - ee/spec/controllers/registrations/groups_controller_spec.rb
+ - ee/spec/controllers/registrations/projects_controller_spec.rb
+ - ee/spec/controllers/subscriptions_controller_spec.rb
+ - ee/spec/features/admin/admin_show_new_user_signups_cap_alert_spec.rb
+ - ee/spec/features/analytics/group_analytics_spec.rb
+ - ee/spec/features/boards/group_boards/multiple_boards_spec.rb
+ - ee/spec/features/ci_shared_runner_warnings_spec.rb
+ - ee/spec/features/dashboards/todos_spec.rb
+ - ee/spec/features/groups/groups_security_credentials_spec.rb
+ - ee/spec/features/groups/hooks/user_edits_hooks_spec.rb
+ - ee/spec/features/groups/iterations/user_edits_iteration_spec.rb
+ - ee/spec/features/groups/usage_quotas_spec.rb
+ - ee/spec/features/integrations/jira/jira_issues_list_spec.rb
+ - ee/spec/features/issues/bulk_assignment_epic_spec.rb
+ - ee/spec/features/issues/user_uses_quick_actions_spec.rb
+ - ee/spec/features/markdown/metrics_spec.rb
+ - ee/spec/features/projects/issues/user_creates_issue_spec.rb
+ - ee/spec/features/projects/iterations/iterations_list_spec.rb
+ - ee/spec/features/projects/licenses/maintainer_views_policies_spec.rb
+ - ee/spec/features/registrations/group_invites_during_signup_flow_spec.rb
+ - ee/spec/features/subscriptions_spec.rb
+ - ee/spec/finders/analytics/cycle_analytics/stage_finder_spec.rb
+ - ee/spec/finders/billed_users_finder_spec.rb
+ - ee/spec/finders/custom_project_templates_finder_spec.rb
+ - ee/spec/finders/deployments_finder_spec.rb
+ - ee/spec/finders/ee/projects_finder_spec.rb
+ - ee/spec/finders/epics_finder_spec.rb
+ - ee/spec/finders/geo_node_finder_spec.rb
+ - ee/spec/finders/incident_management/oncall_schedules_finder_spec.rb
+ - ee/spec/finders/issues_finder_spec.rb
+ - ee/spec/finders/iterations_finder_spec.rb
+ - ee/spec/finders/merge_trains_finder_spec.rb
+ - ee/spec/finders/projects/integrations/jira/issues_finder_spec.rb
+ - ee/spec/finders/scim_finder_spec.rb
+ - ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb
+ - ee/spec/graphql/ee/mutations/concerns/mutations/resolves_issuable_spec.rb
+ - ee/spec/graphql/mutations/boards/update_epic_user_preferences_spec.rb
+ - ee/spec/graphql/mutations/clusters/agent_tokens/create_spec.rb
+ - ee/spec/graphql/mutations/compliance_management/frameworks/create_spec.rb
+ - ee/spec/graphql/mutations/compliance_management/frameworks/destroy_spec.rb
+ - ee/spec/graphql/mutations/compliance_management/frameworks/update_spec.rb
+ - ee/spec/graphql/mutations/dast_scanner_profiles/delete_spec.rb
+ - ee/spec/graphql/mutations/epics/add_issue_spec.rb
+ - ee/spec/graphql/mutations/gitlab_subscriptions/activate_spec.rb
+ - ee/spec/graphql/mutations/incident_management/oncall_rotation/create_spec.rb
+ - ee/spec/graphql/mutations/incident_management/oncall_rotation/destroy_spec.rb
+ - ee/spec/graphql/mutations/incident_management/oncall_schedule/create_spec.rb
+ - ee/spec/graphql/mutations/incident_management/oncall_schedule/destroy_spec.rb
+ - ee/spec/graphql/mutations/incident_management/oncall_schedule/update_spec.rb
+ - ee/spec/graphql/mutations/issues/set_epic_spec.rb
+ - ee/spec/graphql/mutations/requirements_management/export_requirements_spec.rb
+ - ee/spec/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb
+ - ee/spec/graphql/resolvers/ci/code_coverage_activities_resolver_spec.rb
+ - ee/spec/graphql/resolvers/epics_resolver_spec.rb
+ - ee/spec/graphql/resolvers/geo/geo_node_resolver_spec.rb
+ - ee/spec/graphql/resolvers/incident_management/oncall_shifts_resolver_spec.rb
+ - ee/spec/graphql/types/issue_type_spec.rb
+ - ee/spec/helpers/ee/graph_helper_spec.rb
+ - ee/spec/helpers/ee/issues_helper_spec.rb
+ - ee/spec/helpers/ee/projects/incidents_helper_spec.rb
+ - ee/spec/helpers/ee/projects/security/api_fuzzing_configuration_helper_spec.rb
+ - ee/spec/helpers/ee/projects/security/configuration_helper_spec.rb
+ - ee/spec/helpers/ee/projects/security/sast_configuration_helper_spec.rb
+ - ee/spec/helpers/ee/trial_helper_spec.rb
+ - ee/spec/helpers/ee/user_callouts_helper_spec.rb
+ - ee/spec/helpers/vulnerabilities_helper_spec.rb
+ - ee/spec/lib/ee/api/entities/user_with_admin_spec.rb
+ - ee/spec/lib/ee/api/entities/vulnerability_spec.rb
+ - ee/spec/lib/ee/event_filter_spec.rb
+ - ee/spec/lib/ee/gitlab/alert_management/payload/generic_spec.rb
+ - ee/spec/lib/ee/gitlab/alert_management/payload_spec.rb
+ - ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/external_spec.rb
+ - ee/spec/lib/ee/gitlab/ci/pipeline/quota/activity_spec.rb
+ - ee/spec/lib/ee/gitlab/ci/pipeline/quota/job_activity_spec.rb
+ - ee/spec/lib/ee/gitlab/ci/pipeline/quota/size_spec.rb
+ - ee/spec/lib/ee/gitlab/git_access_design_spec.rb
+ - ee/spec/lib/ee/gitlab/git_access_snippet_spec.rb
+ - ee/spec/lib/ee/gitlab/hook_data/issue_builder_spec.rb
+ - ee/spec/lib/ee/gitlab/import_export/project/tree_restorer_spec.rb
+ - ee/spec/lib/ee/gitlab/snippet_search_results_spec.rb
+ - ee/spec/lib/elastic/latest/git_class_proxy_spec.rb
+ - ee/spec/lib/gitlab/alert_management/payload/cilium_spec.rb
+ - ee/spec/lib/gitlab/analytics/cycle_analytics/summary/group/stage_time_summary_spec.rb
+ - ee/spec/lib/gitlab/checks/diff_check_spec.rb
+ - ee/spec/lib/gitlab/code_owners/loader_spec.rb
+ - ee/spec/lib/gitlab/elastic/document_reference_spec.rb
+ - ee/spec/lib/gitlab/elastic/group_search_results_spec.rb
+ - ee/spec/lib/gitlab/elastic/project_search_results_spec.rb
+ - ee/spec/lib/gitlab/geo/geo_tasks_spec.rb
+ - ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb
+ - ee/spec/lib/gitlab/geo/log_cursor/events/container_repository_updated_event_spec.rb
+ - ee/spec/lib/gitlab/geo/log_cursor/events/design_repository_updated_event_spec.rb
+ - ee/spec/lib/gitlab/geo/log_cursor/events/repositories_changed_event_spec.rb
+ - ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb
+ - ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb
+ - ee/spec/lib/gitlab/geo/replication/base_transfer_spec.rb
+ - ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb
+ - ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb
+ - ee/spec/lib/gitlab/git_access_spec.rb
+ - ee/spec/lib/gitlab/git_access_wiki_spec.rb
+ - ee/spec/lib/gitlab/graphql/aggregations/vulnerability_statistics/lazy_aggregate_spec.rb
+ - ee/spec/lib/gitlab/insights/project_insights_config_spec.rb
+ - ee/spec/lib/gitlab/sitemaps/url_extractor_spec.rb
+ - ee/spec/mailers/credentials_inventory_mailer_spec.rb
+ - ee/spec/mailers/ee/emails/profile_spec.rb
+ - ee/spec/mailers/notify_spec.rb
+ - ee/spec/migrations/backfill_version_author_and_created_at_spec.rb
+ - ee/spec/models/analytics/cycle_analytics/group_level_spec.rb
+ - ee/spec/models/burndown_spec.rb
+ - ee/spec/models/ci/build_spec.rb
+ - ee/spec/models/ci/daily_build_group_report_result_spec.rb
+ - ee/spec/models/ci/minutes/notification_spec.rb
+ - ee/spec/models/concerns/epic_tree_sorting_spec.rb
+ - ee/spec/models/dora/daily_metrics_spec.rb
+ - ee/spec/models/ee/ci/build_dependencies_spec.rb
+ - ee/spec/models/ee/iteration_spec.rb
+ - ee/spec/models/ee/namespace/root_storage_size_spec.rb
+ - ee/spec/models/ee/namespace_spec.rb
+ - ee/spec/models/ee/personal_access_token_spec.rb
+ - ee/spec/models/epic_spec.rb
+ - ee/spec/models/geo/lfs_object_registry_spec.rb
+ - ee/spec/models/gitlab_subscription_spec.rb
+ - ee/spec/models/group_member_spec.rb
+ - ee/spec/models/group_spec.rb
+ - ee/spec/models/instance_security_dashboard_spec.rb
+ - ee/spec/models/issue_spec.rb
+ - ee/spec/models/label_note_spec.rb
+ - ee/spec/models/merge_request_spec.rb
+ - ee/spec/models/project_spec.rb
+ - ee/spec/models/requirements_management/test_report_spec.rb
+ - ee/spec/models/vulnerabilities/finding_spec.rb
+ - ee/spec/policies/clusters/agent_token_policy_spec.rb
+ - ee/spec/policies/compliance_management/framework_policy_spec.rb
+ - ee/spec/policies/group_policy_spec.rb
+ - ee/spec/policies/merge_request_policy_spec.rb
+ - ee/spec/policies/project_policy_spec.rb
+ - ee/spec/policies/vulnerabilities/issue_link_policy_spec.rb
+ - ee/spec/presenters/approval_rule_presenter_spec.rb
+ - ee/spec/presenters/ci/pipeline_presenter_spec.rb
+ - ee/spec/requests/api/analytics/code_review_analytics_spec.rb
+ - ee/spec/requests/api/audit_events_spec.rb
+ - ee/spec/requests/api/commits_spec.rb
+ - ee/spec/requests/api/dora/metrics_spec.rb
+ - ee/spec/requests/api/epics_spec.rb
+ - ee/spec/requests/api/external_approval_rules_spec.rb
+ - ee/spec/requests/api/geo_spec.rb
+ - ee/spec/requests/api/graphql/boards/epic_board_list_epics_query_spec.rb
+ - ee/spec/requests/api/graphql/current_user/todos_query_spec.rb
+ - ee/spec/requests/api/graphql/group/epic/epic_issues_spec.rb
+ - ee/spec/requests/api/graphql/group/epics_spec.rb
+ - ee/spec/requests/api/graphql/mutations/analytics/devops_adoption/segments/create_spec.rb
+ - ee/spec/requests/api/graphql/mutations/analytics/devops_adoption/segments/delete_spec.rb
+ - ee/spec/requests/api/graphql/mutations/boards/create_spec.rb
+ - ee/spec/requests/api/graphql/mutations/boards/epic_boards/create_spec.rb
+ - ee/spec/requests/api/graphql/mutations/boards/epic_boards/update_spec.rb
+ - ee/spec/requests/api/graphql/mutations/boards/issues/issue_move_list_spec.rb
+ - ee/spec/requests/api/graphql/mutations/boards/lists/update_limit_metrics_spec.rb
+ - ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/destroy_spec.rb
+ - ee/spec/requests/api/graphql/mutations/compliance_management/frameworks/update_spec.rb
+ - ee/spec/requests/api/graphql/mutations/dast_scanner_profiles/update_spec.rb
+ - ee/spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb
+ - ee/spec/requests/api/graphql/mutations/epics/add_issue_spec.rb
+ - ee/spec/requests/api/graphql/mutations/epics/set_subscription_spec.rb
+ - ee/spec/requests/api/graphql/mutations/epics/update_spec.rb
+ - ee/spec/requests/api/graphql/mutations/gitlab_subscriptions/activate_spec.rb
+ - ee/spec/requests/api/graphql/mutations/incident_management/oncall_rotation/create_spec.rb
+ - ee/spec/requests/api/graphql/mutations/incident_management/oncall_schedule/create_spec.rb
+ - ee/spec/requests/api/graphql/mutations/incident_management/oncall_schedule/destroy_spec.rb
+ - ee/spec/requests/api/graphql/mutations/incident_management/oncall_schedule/update_spec.rb
+ - ee/spec/requests/api/graphql/mutations/issues/promote_to_epic_spec.rb
+ - ee/spec/requests/api/graphql/mutations/issues/update_spec.rb
+ - ee/spec/requests/api/graphql/mutations/iterations/create_spec.rb
+ - ee/spec/requests/api/graphql/mutations/notes/create/note_spec.rb
+ - ee/spec/requests/api/graphql/mutations/quality_management/test_cases/create_spec.rb
+ - ee/spec/requests/api/graphql/namespace/compliance_frameworks_spec.rb
+ - ee/spec/requests/api/graphql/project/alert_management/payload_fields_spec.rb
+ - ee/spec/requests/api/graphql/project/requirements_management/requirements_spec.rb
+ - ee/spec/requests/api/graphql/projects/compliance_frameworks_spec.rb
+ - ee/spec/requests/api/groups_spec.rb
+ - ee/spec/requests/api/internal/base_spec.rb
+ - ee/spec/requests/api/issues_spec.rb
+ - ee/spec/requests/api/ldap_spec.rb
+ - ee/spec/requests/api/merge_request_approval_rules_spec.rb
+ - ee/spec/requests/api/merge_request_approvals_spec.rb
+ - ee/spec/requests/api/merge_requests_spec.rb
+ - ee/spec/requests/api/merge_trains_spec.rb
+ - ee/spec/requests/api/project_approval_rules_spec.rb
+ - ee/spec/requests/api/project_approval_settings_spec.rb
+ - ee/spec/requests/api/projects_spec.rb
+ - ee/spec/requests/api/todos_spec.rb
+ - ee/spec/requests/api/vulnerabilities_spec.rb
+ - ee/spec/requests/api/vulnerability_issue_links_spec.rb
+ - ee/spec/requests/api/wikis_spec.rb
+ - ee/spec/requests/callout_spec.rb
+ - ee/spec/requests/git_http_geo_spec.rb
+ - ee/spec/requests/projects/issues_controller_spec.rb
+ - ee/spec/requests/projects/on_demand_scans_controller_spec.rb
+ - ee/spec/requests/projects/security/scanned_resources_controller_spec.rb
+ - ee/spec/requests/repositories/git_http_controller_spec.rb
+ - ee/spec/serializers/clusters/environment_serializer_spec.rb
+ - ee/spec/serializers/dependency_entity_spec.rb
+ - ee/spec/serializers/dependency_list_serializer_spec.rb
+ - ee/spec/serializers/ee/issue_board_entity_spec.rb
+ - ee/spec/serializers/ee/issue_entity_spec.rb
+ - ee/spec/serializers/ee/issue_sidebar_extras_entity_spec.rb
+ - ee/spec/serializers/member_entity_spec.rb
+ - ee/spec/serializers/merge_request_poll_widget_entity_spec.rb
+ - ee/spec/serializers/merge_request_widget_entity_spec.rb
+ - ee/spec/serializers/status_page/incident_comment_entity_spec.rb
+ - ee/spec/serializers/vulnerabilities/feedback_entity_spec.rb
+ - ee/spec/services/alert_management/extract_alert_payload_fields_service_spec.rb
+ - ee/spec/services/alert_management/process_prometheus_alert_service_spec.rb
+ - ee/spec/services/analytics/cycle_analytics/stages/delete_service_spec.rb
+ - ee/spec/services/analytics/cycle_analytics/stages/list_service_spec.rb
+ - ee/spec/services/analytics/cycle_analytics/stages/update_service_spec.rb
+ - ee/spec/services/analytics/cycle_analytics/value_streams/create_service_spec.rb
+ - ee/spec/services/analytics/deployments/frequency/aggregate_service_spec.rb
+ - ee/spec/services/analytics/devops_adoption/segments/bulk_delete_service_spec.rb
+ - ee/spec/services/analytics/devops_adoption/segments/create_service_spec.rb
+ - ee/spec/services/analytics/devops_adoption/segments/delete_service_spec.rb
+ - ee/spec/services/analytics/devops_adoption/segments/find_or_create_service_spec.rb
+ - ee/spec/services/approval_rules/create_service_spec.rb
+ - ee/spec/services/audit_event_service_spec.rb
+ - ee/spec/services/auto_merge/add_to_merge_train_when_pipeline_succeeds_service_spec.rb
+ - ee/spec/services/auto_merge/merge_train_service_spec.rb
+ - ee/spec/services/award_emojis/add_service_spec.rb
+ - ee/spec/services/award_emojis/destroy_service_spec.rb
+ - ee/spec/services/billable_members/destroy_service_spec.rb
+ - ee/spec/services/boards/epic_boards/destroy_service_spec.rb
+ - ee/spec/services/ci/audit_variable_change_service_spec.rb
+ - ee/spec/services/ci/compare_license_scanning_reports_service_spec.rb
+ - ee/spec/services/ci/compare_metrics_reports_service_spec.rb
+ - ee/spec/services/ci/compare_security_reports_service_spec.rb
+ - ee/spec/services/ci/create_pipeline_service/needs_spec.rb
+ - ee/spec/services/ci/create_pipeline_service_spec.rb
+ - ee/spec/services/ci/external_pull_requests/process_github_event_service_spec.rb
+ - ee/spec/services/ci/pipeline_bridge_status_service_spec.rb
+ - ee/spec/services/ci/register_job_service_spec.rb
+ - ee/spec/services/clusters/agent_tokens/create_service_spec.rb
+ - ee/spec/services/compliance_management/frameworks/create_service_spec.rb
+ - ee/spec/services/compliance_management/frameworks/update_service_spec.rb
+ - ee/spec/services/dast_scanner_profiles/destroy_service_spec.rb
+ - ee/spec/services/dast_scanner_profiles/update_service_spec.rb
+ - ee/spec/services/dast_site_profiles/destroy_service_spec.rb
+ - ee/spec/services/dora/aggregate_metrics_service_spec.rb
+ - ee/spec/services/ee/audit_events/protected_branch_audit_event_service_spec.rb
+ - ee/spec/services/ee/ci/change_variable_service_spec.rb
+ - ee/spec/services/ee/ci/change_variables_service_spec.rb
+ - ee/spec/services/ee/design_management/delete_designs_service_spec.rb
+ - ee/spec/services/ee/git/branch_push_service_spec.rb
+ - ee/spec/services/ee/issuable/bulk_update_service_spec.rb
+ - ee/spec/services/ee/issues/create_service_spec.rb
+ - ee/spec/services/ee/issues/update_service_spec.rb
+ - ee/spec/services/ee/labels/create_service_spec.rb
+ - ee/spec/services/ee/merge_requests/base_service_spec.rb
+ - ee/spec/services/ee/notes/create_service_spec.rb
+ - ee/spec/services/ee/notification_service_spec.rb
+ - ee/spec/services/ee/resource_events/merge_into_notes_service_spec.rb
+ - ee/spec/services/ee/todos/destroy/entity_leave_service_spec.rb
+ - ee/spec/services/epics/create_service_spec.rb
+ - ee/spec/services/external_approval_rules/create_service_spec.rb
+ - ee/spec/services/external_approval_rules/destroy_service_spec.rb
+ - ee/spec/services/external_approval_rules/update_service_spec.rb
+ - ee/spec/services/geo/blob_download_service_spec.rb
+ - ee/spec/services/geo/design_repository_sync_service_spec.rb
+ - ee/spec/services/geo/event_service_spec.rb
+ - ee/spec/services/geo/file_registry_removal_service_spec.rb
+ - ee/spec/services/geo/project_housekeeping_service_spec.rb
+ - ee/spec/services/gitlab_subscriptions/activate_service_spec.rb
+ - ee/spec/services/gitlab_subscriptions/apply_trial_service_spec.rb
+ - ee/spec/services/groups/autocomplete_service_spec.rb
+ - ee/spec/services/ide/schemas_config_service_spec.rb
+ - ee/spec/services/incident_management/incidents/upload_metric_service_spec.rb
+ - ee/spec/services/incident_management/oncall_rotations/edit_service_spec.rb
+ - ee/spec/services/issues/build_service_spec.rb
+ - ee/spec/services/issues/export_csv_service_spec.rb
+ - ee/spec/services/merge_request_approval_settings/update_service_spec.rb
+ - ee/spec/services/merge_trains/check_status_service_spec.rb
+ - ee/spec/services/merge_trains/create_pipeline_service_spec.rb
+ - ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb
+ - ee/spec/services/merge_trains/refresh_service_spec.rb
+ - ee/spec/services/personal_access_tokens/create_service_audit_log_spec.rb
+ - ee/spec/services/personal_access_tokens/groups/update_lifetime_service_spec.rb
+ - ee/spec/services/projects/after_rename_service_spec.rb
+ - ee/spec/services/projects/alerting/notify_service_spec.rb
+ - ee/spec/services/projects/destroy_service_spec.rb
+ - ee/spec/services/projects/gitlab_projects_import_service_spec.rb
+ - ee/spec/services/projects/import_export/export_service_spec.rb
+ - ee/spec/services/projects/transfer_service_spec.rb
+ - ee/spec/services/push_rules/create_or_update_service_spec.rb
+ - ee/spec/services/quality_management/test_cases/create_service_spec.rb
+ - ee/spec/services/quick_actions/interpret_service_spec.rb
+ - ee/spec/services/requirements_management/create_requirement_service_spec.rb
+ - ee/spec/services/requirements_management/export_csv_service_spec.rb
+ - ee/spec/services/requirements_management/update_requirement_service_spec.rb
+ - ee/spec/services/resource_access_tokens/create_service_spec.rb
+ - ee/spec/services/resource_access_tokens/revoke_service_spec.rb
+ - ee/spec/services/search/global_service_spec.rb
+ - ee/spec/services/search/group_service_spec.rb
+ - ee/spec/services/search/project_service_spec.rb
+ - ee/spec/services/security/auto_fix_label_service_spec.rb
+ - ee/spec/services/security/store_grouped_scans_service_spec.rb
+ - ee/spec/services/security/store_report_service_spec.rb
+ - ee/spec/services/status_page/publish_attachments_service_spec.rb
+ - ee/spec/services/status_page/publish_details_service_spec.rb
+ - ee/spec/services/status_page/publish_list_service_spec.rb
+ - ee/spec/services/status_page/publish_service_spec.rb
+ - ee/spec/services/status_page/trigger_publish_service_spec.rb
+ - ee/spec/services/status_page/unpublish_details_service_spec.rb
+ - ee/spec/services/timebox_report_service_spec.rb
+ - ee/spec/services/todo_service_spec.rb
+ - ee/spec/services/vulnerabilities/confirm_service_spec.rb
+ - ee/spec/services/vulnerabilities/create_service_spec.rb
+ - ee/spec/services/vulnerabilities/dismiss_service_spec.rb
+ - ee/spec/services/vulnerabilities/resolve_service_spec.rb
+ - ee/spec/services/vulnerabilities/revert_to_detected_service_spec.rb
+ - ee/spec/services/vulnerabilities/update_service_spec.rb
+ - ee/spec/services/vulnerability_exports/create_service_spec.rb
+ - ee/spec/services/vulnerability_external_issue_links/destroy_service_spec.rb
+ - ee/spec/services/vulnerability_issue_links/delete_service_spec.rb
+ - ee/spec/support/shared_examples/graphql/geo/geo_registries_resolver_shared_examples.rb
+ - ee/spec/support/shared_examples/graphql/mutations/set_multiple_assignees_shared_examples.rb
+ - ee/spec/support/shared_examples/quick_actions/issue/status_page_quick_actions_shared_examples.rb
+ - ee/spec/support/shared_examples/services/search_notes_shared_examples.rb
+ - ee/spec/tasks/gitlab/license_rake_spec.rb
+ - ee/spec/views/admin/application_settings/_elasticsearch_form.html.haml_spec.rb
+ - ee/spec/views/groups/_compliance_frameworks.html.haml_spec.rb
+ - ee/spec/views/groups/edit.html.haml_spec.rb
+ - ee/spec/views/projects/pipelines/_tabs_content.html.haml_spec.rb
+ - ee/spec/views/shared/billings/_eoa_bronze_plan_banner.html.haml_spec.rb
+ - ee/spec/views/shared/billings/_trial_status.html.haml_spec.rb
+ - ee/spec/workers/adjourned_projects_deletion_cron_worker_spec.rb
+ - ee/spec/workers/deployments/auto_rollback_worker_spec.rb
+ - ee/spec/workers/dora/daily_metrics/refresh_worker_spec.rb
+ - ee/spec/workers/ee/issuable_export_csv_worker_spec.rb
+ - ee/spec/workers/elastic_namespace_indexer_worker_spec.rb
+ - ee/spec/workers/geo/batch/project_registry_scheduler_worker_spec.rb
+ - ee/spec/workers/geo/prune_event_log_worker_spec.rb
+ - ee/spec/workers/geo/repository_verification/primary/single_worker_spec.rb
+ - ee/spec/workers/incident_management/oncall_rotations/persist_shifts_job_spec.rb
+ - ee/spec/workers/post_receive_spec.rb
+ - ee/spec/workers/requirements_management/import_requirements_csv_worker_spec.rb
+ - ee/spec/workers/security/auto_fix_worker_spec.rb
+ - ee/spec/workers/set_user_status_based_on_user_cap_setting_worker_spec.rb
+ - spec/controllers/confirmations_controller_spec.rb
+ - spec/controllers/dashboard/projects_controller_spec.rb
+ - spec/controllers/groups/dependency_proxy_auth_controller_spec.rb
+ - spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb
+ - spec/controllers/groups/registry/repositories_controller_spec.rb
+ - spec/controllers/groups/variables_controller_spec.rb
+ - spec/controllers/invites_controller_spec.rb
+ - spec/controllers/profiles/emails_controller_spec.rb
+ - spec/controllers/projects/alerting/notifications_controller_spec.rb
+ - spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb
+ - spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb
+ - spec/controllers/projects/environments_controller_spec.rb
+ - spec/controllers/projects/feature_flags_controller_spec.rb
+ - spec/controllers/projects/incidents_controller_spec.rb
+ - spec/controllers/projects/issues_controller_spec.rb
+ - spec/controllers/projects/jobs_controller_spec.rb
+ - spec/controllers/projects/merge_requests_controller_spec.rb
+ - spec/controllers/projects/performance_monitoring/dashboards_controller_spec.rb
+ - spec/controllers/projects/pipelines_controller_spec.rb
+ - spec/controllers/projects/pipelines_settings_controller_spec.rb
+ - spec/controllers/projects/raw_controller_spec.rb
+ - spec/controllers/projects/releases/evidences_controller_spec.rb
+ - spec/controllers/projects/releases_controller_spec.rb
+ - spec/controllers/projects/settings/ci_cd_controller_spec.rb
+ - spec/controllers/projects/settings/operations_controller_spec.rb
+ - spec/controllers/projects/static_site_editor_controller_spec.rb
+ - spec/controllers/projects/todos_controller_spec.rb
+ - spec/controllers/projects_controller_spec.rb
+ - spec/controllers/users/terms_controller_spec.rb
+ - spec/features/boards/multiple_boards_spec.rb
+ - spec/features/boards/sidebar_assignee_spec.rb
+ - spec/features/boards/sidebar_due_date_spec.rb
+ - spec/features/boards/sidebar_labels_spec.rb
+ - spec/features/boards/sidebar_milestones_spec.rb
+ - spec/features/boards/sidebar_spec.rb
+ - spec/features/boards/sidebar_subscription_spec.rb
+ - spec/features/boards/sidebar_time_tracking_spec.rb
+ - spec/features/cycle_analytics_spec.rb
+ - spec/features/dashboard/datetime_on_tooltips_spec.rb
+ - spec/features/dashboard/merge_requests_spec.rb
+ - spec/features/error_tracking/user_filters_errors_by_status_spec.rb
+ - spec/features/error_tracking/user_searches_sentry_errors_spec.rb
+ - spec/features/error_tracking/user_sees_error_index_spec.rb
+ - spec/features/file_uploads/group_import_spec.rb
+ - spec/features/file_uploads/project_import_spec.rb
+ - spec/features/file_uploads/user_avatar_spec.rb
+ - spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb
+ - spec/features/groups_spec.rb
+ - spec/features/issues/user_sees_breadcrumb_links_spec.rb
+ - spec/features/markdown/metrics_spec.rb
+ - spec/features/merge_request/user_creates_merge_request_spec.rb
+ - spec/features/merge_request/user_posts_notes_spec.rb
+ - spec/features/operations_sidebar_link_spec.rb
+ - spec/features/participants_autocomplete_spec.rb
+ - spec/features/projects/badges/pipeline_badge_spec.rb
+ - spec/features/projects/branches/user_deletes_branch_spec.rb
+ - spec/features/projects/commit/cherry_pick_spec.rb
+ - spec/features/projects/commit/user_comments_on_commit_spec.rb
+ - spec/features/projects/commit/user_reverts_commit_spec.rb
+ - spec/features/projects/commit/user_views_user_status_on_commit_spec.rb
+ - spec/features/projects/confluence/user_views_confluence_page_spec.rb
+ - spec/features/projects/files/gitlab_ci_syntax_yml_dropdown_spec.rb
+ - spec/features/projects/issues/design_management/user_views_design_images_spec.rb
+ - spec/features/projects/labels/user_sees_links_to_issuables_spec.rb
+ - spec/features/projects/labels/user_views_labels_spec.rb
+ - spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb
+ - spec/features/projects/merge_request_button_spec.rb
+ - spec/features/projects/pages/user_adds_domain_spec.rb
+ - spec/features/projects/pipelines/pipeline_spec.rb
+ - spec/features/projects/product_analytics/events_spec.rb
+ - spec/features/projects/settings/project_settings_spec.rb
+ - spec/features/projects/settings/repository_settings_spec.rb
+ - spec/features/projects/snippets/user_views_snippets_spec.rb
+ - spec/features/projects/user_sees_user_popover_spec.rb
+ - spec/features/snippets/embedded_snippet_spec.rb
+ - spec/finders/alert_management/alerts_finder_spec.rb
+ - spec/finders/ci/commit_statuses_finder_spec.rb
+ - spec/finders/container_repositories_finder_spec.rb
+ - spec/finders/deployments_finder_spec.rb
+ - spec/finders/design_management/designs_finder_spec.rb
+ - spec/finders/design_management/versions_finder_spec.rb
+ - spec/finders/events_finder_spec.rb
+ - spec/finders/group_descendants_finder_spec.rb
+ - spec/finders/groups_finder_spec.rb
+ - spec/finders/metrics/dashboards/annotations_finder_spec.rb
+ - spec/finders/metrics/users_starred_dashboards_finder_spec.rb
+ - spec/finders/packages/conan/package_file_finder_spec.rb
+ - spec/finders/packages/go/module_finder_spec.rb
+ - spec/finders/packages/group_packages_finder_spec.rb
+ - spec/finders/packages/nuget/package_finder_spec.rb
+ - spec/finders/packages/package_file_finder_spec.rb
+ - spec/finders/packages/package_finder_spec.rb
+ - spec/finders/template_finder_spec.rb
+ - spec/finders/todos_finder_spec.rb
+ - spec/finders/user_recent_events_finder_spec.rb
+ - spec/frontend/fixtures/pipelines.rb
+ - spec/graphql/features/authorization_spec.rb
+ - spec/graphql/gitlab_schema_spec.rb
+ - spec/graphql/mutations/alert_management/alerts/todo/create_spec.rb
+ - spec/graphql/mutations/alert_management/create_alert_issue_spec.rb
+ - spec/graphql/mutations/alert_management/http_integration/create_spec.rb
+ - spec/graphql/mutations/alert_management/http_integration/destroy_spec.rb
+ - spec/graphql/mutations/alert_management/http_integration/reset_token_spec.rb
+ - spec/graphql/mutations/alert_management/http_integration/update_spec.rb
+ - spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
+ - spec/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb
+ - spec/graphql/mutations/alert_management/prometheus_integration/update_spec.rb
+ - spec/graphql/mutations/alert_management/update_alert_status_spec.rb
+ - spec/graphql/mutations/boards/lists/update_spec.rb
+ - spec/graphql/mutations/custom_emoji/create_spec.rb
+ - spec/graphql/mutations/discussions/toggle_resolve_spec.rb
+ - spec/graphql/mutations/environments/canary_ingress/update_spec.rb
+ - spec/graphql/mutations/issues/set_severity_spec.rb
+ - spec/graphql/mutations/labels/create_spec.rb
+ - spec/graphql/mutations/notes/reposition_image_diff_note_spec.rb
+ - spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb
+ - spec/graphql/resolvers/alert_management/alert_status_counts_resolver_spec.rb
+ - spec/graphql/resolvers/branch_commit_resolver_spec.rb
+ - spec/graphql/resolvers/design_management/designs_resolver_spec.rb
+ - spec/graphql/resolvers/design_management/version/designs_at_version_resolver_spec.rb
+ - spec/graphql/resolvers/group_milestones_resolver_spec.rb
+ - spec/graphql/resolvers/merge_request_pipelines_resolver_spec.rb
+ - spec/graphql/resolvers/metrics/dashboards/annotation_resolver_spec.rb
+ - spec/graphql/resolvers/project_pipeline_resolver_spec.rb
+ - spec/graphql/resolvers/project_pipelines_resolver_spec.rb
+ - spec/graphql/resolvers/timelog_resolver_spec.rb
+ - spec/graphql/types/admin/analytics/usage_trends/measurement_type_spec.rb
+ - spec/graphql/types/global_id_type_spec.rb
+ - spec/graphql/types/snippet_type_spec.rb
+ - spec/helpers/blob_helper_spec.rb
+ - spec/helpers/broadcast_messages_helper_spec.rb
+ - spec/helpers/ci/runners_helper_spec.rb
+ - spec/helpers/invite_members_helper_spec.rb
+ - spec/helpers/jira_connect_helper_spec.rb
+ - spec/helpers/labels_helper_spec.rb
+ - spec/helpers/markup_helper_spec.rb
+ - spec/helpers/notes_helper_spec.rb
+ - spec/helpers/projects/alert_management_helper_spec.rb
+ - spec/helpers/projects/issues/service_desk_helper_spec.rb
+ - spec/helpers/projects/project_members_helper_spec.rb
+ - spec/helpers/projects/terraform_helper_spec.rb
+ - spec/helpers/projects_helper_spec.rb
+ - spec/helpers/search_helper_spec.rb
+ - spec/lib/api/entities/design_management/design_spec.rb
+ - spec/lib/api/entities/merge_request_changes_spec.rb
+ - spec/lib/api/entities/release_spec.rb
+ - spec/lib/api/helpers/caching_spec.rb
+ - spec/lib/api/helpers/packages_manager_clients_helpers_spec.rb
+ - spec/lib/banzai/filter/external_issue_reference_filter_spec.rb
+ - spec/lib/banzai/filter/inline_metrics_redactor_filter_spec.rb
+ - spec/lib/banzai/filter/upload_link_filter_spec.rb
+ - spec/lib/banzai/pipeline/gfm_pipeline_spec.rb
+ - spec/lib/bulk_imports/groups/loaders/group_loader_spec.rb
+ - spec/lib/extracts_path_spec.rb
+ - spec/lib/extracts_ref_spec.rb
+ - spec/lib/gitlab/alert_management/alert_status_counts_spec.rb
+ - spec/lib/gitlab/alert_management/payload/base_spec.rb
+ - spec/lib/gitlab/alert_management/payload/generic_spec.rb
+ - spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb
+ - spec/lib/gitlab/alert_management/payload/prometheus_spec.rb
+ - spec/lib/gitlab/alert_management/payload_spec.rb
+ - spec/lib/gitlab/analytics/cycle_analytics/base_query_builder_spec.rb
+ - spec/lib/gitlab/analytics/cycle_analytics/median_spec.rb
+ - spec/lib/gitlab/analytics/cycle_analytics/records_fetcher_spec.rb
+ - spec/lib/gitlab/auth/otp/strategies/devise_spec.rb
+ - spec/lib/gitlab/auth/otp/strategies/forti_authenticator_spec.rb
+ - spec/lib/gitlab/auth/otp/strategies/forti_token_cloud_spec.rb
+ - spec/lib/gitlab/auth_spec.rb
+ - spec/lib/gitlab/cache/ci/project_pipeline_status_spec.rb
+ - spec/lib/gitlab/checks/project_created_spec.rb
+ - spec/lib/gitlab/checks/project_moved_spec.rb
+ - spec/lib/gitlab/ci/build/policy/changes_spec.rb
+ - spec/lib/gitlab/ci/config/external/file/local_spec.rb
+ - spec/lib/gitlab/ci/config/external/file/project_spec.rb
+ - spec/lib/gitlab/ci/config/external/file/template_spec.rb
+ - spec/lib/gitlab/ci/config/external/mapper_spec.rb
+ - spec/lib/gitlab/ci/config/external/processor_spec.rb
+ - spec/lib/gitlab/ci/pipeline/chain/build_spec.rb
+ - spec/lib/gitlab/ci/pipeline/chain/cancel_pending_pipelines_spec.rb
+ - spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb
+ - spec/lib/gitlab/ci/pipeline/chain/validate/external_spec.rb
+ - spec/lib/gitlab/ci/pipeline/chain/validate/repository_spec.rb
+ - spec/lib/gitlab/ci/pipeline/seed/build_spec.rb
+ - spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb
+ - spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb
+ - spec/lib/gitlab/ci/pipeline/seed/processable/resource_group_spec.rb
+ - spec/lib/gitlab/ci/reports/test_failure_history_spec.rb
+ - spec/lib/gitlab/ci/syntax_templates_spec.rb
+ - spec/lib/gitlab/ci/trace/chunked_io_spec.rb
+ - spec/lib/gitlab/ci/trace_spec.rb
+ - spec/lib/gitlab/closing_issue_extractor_spec.rb
+ - spec/lib/gitlab/composer/cache_spec.rb
+ - spec/lib/gitlab/data_builder/wiki_page_spec.rb
+ - spec/lib/gitlab/database/partitioning_migration_helpers/foreign_key_helpers_spec.rb
+ - spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb
+ - spec/lib/gitlab/deploy_key_access_spec.rb
+ - spec/lib/gitlab/email/handler/service_desk_handler_spec.rb
+ - spec/lib/gitlab/git/lfs_changes_spec.rb
+ - spec/lib/gitlab/git/merge_base_spec.rb
+ - spec/lib/gitlab/git/push_spec.rb
+ - spec/lib/gitlab/git_access_design_spec.rb
+ - spec/lib/gitlab/git_access_project_spec.rb
+ - spec/lib/gitlab/git_access_wiki_spec.rb
+ - spec/lib/gitlab/gitaly_client/operation_service_spec.rb
+ - spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb
+ - spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb
+ - spec/lib/gitlab/github_import/milestone_finder_spec.rb
+ - spec/lib/gitlab/gl_repository/repo_type_spec.rb
+ - spec/lib/gitlab/graphql/batch_key_spec.rb
+ - spec/lib/gitlab/graphql/docs/renderer_spec.rb
+ - spec/lib/gitlab/graphql/loaders/batch_lfs_oid_loader_spec.rb
+ - spec/lib/gitlab/graphql/markdown_field_spec.rb
+ - spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb
+ - spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb
+ - spec/lib/gitlab/group_search_results_spec.rb
+ - spec/lib/gitlab/hook_data/issue_builder_spec.rb
+ - spec/lib/gitlab/hook_data/merge_request_builder_spec.rb
+ - spec/lib/gitlab/hook_data/release_builder_spec.rb
+ - spec/lib/gitlab/import_export/design_repo_saver_spec.rb
+ - spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb
+ - spec/lib/gitlab/import_export/project/export_task_spec.rb
+ - spec/lib/gitlab/import_export/project/tree_saver_spec.rb
+ - spec/lib/gitlab/import_export/repo_saver_spec.rb
+ - spec/lib/gitlab/import_export/snippet_repo_saver_spec.rb
+ - spec/lib/gitlab/import_export/snippets_repo_saver_spec.rb
+ - spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb
+ - spec/lib/gitlab/jira_import/base_importer_spec.rb
+ - spec/lib/gitlab/jira_import/handle_labels_service_spec.rb
+ - spec/lib/gitlab/jira_import_spec.rb
+ - spec/lib/gitlab/json_cache_spec.rb
+ - spec/lib/gitlab/language_detection_spec.rb
+ - spec/lib/gitlab/phabricator_import/cache/map_spec.rb
+ - spec/lib/gitlab/phabricator_import/issues/task_importer_spec.rb
+ - spec/lib/gitlab/project_search_results_spec.rb
+ - spec/lib/gitlab/prometheus/query_variables_spec.rb
+ - spec/lib/gitlab/reactive_cache_set_cache_spec.rb
+ - spec/lib/gitlab/reference_extractor_spec.rb
+ - spec/lib/gitlab/repository_cache_spec.rb
+ - spec/lib/gitlab/repository_hash_cache_spec.rb
+ - spec/lib/gitlab/repository_set_cache_spec.rb
+ - spec/lib/gitlab/repository_size_checker_spec.rb
+ - spec/lib/gitlab/repository_size_error_message_spec.rb
+ - spec/lib/gitlab/search_results_spec.rb
+ - spec/lib/gitlab/shell_spec.rb
+ - spec/lib/gitlab/slash_commands/presenters/issue_comment_spec.rb
+ - spec/lib/gitlab/slash_commands/presenters/issue_move_spec.rb
+ - spec/lib/gitlab/snippet_search_results_spec.rb
+ - spec/lib/gitlab/sourcegraph_spec.rb
+ - spec/lib/gitlab/template/finders/repo_template_finders_spec.rb
+ - spec/lib/gitlab/tree_summary_spec.rb
+ - spec/lib/gitlab/url_builder_spec.rb
+ - spec/lib/gitlab/usage/metrics/aggregates/sources/postgres_hll_spec.rb
+ - spec/lib/gitlab/utils/usage_data_spec.rb
+ - spec/lib/gitlab/workhorse_spec.rb
+ - spec/mailers/emails/projects_spec.rb
+ - spec/mailers/emails/releases_spec.rb
+ - spec/mailers/emails/service_desk_spec.rb
+ - spec/models/abuse_report_spec.rb
+ - spec/models/alert_management/alert_spec.rb
+ - spec/models/audit_event_spec.rb
+ - spec/models/blob_viewer/gitlab_ci_yml_spec.rb
+ - spec/models/blob_viewer/metrics_dashboard_yml_spec.rb
+ - spec/models/chat_name_spec.rb
+ - spec/models/chat_team_spec.rb
+ - spec/models/ci/artifact_blob_spec.rb
+ - spec/models/ci/build_spec.rb
+ - spec/models/ci/build_trace_chunk_spec.rb
+ - spec/models/ci/daily_build_group_report_result_spec.rb
+ - spec/models/ci/pipeline_spec.rb
+ - spec/models/ci/runner_spec.rb
+ - spec/models/ci/stage_spec.rb
+ - spec/models/clusters/kubernetes_namespace_spec.rb
+ - spec/models/commit_spec.rb
+ - spec/models/concerns/batch_destroy_dependent_associations_spec.rb
+ - spec/models/concerns/featurable_spec.rb
+ - spec/models/deploy_token_spec.rb
+ - spec/models/deployment_spec.rb
+ - spec/models/diff_viewer/server_side_spec.rb
+ - spec/models/environment_spec.rb
+ - spec/models/event_collection_spec.rb
+ - spec/models/label_note_spec.rb
+ - spec/models/lfs_file_lock_spec.rb
+ - spec/models/member_spec.rb
+ - spec/models/merge_request_diff_spec.rb
+ - spec/models/namespace/root_storage_statistics_spec.rb
+ - spec/models/note_spec.rb
+ - spec/models/notification_setting_spec.rb
+ - spec/models/operations/feature_flag_spec.rb
+ - spec/models/packages/dependency_spec.rb
+ - spec/models/packages/go/module_version_spec.rb
+ - spec/models/packages/package_spec.rb
+ - spec/models/packages/tag_spec.rb
+ - spec/models/plan_limits_spec.rb
+ - spec/models/project_services/chat_message/alert_message_spec.rb
+ - spec/models/project_services/jira_service_spec.rb
+ - spec/models/project_services/prometheus_service_spec.rb
+ - spec/models/project_services/slack_service_spec.rb
+ - spec/models/project_spec.rb
+ - spec/models/prometheus_alert_spec.rb
+ - spec/models/protected_branch/push_access_level_spec.rb
+ - spec/models/release_spec.rb
+ - spec/models/releases/evidence_spec.rb
+ - spec/models/releases/source_spec.rb
+ - spec/models/repository_spec.rb
+ - spec/models/service_spec.rb
+ - spec/models/snippet_repository_spec.rb
+ - spec/models/snippet_spec.rb
+ - spec/models/terraform/state_spec.rb
+ - spec/models/u2f_registration_spec.rb
+ - spec/models/user_spec.rb
+ - spec/models/wiki_page/meta_spec.rb
+ - spec/models/wiki_page_spec.rb
+ - spec/policies/application_setting/term_policy_spec.rb
+ - spec/policies/ci/build_policy_spec.rb
+ - spec/policies/design_management/design_policy_spec.rb
+ - spec/policies/group_deploy_keys_group_policy_spec.rb
+ - spec/policies/group_policy_spec.rb
+ - spec/policies/project_snippet_policy_spec.rb
+ - spec/policies/service_policy_spec.rb
+ - spec/presenters/alert_management/alert_presenter_spec.rb
+ - spec/presenters/ci/pipeline_presenter_spec.rb
+ - spec/presenters/label_presenter_spec.rb
+ - spec/presenters/packages/composer/packages_presenter_spec.rb
+ - spec/presenters/packages/conan/package_presenter_spec.rb
+ - spec/presenters/packages/detail/package_presenter_spec.rb
+ - spec/presenters/packages/npm/package_presenter_spec.rb
+ - spec/presenters/packages/nuget/search_results_presenter_spec.rb
+ - spec/presenters/project_presenter_spec.rb
+ - spec/presenters/prometheus_alert_presenter_spec.rb
+ - spec/presenters/release_presenter_spec.rb
+ - spec/presenters/user_presenter_spec.rb
+ - spec/requests/api/api_spec.rb
+ - spec/requests/api/award_emoji_spec.rb
+ - spec/requests/api/branches_spec.rb
+ - spec/requests/api/ci/pipelines_spec.rb
+ - spec/requests/api/composer_packages_spec.rb
+ - spec/requests/api/deploy_tokens_spec.rb
+ - spec/requests/api/deployments_spec.rb
+ - spec/requests/api/error_tracking_spec.rb
+ - spec/requests/api/feature_flags_spec.rb
+ - spec/requests/api/freeze_periods_spec.rb
+ - spec/requests/api/generic_packages_spec.rb
+ - spec/requests/api/graphql/boards/board_lists_query_spec.rb
+ - spec/requests/api/graphql/ci/pipelines_spec.rb
+ - spec/requests/api/graphql/current_user_todos_spec.rb
+ - spec/requests/api/graphql/group/timelogs_spec.rb
+ - spec/requests/api/graphql/issue_status_counts_spec.rb
+ - spec/requests/api/graphql/metrics/dashboard_query_spec.rb
+ - spec/requests/api/graphql/mutations/admin/sidekiq_queues/delete_jobs_spec.rb
+ - spec/requests/api/graphql/mutations/alert_management/alerts/set_assignees_spec.rb
+ - spec/requests/api/graphql/mutations/alert_management/alerts/todo/create_spec.rb
+ - spec/requests/api/graphql/mutations/alert_management/alerts/update_alert_status_spec.rb
+ - spec/requests/api/graphql/mutations/alert_management/http_integration/create_spec.rb
+ - spec/requests/api/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
+ - spec/requests/api/graphql/mutations/award_emojis/add_spec.rb
+ - spec/requests/api/graphql/mutations/award_emojis/toggle_spec.rb
+ - spec/requests/api/graphql/mutations/boards/create_spec.rb
+ - spec/requests/api/graphql/mutations/boards/destroy_spec.rb
+ - spec/requests/api/graphql/mutations/boards/lists/destroy_spec.rb
+ - spec/requests/api/graphql/mutations/boards/lists/update_spec.rb
+ - spec/requests/api/graphql/mutations/branches/create_spec.rb
+ - spec/requests/api/graphql/mutations/ci/ci_cd_settings_update_spec.rb
+ - spec/requests/api/graphql/mutations/commits/create_spec.rb
+ - spec/requests/api/graphql/mutations/container_expiration_policy/update_spec.rb
+ - spec/requests/api/graphql/mutations/discussions/toggle_resolve_spec.rb
+ - spec/requests/api/graphql/mutations/environments/canary_ingress/update_spec.rb
+ - spec/requests/api/graphql/mutations/issues/set_locked_spec.rb
+ - spec/requests/api/graphql/mutations/issues/set_severity_spec.rb
+ - spec/requests/api/graphql/mutations/issues/update_spec.rb
+ - spec/requests/api/graphql/mutations/jira_import/import_users_spec.rb
+ - spec/requests/api/graphql/mutations/jira_import/start_spec.rb
+ - spec/requests/api/graphql/mutations/labels/create_spec.rb
+ - spec/requests/api/graphql/mutations/merge_requests/accept_spec.rb
+ - spec/requests/api/graphql/mutations/merge_requests/create_spec.rb
+ - spec/requests/api/graphql/mutations/metrics/dashboard/annotations/create_spec.rb
+ - spec/requests/api/graphql/mutations/namespace/package_settings/update_spec.rb
+ - spec/requests/api/graphql/mutations/notes/create/diff_note_spec.rb
+ - spec/requests/api/graphql/mutations/notes/create/image_diff_note_spec.rb
+ - spec/requests/api/graphql/mutations/notes/create/note_spec.rb
+ - spec/requests/api/graphql/mutations/notes/reposition_image_diff_note_spec.rb
+ - spec/requests/api/graphql/mutations/notes/update/image_diff_note_spec.rb
+ - spec/requests/api/graphql/mutations/snippets/mark_as_spam_spec.rb
+ - spec/requests/api/graphql/mutations/snippets/update_spec.rb
+ - spec/requests/api/graphql/mutations/user_callouts/create_spec.rb
+ - spec/requests/api/graphql/namespace/package_settings_spec.rb
+ - spec/requests/api/graphql/project/alert_management/alert/issue_spec.rb
+ - spec/requests/api/graphql/project/alert_management/alert_status_counts_spec.rb
+ - spec/requests/api/graphql/project/error_tracking/sentry_detailed_error_request_spec.rb
+ - spec/requests/api/graphql/project/error_tracking/sentry_errors_request_spec.rb
+ - spec/requests/api/graphql/project/issue/designs/designs_spec.rb
+ - spec/requests/api/graphql/project/project_pipeline_statistics_spec.rb
+ - spec/requests/api/graphql/project_query_spec.rb
+ - spec/requests/api/graphql/query_spec.rb
+ - spec/requests/api/graphql/user/starred_projects_query_spec.rb
+ - spec/requests/api/graphql/user_query_spec.rb
+ - spec/requests/api/graphql_spec.rb
+ - spec/requests/api/group_import_spec.rb
+ - spec/requests/api/group_milestones_spec.rb
+ - spec/requests/api/group_packages_spec.rb
+ - spec/requests/api/groups_spec.rb
+ - spec/requests/api/helpers_spec.rb
+ - spec/requests/api/import_bitbucket_server_spec.rb
+ - spec/requests/api/internal/base_spec.rb
+ - spec/requests/api/lint_spec.rb
+ - spec/requests/api/markdown_spec.rb
+ - spec/requests/api/merge_requests_spec.rb
+ - spec/requests/api/metrics/dashboard/annotations_spec.rb
+ - spec/requests/api/metrics/user_starred_dashboards_spec.rb
+ - spec/requests/api/nuget_project_packages_spec.rb
+ - spec/requests/api/project_clusters_spec.rb
+ - spec/requests/api/project_container_repositories_spec.rb
+ - spec/requests/api/project_milestones_spec.rb
+ - spec/requests/api/project_packages_spec.rb
+ - spec/requests/api/pypi_packages_spec.rb
+ - spec/requests/api/rubygem_packages_spec.rb
+ - spec/requests/api/unleash_spec.rb
+ - spec/requests/api/users_spec.rb
+ - spec/requests/groups/email_campaigns_controller_spec.rb
+ - spec/requests/import/gitlab_groups_controller_spec.rb
+ - spec/requests/jwt_controller_spec.rb
+ - spec/requests/lfs_http_spec.rb
+ - spec/requests/product_analytics/collector_app_spec.rb
+ - spec/requests/rack_attack_global_spec.rb
+ - spec/serializers/admin/user_entity_spec.rb
+ - spec/serializers/ci/lint/result_serializer_spec.rb
+ - spec/serializers/ci/pipeline_entity_spec.rb
+ - spec/serializers/container_repository_entity_spec.rb
+ - spec/serializers/container_tag_entity_spec.rb
+ - spec/serializers/deployment_serializer_spec.rb
+ - spec/serializers/diff_file_entity_spec.rb
+ - spec/serializers/evidences/evidence_entity_spec.rb
+ - spec/serializers/fork_namespace_entity_spec.rb
+ - spec/serializers/group_link/group_group_link_entity_spec.rb
+ - spec/serializers/group_link/project_group_link_entity_spec.rb
+ - spec/serializers/issue_board_entity_spec.rb
+ - spec/serializers/member_entity_spec.rb
+ - spec/serializers/member_user_entity_spec.rb
+ - spec/serializers/merge_request_diff_entity_spec.rb
+ - spec/serializers/merge_request_poll_cached_widget_entity_spec.rb
+ - spec/serializers/merge_request_user_entity_spec.rb
+ - spec/serializers/namespace_basic_entity_spec.rb
+ - spec/serializers/pipeline_details_entity_spec.rb
+ - spec/serializers/project_import_entity_spec.rb
+ - spec/serializers/project_serializer_spec.rb
+ - spec/serializers/review_app_setup_entity_spec.rb
+ - spec/services/admin/propagate_service_template_spec.rb
+ - spec/services/alert_management/create_alert_issue_service_spec.rb
+ - spec/services/audit_event_service_spec.rb
+ - spec/services/auth/dependency_proxy_authentication_service_spec.rb
+ - spec/services/auto_merge_service_spec.rb
+ - spec/services/award_emojis/add_service_spec.rb
+ - spec/services/award_emojis/destroy_service_spec.rb
+ - spec/services/award_emojis/toggle_service_spec.rb
+ - spec/services/boards/destroy_service_spec.rb
+ - spec/services/boards/issues/move_service_spec.rb
+ - spec/services/bulk_create_integration_service_spec.rb
+ - spec/services/ci/change_variable_service_spec.rb
+ - spec/services/ci/change_variables_service_spec.rb
+ - spec/services/ci/create_pipeline_service/cross_project_pipeline_spec.rb
+ - spec/services/ci/create_pipeline_service/custom_config_content_spec.rb
+ - spec/services/ci/create_pipeline_service/dry_run_spec.rb
+ - spec/services/ci/create_pipeline_service/environment_spec.rb
+ - spec/services/ci/create_pipeline_service/parameter_content_spec.rb
+ - spec/services/ci/create_pipeline_service/parent_child_pipeline_spec.rb
+ - spec/services/ci/create_pipeline_service_spec.rb
+ - spec/services/ci/create_web_ide_terminal_service_spec.rb
+ - spec/services/ci/expire_pipeline_cache_service_spec.rb
+ - spec/services/ci/external_pull_requests/create_pipeline_service_spec.rb
+ - spec/services/ci/find_exposed_artifacts_service_spec.rb
+ - spec/services/ci/job_artifacts/create_service_spec.rb
+ - spec/services/ci/parse_dotenv_artifact_service_spec.rb
+ - spec/services/ci/pipeline_bridge_status_service_spec.rb
+ - spec/services/ci/pipeline_trigger_service_spec.rb
+ - spec/services/ci/prometheus_metrics/observe_histograms_service_spec.rb
+ - spec/services/ci/register_job_service_spec.rb
+ - spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb
+ - spec/services/ci/retry_build_service_spec.rb
+ - spec/services/ci/stop_environments_service_spec.rb
+ - spec/services/clusters/applications/prometheus_health_check_service_spec.rb
+ - spec/services/container_expiration_policy_service_spec.rb
+ - spec/services/dependency_proxy/find_or_create_manifest_service_spec.rb
+ - spec/services/design_management/copy_design_collection/copy_service_spec.rb
+ - spec/services/design_management/delete_designs_service_spec.rb
+ - spec/services/design_management/save_designs_service_spec.rb
+ - spec/services/discussions/resolve_service_spec.rb
+ - spec/services/discussions/unresolve_service_spec.rb
+ - spec/services/environments/auto_stop_service_spec.rb
+ - spec/services/environments/canary_ingress/update_service_spec.rb
+ - spec/services/environments/reset_auto_stop_service_spec.rb
+ - spec/services/feature_flags/create_service_spec.rb
+ - spec/services/feature_flags/destroy_service_spec.rb
+ - spec/services/feature_flags/disable_service_spec.rb
+ - spec/services/feature_flags/enable_service_spec.rb
+ - spec/services/feature_flags/update_service_spec.rb
+ - spec/services/git/branch_push_service_spec.rb
+ - spec/services/groups/auto_devops_service_spec.rb
+ - spec/services/groups/group_links/update_service_spec.rb
+ - spec/services/groups/transfer_service_spec.rb
+ - spec/services/groups/update_shared_runners_service_spec.rb
+ - spec/services/ide/base_config_service_spec.rb
+ - spec/services/ide/schemas_config_service_spec.rb
+ - spec/services/ide/terminal_config_service_spec.rb
+ - spec/services/import/bitbucket_server_service_spec.rb
+ - spec/services/incident_management/incidents/create_service_spec.rb
+ - spec/services/incident_management/pager_duty/create_incident_issue_service_spec.rb
+ - spec/services/incident_management/pager_duty/process_webhook_service_spec.rb
+ - spec/services/integrations/test/project_service_spec.rb
+ - spec/services/issuable/bulk_update_service_spec.rb
+ - spec/services/issues/build_service_spec.rb
+ - spec/services/issues/clone_service_spec.rb
+ - spec/services/issues/create_service_spec.rb
+ - spec/services/issues/export_csv_service_spec.rb
+ - spec/services/issues/move_service_spec.rb
+ - spec/services/issues/related_branches_service_spec.rb
+ - spec/services/jira_connect/sync_service_spec.rb
+ - spec/services/jira_import/start_import_service_spec.rb
+ - spec/services/jira_import/users_importer_spec.rb
+ - spec/services/markdown_content_rewriter_service_spec.rb
+ - spec/services/members/create_service_spec.rb
+ - spec/services/members/invite_service_spec.rb
+ - spec/services/merge_requests/base_service_spec.rb
+ - spec/services/merge_requests/create_pipeline_service_spec.rb
+ - spec/services/merge_requests/export_csv_service_spec.rb
+ - spec/services/merge_requests/merge_orchestration_service_spec.rb
+ - spec/services/merge_requests/merge_service_spec.rb
+ - spec/services/merge_requests/merge_to_ref_service_spec.rb
+ - spec/services/metrics/dashboard/annotations/create_service_spec.rb
+ - spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb
+ - spec/services/metrics/users_starred_dashboards/create_service_spec.rb
+ - spec/services/notes/copy_service_spec.rb
+ - spec/services/notes/create_service_spec.rb
+ - spec/services/notes/destroy_service_spec.rb
+ - spec/services/notes/quick_actions_service_spec.rb
+ - spec/services/notes/update_service_spec.rb
+ - spec/services/notification_service_spec.rb
+ - spec/services/packages/composer/create_package_service_spec.rb
+ - spec/services/packages/conan/search_service_spec.rb
+ - spec/services/packages/create_package_file_service_spec.rb
+ - spec/services/packages/debian/find_or_create_package_service_spec.rb
+ - spec/services/packages/generic/create_package_file_service_spec.rb
+ - spec/services/packages/maven/find_or_create_package_service_spec.rb
+ - spec/services/packages/nuget/search_service_spec.rb
+ - spec/services/packages/rubygems/dependency_resolver_service_spec.rb
+ - spec/services/pod_logs/base_service_spec.rb
+ - spec/services/pod_logs/elasticsearch_service_spec.rb
+ - spec/services/pod_logs/kubernetes_service_spec.rb
+ - spec/services/projects/alerting/notify_service_spec.rb
+ - spec/services/projects/create_service_spec.rb
+ - spec/services/projects/destroy_rollback_service_spec.rb
+ - spec/services/projects/destroy_service_spec.rb
+ - spec/services/projects/gitlab_projects_import_service_spec.rb
+ - spec/services/projects/group_links/create_service_spec.rb
+ - spec/services/projects/group_links/destroy_service_spec.rb
+ - spec/services/projects/group_links/update_service_spec.rb
+ - spec/services/projects/prometheus/alerts/notify_service_spec.rb
+ - spec/services/projects/transfer_service_spec.rb
+ - spec/services/projects/update_pages_service_spec.rb
+ - spec/services/prometheus/create_default_alerts_service_spec.rb
+ - spec/services/quick_actions/interpret_service_spec.rb
+ - spec/services/releases/create_evidence_service_spec.rb
+ - spec/services/repositories/destroy_rollback_service_spec.rb
+ - spec/services/repositories/destroy_service_spec.rb
+ - spec/services/repositories/shell_destroy_service_spec.rb
+ - spec/services/resource_access_tokens/create_service_spec.rb
+ - spec/services/resource_access_tokens/revoke_service_spec.rb
+ - spec/services/resource_events/change_labels_service_spec.rb
+ - spec/services/resource_events/merge_into_notes_service_spec.rb
+ - spec/services/security/ci_configuration/sast_create_service_spec.rb
+ - spec/services/snippets/bulk_destroy_service_spec.rb
+ - spec/services/snippets/create_service_spec.rb
+ - spec/services/snippets/update_service_spec.rb
+ - spec/services/spam/ham_service_spec.rb
+ - spec/services/spam/spam_action_service_spec.rb
+ - spec/services/spam/spam_verdict_service_spec.rb
+ - spec/services/system_note_service_spec.rb
+ - spec/services/system_notes/issuables_service_spec.rb
+ - spec/services/test_hooks/project_service_spec.rb
+ - spec/services/test_hooks/system_service_spec.rb
+ - spec/services/users/approve_service_spec.rb
+ - spec/services/users/reject_service_spec.rb
+ - spec/services/users/validate_otp_service_spec.rb
+ - spec/services/wiki_pages/event_create_service_spec.rb
+ - spec/support/shared_examples/graphql/design_fields_shared_examples.rb
+ - spec/support/shared_examples/graphql/mutations/set_assignees_shared_examples.rb
+ - spec/support/shared_examples/models/slack_mattermost_notifications_shared_examples.rb
+ - spec/support/shared_examples/quick_actions/issuable/issuable_quick_actions_shared_examples.rb
+ - spec/support/shared_examples/services/container_registry_auth_service_shared_examples.rb
+ - spec/support/shared_examples/services/packages_shared_examples.rb
+ - spec/tasks/gitlab/db_rake_spec.rb
+ - spec/tasks/gitlab/packages/composer_rake_spec.rb
+ - spec/tasks/gitlab/snippets_rake_spec.rb
+ - spec/uploaders/content_type_whitelist_spec.rb
+ - spec/uploaders/dependency_proxy/file_uploader_spec.rb
+ - spec/views/admin/application_settings/_eks.html.haml_spec.rb
+ - spec/views/admin/application_settings/_package_registry.html.haml_spec.rb
+ - spec/views/layouts/nav/sidebar/_project_security_link.html.haml_spec.rb
+ - spec/views/projects/pipelines/new.html.haml_spec.rb
+ - spec/views/projects/pipelines/show.html.haml_spec.rb
+ - spec/views/search/_results.html.haml_spec.rb
+ - spec/views/shared/_label_row.html.haml_spec.rb
+ - spec/views/shared/milestones/_top.html.haml_spec.rb
+ - spec/workers/ci/create_cross_project_pipeline_worker_spec.rb
+ - spec/workers/cluster_update_app_worker_spec.rb
+ - spec/workers/environments/canary_ingress/update_worker_spec.rb
+ - spec/workers/expire_job_cache_worker_spec.rb
+ - spec/workers/gitlab/jira_import/import_issue_worker_spec.rb
+ - spec/workers/gitlab/jira_import/stage/start_import_worker_spec.rb
+ - spec/workers/gitlab/jira_import/stuck_jira_import_jobs_worker_spec.rb
+ - spec/workers/import_issues_csv_worker_spec.rb
+ - spec/workers/incident_management/add_severity_system_note_worker_spec.rb
+ - spec/workers/incident_management/process_alert_worker_spec.rb
+ - spec/workers/incident_management/process_prometheus_alert_worker_spec.rb
+ - spec/workers/jira_connect/sync_project_worker_spec.rb
+ - spec/workers/namespaces/onboarding_issue_created_worker_spec.rb
+ - spec/workers/packages/composer/cache_update_worker_spec.rb
+ - spec/workers/pages_domain_ssl_renewal_cron_worker_spec.rb
+ - spec/workers/projects/git_garbage_collect_worker_spec.rb
+ - spec/workers/prometheus/create_default_alerts_worker_spec.rb
+ - spec/workers/propagate_integration_group_worker_spec.rb
+ - spec/workers/propagate_integration_project_worker_spec.rb
+ - spec/workers/run_pipeline_schedule_worker_spec.rb
+ - spec/workers/update_external_pull_requests_worker_spec.rb
+
RSpec/TimecopFreeze:
Exclude:
- 'ee/spec/controllers/admin/application_settings_controller_spec.rb'
@@ -2573,3 +3560,20 @@ Cop/UserAdmin:
- 'lib/gitlab/performance_bar.rb'
- 'lib/gitlab/visibility_level.rb'
- 'qa/qa/runtime/api/client.rb'
+
+# WIP https://gitlab.com/gitlab-org/gitlab/-/issues/325744
+Performance/OpenStruct:
+ Exclude:
+ - 'Guardfile'
+ - 'app/finders/snippets_finder.rb'
+ - 'app/helpers/application_settings_helper.rb'
+ - 'app/models/cycle_analytics/project_level_stage_adapter.rb'
+ - 'ee/lib/gitlab/graphql/aggregations/epics/epic_node.rb'
+ - 'ee/lib/gitlab/graphql/aggregations/epics/epic_node.rb'
+ - 'lib/api/wikis.rb'
+ - 'lib/gitlab/ci/ansi2html.rb'
+ - 'lib/gitlab/ci/reports/test_suite_comparer.rb'
+ - 'lib/gitlab/git/diff_collection.rb'
+ - 'lib/gitlab/import_export/after_export_strategies/base_after_export_strategy.rb'
+ - 'lib/gitlab/testing/request_inspector_middleware.rb'
+ - 'lib/mattermost/session.rb'
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index d6982146426..35778f056b4 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -323,10 +323,6 @@ Performance/Detect:
Performance/MethodObjectAsBlock:
Enabled: false
-# Offense count: 42
-Performance/OpenStruct:
- Enabled: false
-
# Offense count: 18
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect.
@@ -380,11 +376,6 @@ RSpec/EmptyExampleGroup:
- 'ee/spec/services/personal_access_tokens/revoke_invalid_tokens_spec.rb'
- 'spec/services/projects/prometheus/alerts/notify_service_spec.rb'
-# Offense count: 1162
-# Cop supports --auto-correct.
-RSpec/EmptyLineAfterFinalLetItBe:
- Enabled: false
-
# Offense count: 1428
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
diff --git a/Gemfile b/Gemfile
index 1774f09a61a..522122b13e4 100644
--- a/Gemfile
+++ b/Gemfile
@@ -440,11 +440,7 @@ end
gem 'octokit', '~> 4.15'
# https://gitlab.com/gitlab-org/gitlab/issues/207207
-gem 'gitlab-mail_room', '~> 0.0.10', require: false
-# Ruby v3.0 promoted net-http and net-imap from stdlib. Adding net-http as a
-# dependency avoids "already initialized constant errors" if net-imap is installed.
-gem 'net-http', '~> 0.1'
-gem 'uri', '= 0.10.0' # Lock this for bundler v2.1.4
+gem 'gitlab-mail_room', '~> 0.0.9', require: 'mail_room'
gem 'email_reply_trimmer', '~> 0.1'
gem 'html2text'
diff --git a/Gemfile.lock b/Gemfile.lock
index 5a2787130ef..5d63cb1cb2d 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -268,7 +268,6 @@ GEM
diff-lcs (1.4.4)
diff_match_patch (0.1.0)
diffy (3.3.0)
- digest (3.0.0)
discordrb-webhooks (3.4.2)
rest-client (>= 2.0.0)
docile (1.3.2)
@@ -465,8 +464,7 @@ GEM
pg_query (~> 1.3)
redis (> 3.0.0, < 5.0.0)
gitlab-license (1.3.1)
- gitlab-mail_room (0.0.10)
- net-imap (>= 0.2.1)
+ gitlab-mail_room (0.0.9)
gitlab-markup (1.7.1)
gitlab-net-dns (0.9.1)
gitlab-pry-byebug (3.9.0)
@@ -765,18 +763,10 @@ GEM
mustermann (>= 1.0.0)
nap (1.1.0)
nenv (0.3.0)
- net-http (0.1.1)
- net-protocol
- uri
net-http-persistent (4.0.1)
connection_pool (~> 2.2)
- net-imap (0.2.1)
- digest
- net-protocol
- strscan
net-ldap (0.16.3)
net-ntp (2.1.3)
- net-protocol (0.1.0)
net-scp (3.0.0)
net-ssh (>= 2.6.5, < 7.0.0)
net-ssh (6.0.0)
@@ -1218,7 +1208,6 @@ GEM
state_machines-activerecord (0.8.0)
activerecord (>= 5.1)
state_machines-activemodel (>= 0.8.0)
- strscan (3.0.0)
swd (1.1.2)
activesupport (>= 3)
attr_required (>= 0.0.5)
@@ -1289,7 +1278,6 @@ GEM
equalizer (~> 0.0.9)
parser (>= 2.6.5)
procto (~> 0.0.2)
- uri (0.10.0)
uri_template (0.7.0)
valid_email (0.1.3)
activemodel
@@ -1439,7 +1427,7 @@ DEPENDENCIES
gitlab-fog-google (~> 1.13)
gitlab-labkit (~> 0.16.2)
gitlab-license (~> 1.3)
- gitlab-mail_room (~> 0.0.10)
+ gitlab-mail_room (~> 0.0.9)
gitlab-markup (~> 1.7.1)
gitlab-net-dns (~> 0.9.1)
gitlab-pry-byebug
@@ -1501,7 +1489,6 @@ DEPENDENCIES
mini_magick (~> 4.10.1)
minitest (~> 5.11.0)
multi_json (~> 1.14.1)
- net-http (~> 0.1)
net-ldap (~> 0.16.3)
net-ntp
net-ssh (~> 6.0)
@@ -1610,7 +1597,6 @@ DEPENDENCIES
unicorn (~> 5.5)
unicorn-worker-killer (~> 0.4.4)
unleash (~> 0.1.5)
- uri (= 0.10.0)
valid_email (~> 0.1)
validates_hostname (~> 1.0.11)
version_sorter (~> 2.2.4)
diff --git a/app/assets/javascripts/vue_shared/components/gl_toggle_vuex.vue b/app/assets/javascripts/vue_shared/components/gl_toggle_vuex.vue
deleted file mode 100644
index b649dac029a..00000000000
--- a/app/assets/javascripts/vue_shared/components/gl_toggle_vuex.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
-
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index f000e474605..5b3671923cc 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -243,19 +243,16 @@ class Deployment < ApplicationRecord
def previous_deployment
@previous_deployment ||=
- project.deployments.joins(:environment)
- .where(environments: { name: self.environment.name }, ref: self.ref)
- .where.not(id: self.id)
+ self.class.for_environment(environment_id)
+ .where(ref: ref)
+ .where.not(id: id)
.order(id: :desc)
.take
end
def previous_environment_deployment
- project
- .deployments
+ self.class.for_environment(environment_id)
.success
- .joins(:environment)
- .where(environments: { name: environment.name })
.where.not(id: self.id)
.order(id: :desc)
.take
diff --git a/changelogs/unreleased/id-n-1-for-merge-request-commits.yml b/changelogs/unreleased/id-n-1-for-merge-request-commits.yml
new file mode 100644
index 00000000000..b958a8b3c7e
--- /dev/null
+++ b/changelogs/unreleased/id-n-1-for-merge-request-commits.yml
@@ -0,0 +1,5 @@
+---
+title: Remove N+1 for API commits/:sha/merge_requests
+merge_request: 57290
+author:
+type: performance
diff --git a/changelogs/unreleased/optimise_previous_environment_deployment.yml b/changelogs/unreleased/optimise_previous_environment_deployment.yml
new file mode 100644
index 00000000000..ee4baafb5b6
--- /dev/null
+++ b/changelogs/unreleased/optimise_previous_environment_deployment.yml
@@ -0,0 +1,5 @@
+---
+title: Optimise query for Deployment#previous_environment_deployment in LinkMergeRequestWorker
+merge_request: 57039
+author:
+type: performance
diff --git a/changelogs/unreleased/sh-update-mailroom.yml b/changelogs/unreleased/sh-update-mailroom.yml
deleted file mode 100644
index b53221ba787..00000000000
--- a/changelogs/unreleased/sh-update-mailroom.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Update mailroom to v0.0.10
-merge_request: 56913
-author:
-type: fixed
diff --git a/config/dependency_decisions.yml b/config/dependency_decisions.yml
index 326c7acb28a..774254d2ff1 100644
--- a/config/dependency_decisions.yml
+++ b/config/dependency_decisions.yml
@@ -331,9 +331,3 @@
:why: https://github.com/xijo/reverse_markdown/blob/master/LICENSE
:versions: []
:when: 2021-02-03 08:47:28.792907000 Z
-- - :approve
- - net-protocol
- - :who: Stan Hu
- :why: "This license is the same as the Ruby license (BSD): https://github.com/ruby/net-protocol/blob/master/LICENSE.txt"
- :versions: []
- :when: 2021-03-18 00:00:46.124036000 Z
diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md
index 9077f1e3b91..1c714dea02b 100644
--- a/doc/administration/instance_limits.md
+++ b/doc/administration/instance_limits.md
@@ -149,7 +149,7 @@ limited to 1KiB, and descriptions (the rest of the message) will be limited to
The maximum number of issues loaded on the milestone overview page is 3000.
When the number exceeds the limit the page displays an alert and links to a paginated
-[issue list](../user/project/issues/index.md#issues-list) of all issues in the milestone.
+[issue list](../user/project/issues/managing_issues.md) of all issues in the milestone.
- **Limit:** 3000 issues
diff --git a/doc/development/experiment_guide/gitlab_experiment.md b/doc/development/experiment_guide/gitlab_experiment.md
index 81d6fc01c5f..a01ad54b697 100644
--- a/doc/development/experiment_guide/gitlab_experiment.md
+++ b/doc/development/experiment_guide/gitlab_experiment.md
@@ -504,18 +504,20 @@ so you can use it when resolving some concepts around experimentation in the cli
### Use experiments in Vue
With the `experiment` component, you can define slots that match the name of the
-variants pushed to `window.gon.experiment`. For example, an experiment with the
-default variants `control` and `candidate` could be implemented like this:
+variants pushed to `window.gon.experiment`. For example, if we alter the `pill_color`
+experiment to just use the default variants of `control` and `candidate` like so:
```ruby
def show
- experiment(:button_color) do |e|
+ experiment(:pill_color) do |e|
e.use { } # control
e.try { } # candidate
end.run
end
```
+We can make use of the named slots `control` and `candidate` in the Vue component:
+
```vue
-
+
-
+
-
+
```
-When you use a multivariate experiment, you can use the variant names. For example,
-the Vue component for the `pill_color` experiment would look like this:
+When you're coding for an experiment with multiple variants, you can use the variant names.
+For example, the Vue component for the previously-defined `pill_color` experiment with `red` and `blue` variants would look like this:
```vue
@@ -560,7 +562,7 @@ the Vue component for the `pill_color` experiment would look like this:
```
NOTE:
-When there is no experiment defined in the frontend via `experiment(:experiment_name)`, then `control` will be rendered if it exists.
+When there is no experiment data in the `window.gon.experiment` object for the given experiment name, the `control` slot will be used, if it exists.
## Notes on feature flags
diff --git a/doc/user/group/bulk_editing/index.md b/doc/user/group/bulk_editing/index.md
index 651bb7c055e..aa356bee8e3 100644
--- a/doc/user/group/bulk_editing/index.md
+++ b/doc/user/group/bulk_editing/index.md
@@ -31,7 +31,7 @@ When bulk editing issues in a group, you can edit the following attributes:
- [Epic](../epics/index.md)
- [Milestone](../../project/milestones/index.md)
- [Labels](../../project/labels.md)
-- [Health status](../../project/issues/index.md#health-status)
+- [Health status](../../project/issues/managing_issues.md#health-status)
- [Iteration](../iterations/index.md)
To update multiple project issues at the same time:
diff --git a/doc/user/group/epics/index.md b/doc/user/group/epics/index.md
index 1cb024ceb01..12377b3926d 100644
--- a/doc/user/group/epics/index.md
+++ b/doc/user/group/epics/index.md
@@ -81,7 +81,7 @@ to:
> - The health status of a closed issue [is hidden](https://gitlab.com/gitlab-org/gitlab/-/issues/220867) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 13.3 or later.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/213567) in GitLab 13.7.
-Report or respond to the health of issues and epics by setting a red, amber, or green [health status](../../project/issues/index.md#health-status), which then appears on your Epic tree.
+Report or respond to the health of issues and epics by setting a red, amber, or green [health status](../../project/issues/managing_issues.md#health-status), which then appears on your Epic tree.
## Multi-level child epics **(ULTIMATE)**
diff --git a/doc/user/group/index.md b/doc/user/group/index.md
index 4a8853bfbd1..52f6ee757ad 100644
--- a/doc/user/group/index.md
+++ b/doc/user/group/index.md
@@ -16,7 +16,7 @@ Then you can:
- Grant members access to multiple projects at once.
- Add to-do items for all of the group members at once.
-- View the [issues](../project/issues/index.md#issues-list) and
+- View the [issues](../project/issues/index.md) and
[merge requests](../project/merge_requests/reviewing_and_managing_merge_requests.md#view-merge-requests-for-all-projects-in-a-group)
for all projects in the group, together in a single list view.
- [Bulk edit](../group/bulk_editing/index.md) issues, epics, and merge requests.
@@ -454,24 +454,21 @@ API requests to add a new user to a project are not possible.
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/1985) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 12.0.
> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/215410) to [GitLab Premium](https://about.gitlab.com/pricing/) in 13.1.
-NOTE:
-IP access restrictions are not functioning as expected on GitLab.com. If enabled,
-users cannot perform Git operations through SSH, or access projects in the UI.
-For more information, [see this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/271673).
-
To ensure only people from your organization can access particular
-resources, you can restrict access to groups by IP address. This setting applies to all subgroups,
-projects, issues, and so on.
+resources, you can restrict access to groups by IP address. This group-level setting
+applies to:
-IP access restrictions can be configured at the group level only.
-
-This restriction applies to:
-
-- The GitLab UI.
+- The GitLab UI, including subgroups, projects, and issues.
- [In GitLab 12.3 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/12874), the API.
-- [In GitLab 12.4 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/32113), Git actions via SSH.
-Administrators and group owners are able to access the group regardless of the IP restriction.
+You should consider these security implications before configuring IP address restrictions:
+
+- **SSH requests**: While you can restrict HTTP traffic on GitLab.com with IP address restrictions,
+ they cause SSH requests, including Git operations over SSH, to fail. For more information,
+ read [issue 271673](https://gitlab.com/gitlab-org/gitlab/-/issues/271673).
+- **Administrators and group owners**: Users with these permission levels can always
+ access the group settings, regardless of IP restriction, but the can't access projects
+ belonging to the group when accessing from a disallowed IP address.
To restrict group access by IP address:
@@ -480,7 +477,7 @@ To restrict group access by IP address:
1. In the **Allow access to the following IP addresses** field, enter IP address ranges in CIDR notation.
1. Select **Save changes**.
-![Domain restriction by IP address](img/restrict-by-ip.gif)
+ ![Domain restriction by IP address](img/restrict-by-ip.gif)
## Restrict group access by domain **(PREMIUM)**
diff --git a/doc/user/index.md b/doc/user/index.md
index 7541e3e85f9..b1daea5d579 100644
--- a/doc/user/index.md
+++ b/doc/user/index.md
@@ -42,7 +42,7 @@ GitLab is a Git-based platform that integrates a great number of essential tools
- Hosting code in repositories with version control.
- Tracking proposals for new implementations, bug reports, and feedback with a
- fully featured [Issue Tracker](project/issues/index.md#issues-list).
+ fully featured [Issue tracker](project/issues/index.md).
- Organizing and prioritizing with [Issue Boards](project/issue_board.md).
- Reviewing code in [Merge Requests](project/merge_requests/index.md) with live-preview changes per
branch with [Review Apps](../ci/review_apps/index.md).
diff --git a/doc/user/project/bulk_editing.md b/doc/user/project/bulk_editing.md
index d7e8133f9ad..76ae4cf596b 100644
--- a/doc/user/project/bulk_editing.md
+++ b/doc/user/project/bulk_editing.md
@@ -33,7 +33,7 @@ When bulk editing issues in a project, you can edit the following attributes:
- [Epic](../group/epics/index.md)
- [Milestone](milestones/index.md)
- [Labels](labels.md)
-- [Health status](issues/index.md#health-status)
+- [Health status](issues/managing_issues.md#health-status)
- Notification subscription
- [Iteration](../group/iterations/index.md)
diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md
index 09e91ee71c4..898857b61c0 100644
--- a/doc/user/project/issue_board.md
+++ b/doc/user/project/issue_board.md
@@ -14,7 +14,7 @@ It can be used as a [Kanban](https://en.wikipedia.org/wiki/Kanban_(development))
It pairs issue tracking and project management, keeping everything together,
so that you don't need to jump between different platforms to organize your workflow.
-Issue boards build on the existing [issue tracking functionality](issues/index.md#issues-list) and
+Issue boards build on the existing [issue tracking functionality](issues/index.md) and
[labels](labels.md). Your issues appear as cards in vertical lists, organized by their assigned
labels, [milestones](#milestone-lists), or [assignees](#assignee-lists).
@@ -88,7 +88,7 @@ You can tailor GitLab issue boards to your own preferred workflow.
Here are some common use cases for issue boards.
For examples of using issue boards along with [epics](../group/epics/index.md),
-[issue health status](issues/index.md#health-status), and
+[issue health status](issues/managing_issues.md#health-status), and
[scoped labels](labels.md#scoped-labels) for various Agile frameworks, check:
- The [How to use GitLab for Agile portfolio planning and project management](https://about.gitlab.com/blog/2020/11/11/gitlab-for-agile-portfolio-planning-project-management/) blog post (November 2020)
diff --git a/doc/user/project/issues/due_dates.md b/doc/user/project/issues/due_dates.md
index 909a20f0e2f..a82823947dc 100644
--- a/doc/user/project/issues/due_dates.md
+++ b/doc/user/project/issues/due_dates.md
@@ -37,7 +37,7 @@ The last way to set a due date is by using [quick actions](../quick_actions.md),
## Making use of due dates
-You can see issues with their due dates in the [issues list](index.md#issues-list).
+You can see issues with their due dates in the issues list.
Overdue issues have their icon and date colored red.
To sort issues by their due dates, select **Due date** from the dropdown menu on the right.
Issues are then sorted from the earliest due date to the latest.
diff --git a/doc/user/project/issues/img/issue_health_status_dropdown_v12_10.png b/doc/user/project/issues/img/issue_health_status_dropdown_v12_10.png
deleted file mode 100644
index f8517de4e12..00000000000
Binary files a/doc/user/project/issues/img/issue_health_status_dropdown_v12_10.png and /dev/null differ
diff --git a/doc/user/project/issues/img/issues_main_view.png b/doc/user/project/issues/img/issues_main_view.png
deleted file mode 100644
index a929916c682..00000000000
Binary files a/doc/user/project/issues/img/issues_main_view.png and /dev/null differ
diff --git a/doc/user/project/issues/img/project_issues_list_view.png b/doc/user/project/issues/img/project_issues_list_view.png
deleted file mode 100644
index c80bd58f5c9..00000000000
Binary files a/doc/user/project/issues/img/project_issues_list_view.png and /dev/null differ
diff --git a/doc/user/project/issues/index.md b/doc/user/project/issues/index.md
index 7c8ba4edd6b..437f4e2b5e8 100644
--- a/doc/user/project/issues/index.md
+++ b/doc/user/project/issues/index.md
@@ -6,209 +6,46 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Issues **(FREE)**
-Issues are the fundamental mechanism in GitLab to collaborate on ideas, solve
-problems, and plan work.
-
-Using issues, you can share and discuss proposals (both before and during their
-implementation) between you and your team, and outside collaborators.
+Use issues to collaborate on ideas, solve problems, and plan work.
+Share and discuss proposals with your team and with outside collaborators.
You can use issues for many purposes, customized to your needs and workflow.
-Common use cases include:
-- Discussing the implementation of a new idea.
-- Tracking tasks and work status.
-- Accepting feature proposals, questions, support requests, or bug reports.
-- Elaborating on new code implementations.
+- Discuss the implementation of an idea.
+- Track tasks and work status.
+- Accept feature proposals, questions, support requests, or bug reports.
+- Elaborate on code implementations.
-For more information about using issues, see the
-[Always start a discussion with an issue](https://about.gitlab.com/blog/2016/03/03/start-with-an-issue/)
-GitLab blog post.
+For more information about using issues, see the GitLab blog post:
+[Always start a discussion with an issue](https://about.gitlab.com/blog/2016/03/03/start-with-an-issue/).
Issues are always associated with a specific project. If you have multiple
-projects in a group, you can view all of the issues collectively at the group
-level.
+projects in a group, you can view all of the projects' issues at once.
-To learn how our Strategic Marketing department uses GitLab issues with [labels](../labels.md) and
+To learn how the GitLab Strategic Marketing department uses GitLab issues with [labels](../labels.md) and
[issue boards](../issue_board.md), see the video on
[Managing Commitments with Issues](https://www.youtube.com/watch?v=cuIHNintg1o&t=3).
-## Parts of an issue
-
-Issues have a flexible content and metadata structure. Here are some of the
-elements you can provide in an issue:
-
-- Title
-- Description and tasks
-- Comments and other activity
-- Author
-- Assignees
-- State (open or closed)
-- Health status (on track, needs attention, or at risk)
-- Confidentiality
-- Tasks (completed vs. outstanding)
-- Milestone
-- Due date
-- Weight
-- Time tracking
-- Labels
-- Votes
-- Reaction emoji
-- Linked issues
-- Assigned epic
-- Unique issue number and URL
-
-## View and manage issues
-
-Key actions for issues include:
-
-- [Creating issues](managing_issues.md#create-a-new-issue)
-- [Moving issues](managing_issues.md#moving-issues)
-- [Closing issues](managing_issues.md#closing-issues)
-- [Deleting issues](managing_issues.md#deleting-issues)
-- [Promoting issues](managing_issues.md#promote-an-issue-to-an-epic)
-
-Although you can view and manage details of an issue on the [issue page](#issue-page),
-you can also work with several issues at a time by using these features:
-
-- [Issues List](#issues-list): View a list of issues in a project or group.
-- [Issue Boards](../issue_board.md): Organize issues with a project management
- workflow for a feature or product release.
-- Issue references
-- [Epics](../../group/epics/index.md): Manage your portfolio of projects by
- tracking groups of issues with a shared theme.
-
-### Issue page
-
-![Issue view](img/issues_main_view.png)
-
-On an issue's page, you can view [all aspects of the issue](issue_data_and_actions.md),
-and modify them if you have the necessary [permissions](../../permissions.md).
-
-#### Real-time sidebar **(FREE SELF)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/17589) in GitLab 13.3.
-
-Assignees in the sidebar are updated in real time. This feature is **disabled by default**.
-To enable it, you need to enable [ActionCable in-app mode](https://docs.gitlab.com/omnibus/settings/actioncable.html).
-
-### Issues List
-
-![Project Issues List view](img/project_issues_list_view.png)
-
-In the Issues List, you can:
-
-- View all issues in a project when opening the Issues List from a project context.
-- View all issues in a groups's projects when opening the Issues List from a group context.
-
-You can filter the Issues List with a [search query](../../search/index.md#filtering-issue-and-merge-request-lists),
-including specific metadata, such as labels, assignees, status, and more. From this
-view, you can also make certain changes [in bulk](../bulk_editing.md) to the displayed issues.
-
-For more information, see the [Issue Data and Actions](issue_data_and_actions.md) page
-for a rundown of all the fields and information in an issue.
-
-You can sort a list of issues in several ways, for example by issue creation date, milestone due date.
-For more information, see the [Sorting and ordering issue lists](sorting_issue_lists.md) page.
-
-#### Cached issue count
-
-> - [Introduced]([link-to-issue](https://gitlab.com/gitlab-org/gitlab/-/issues/243753)) in GitLab 13.9.
-> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
-> - It's disabled on GitLab.com.
-> - It's not recommended for production use.
-> - To use this feature in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-cached-issue-count) **(FREE SELF)**
-
-WARNING:
-This feature might not be available to you. Check the **version history** note above for details.
-
-In a group, the sidebar displays the total count of open issues and this value is cached if higher
-than 1000. The cached value is rounded to thousands (or millions) and updated every 24 hours.
-
-### Design Management
-
-With [Design Management](design_management.md), you can upload design
-assets to issues and view them all together for sharing and
-collaboration with your team.
-
-### Related issues
-
-You can mark two issues as related, so that when viewing one, the other is always
-listed in its [Related Issues](related_issues.md) section. This can help display important
-context, such as past work, dependencies, or duplicates.
-
-Users of [GitLab Premium](https://about.gitlab.com/pricing/) or higher can
-also mark issues as blocking or blocked by another issue.
-
-### Crosslinking issues
-
-You can [cross-link issues](crosslinking_issues.md) by referencing an issue from another
-issue or merge request by including its URL or ID. The referenced issue displays a
-message in the Activity stream about the reference, with a link to the other issue or MR.
-
-### Similar issues
-
-> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22866) in GitLab 11.6.
-
-To prevent duplication of issues for the same topic, GitLab searches for similar issues
-when new issues are being created.
-
-As you type in the title field of the **New Issue** page, GitLab searches titles and descriptions
-across all issues to in the current project. Only issues you have access to are returned.
-Up to five similar issues, sorted by most recently updated, are displayed below the title box.
-[GraphQL](../../../api/graphql/index.md) must be enabled to use this feature.
-
-![Similar issues](img/similar_issues.png)
-
-### Health status **(ULTIMATE)**
-
-> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36427) in GitLab Ultimate 12.10.
-> - Health status of closed issues [can't be edited](https://gitlab.com/gitlab-org/gitlab/-/issues/220867) in GitLab Ultimate 13.4 and later.
-> - Issue health status visible in issue lists [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45141) in GitLab Ultimate 13.6.
-> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/213567) in GitLab 13.7.
-
-To help you track issue statuses, you can assign a status to each issue.
-This marks issues as progressing as planned or needs attention to keep on schedule:
-
-- **On track** (green)
-- **Needs attention** (amber)
-- **At risk** (red)
-
-!["On track" health status on an issue](img/issue_health_status_dropdown_v12_10.png)
-
-After an issue is closed, its health status can't be edited and the "Edit" button becomes disabled
-until the issue is reopened.
-
-You can then see issue statuses in the [issue list](#issues-list) and the
-[Epic tree](../../group/epics/index.md#issue-health-status-in-epic-tree).
-
-## Other Issue actions
+## Related topics
+- [Create issues](managing_issues.md#create-a-new-issue)
- [Create an issue from a template](../../project/description_templates.md#use-the-templates)
+- [Move issues](managing_issues.md#moving-issues)
+- [Close issues](managing_issues.md#closing-issues)
+- [Delete issues](managing_issues.md#deleting-issues)
+- [Promote issues](managing_issues.md#promote-an-issue-to-an-epic)
- [Set a due date](due_dates.md)
-- [Bulk edit issues](../bulk_editing.md) - From the Issues List, select multiple issues
- in order to change their status, assignee, milestone, or labels in bulk.
- [Import issues](csv_import.md)
- [Export issues](csv_export.md)
+- [Upload designs to issues](design_management.md)
+- [Relate issues](related_issues.md)
+- [Cross-link issues](crosslinking_issues.md)
+- [Bulk edit issues](../bulk_editing.md)
+- [Sort issue lists](sorting_issue_lists.md)
+- [Search for issues](../../search/index.md#filtering-issue-and-merge-request-lists)
+- [Epics](../../group/epics/index.md)
+- [Issue Boards](../issue_board.md)
- [Issues API](../../../api/issues.md)
-- Configure an [external issue tracker](../../../integration/external-issue-tracker.md)
- such as Jira, Redmine, Bugzilla, or EWM.
-
-## Enable or disable cached issue count **(FREE SELF)**
-
-Cached issue count in the left sidebar is under development and not ready for production use. It is
-deployed behind a feature flag that is **enabled by default**.
-[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
-can disable it.
-
-To disable it:
-
-```ruby
-Feature.disable(:cached_sidebar_open_issues_count)
-```
-
-To enable it:
-
-```ruby
-Feature.enable(:cached_sidebar_open_issues_count)
-```
+- [Configure an external issue tracker](../../../integration/external-issue-tracker.md)
+- [Parts of an issue](issue_data_and_actions.md)
diff --git a/doc/user/project/issues/managing_issues.md b/doc/user/project/issues/managing_issues.md
index 4c79eb3ccbe..26f393bfb4b 100644
--- a/doc/user/project/issues/managing_issues.md
+++ b/doc/user/project/issues/managing_issues.md
@@ -144,7 +144,7 @@ Follow these examples to form your new issue URL with prefilled fields.
- For a new issue in the GitLab Community Edition project with a pre-filled title,
a pre-filled description, and the confidential flag set, the URL would be `https://gitlab.com/gitlab-org/gitlab-foss/-/issues/new?issue[title]=Validate%20new%20concept&issue[description]=Research%20idea&issue[confidential]=true`
-## Moving Issues
+## Moving issues
Moving an issue copies it to the target project, and closes it in the originating project.
The original issue is not deleted. A system note, which indicates
@@ -154,7 +154,7 @@ The "Move issue" button is at the bottom of the right-sidebar when viewing the i
![move issue - button](img/sidebar_move_issue.png)
-### Moving Issues in Bulk
+### Moving issues in bulk **(FREE SELF)**
If you have advanced technical skills you can also bulk move all the issues from
one project to another in the rails console. The below script moves all issues
@@ -315,3 +315,79 @@ To add an issue to an [iteration](../../group/iterations/index.md):
You can also use the `/iteration`
[quick action](../quick_actions.md#issues-merge-requests-and-epics)
in a comment or description field.
+
+## Real-time sidebar **(FREE SELF)**
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/17589) in GitLab 13.3.
+
+Assignees in the sidebar are updated in real time. This feature is **disabled by default**.
+To enable it, you need to enable [ActionCable in-app mode](https://docs.gitlab.com/omnibus/settings/actioncable.html).
+
+## Cached issue count **(FREE SELF)**
+
+> - [Introduced]([link-to-issue](https://gitlab.com/gitlab-org/gitlab/-/issues/243753)) in GitLab 13.9.
+> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use this feature in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-cached-issue-count) **(FREE SELF)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+In a group, the sidebar displays the total count of open issues and this value is cached if higher
+than 1000. The cached value is rounded to thousands (or millions) and updated every 24 hours.
+
+## Similar issues
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/22866) in GitLab 11.6.
+
+To prevent duplication of issues for the same topic, GitLab searches for similar issues
+when new issues are being created.
+
+As you type in the title field of the **New Issue** page, GitLab searches titles and descriptions
+across all issues to in the current project. Only issues you have access to are returned.
+Up to five similar issues, sorted by most recently updated, are displayed below the title box.
+[GraphQL](../../../api/graphql/index.md) must be enabled to use this feature.
+
+![Similar issues](img/similar_issues.png)
+
+## Health status **(ULTIMATE)**
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/36427) in GitLab Ultimate 12.10.
+> - Health status of closed issues [can't be edited](https://gitlab.com/gitlab-org/gitlab/-/issues/220867) in GitLab Ultimate 13.4 and later.
+> - Issue health status visible in issue lists [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45141) in GitLab Ultimate 13.6.
+> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/213567) in GitLab 13.7.
+
+To help you track issue statuses, you can assign a status to each issue.
+This marks issues as progressing as planned or needs attention to keep on schedule:
+
+- **On track** (green)
+- **Needs attention** (amber)
+- On track (green)
+- Needs attention (amber)
+- At risk (red)
+
+After an issue is closed, its health status can't be edited and the **Edit** button becomes disabled
+until the issue is reopened.
+
+You can then see issue statuses in the issues list and the
+[epic tree](../../group/epics/index.md#issue-health-status-in-epic-tree).
+
+## Enable or disable cached issue count **(FREE SELF)**
+
+Cached issue count in the left sidebar is under development and not ready for production use. It is
+deployed behind a feature flag that is **enabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md)
+can disable it.
+
+To disable it:
+
+```ruby
+Feature.disable(:cached_sidebar_open_issues_count)
+```
+
+To enable it:
+
+```ruby
+Feature.enable(:cached_sidebar_open_issues_count)
+```
diff --git a/doc/user/project/merge_requests/merge_request_dependencies.md b/doc/user/project/merge_requests/merge_request_dependencies.md
index 2d7ba853258..fc5cc4d958b 100644
--- a/doc/user/project/merge_requests/merge_request_dependencies.md
+++ b/doc/user/project/merge_requests/merge_request_dependencies.md
@@ -17,9 +17,9 @@ then it cannot be merged until its dependency is itself merged.
NOTE:
Merge requests dependencies are a **PREMIUM** feature, but this restriction is
-only enforced for the dependent merge request. A merge request in a **FREE** or
-**STARTER** project can be a dependency of a **PREMIUM** merge request, but not
-vice-versa.
+only enforced for the dependent merge request. A merge request in a **FREE**
+project can be a dependency of a **PREMIUM** merge request, but not
+the other way around.
## Use cases
diff --git a/doc/user/project/service_desk.md b/doc/user/project/service_desk.md
index 383b4df9612..76337b62da2 100644
--- a/doc/user/project/service_desk.md
+++ b/doc/user/project/service_desk.md
@@ -160,7 +160,7 @@ To edit the custom email display name:
1. Enter a new name in **Email display name**.
1. Select **Save Changes**.
-### Using custom email address
+### Using custom email address **(FREE SELF)**
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/2201) in GitLab Premium 13.0.
> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/284656) in GitLab 13.8.
diff --git a/lib/api/commits.rb b/lib/api/commits.rb
index a24848082a9..f7d9eeb4cd7 100644
--- a/lib/api/commits.rb
+++ b/lib/api/commits.rb
@@ -372,7 +372,7 @@ module API
current_user,
project_id: user_project.id,
commit_sha: commit.sha
- ).execute
+ ).execute.with_api_entity_associations
present paginate(commit_merge_requests), with: Entities::MergeRequestBasic
end
diff --git a/lib/gitlab/ci/templates/Jobs/Browser-Performance-Testing.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Browser-Performance-Testing.gitlab-ci.yml
index 5edb26a0b56..01907ef9e2e 100644
--- a/lib/gitlab/ci/templates/Jobs/Browser-Performance-Testing.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Jobs/Browser-Performance-Testing.gitlab-ci.yml
@@ -20,15 +20,48 @@ performance:
fi
- export CI_ENVIRONMENT_URL=$(cat environment_url.txt)
- mkdir gitlab-exporter
+ # Busybox wget does not support proxied HTTPS, get the real thing.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/287611.
+ - (env | grep -i _proxy= 2>&1 >/dev/null) && apk --no-cache add wget
- wget -O gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/1.1.0/index.js
- mkdir sitespeed-results
+ - |
+ function propagate_env_vars() {
+ CURRENT_ENV=$(printenv)
+
+ for VAR_NAME; do
+ echo $CURRENT_ENV | grep "${VAR_NAME}=" > /dev/null && echo "--env $VAR_NAME "
+ done
+ }
- |
if [ -f .gitlab-urls.txt ]
then
sed -i -e 's@^@'"$CI_ENVIRONMENT_URL"'@' .gitlab-urls.txt
- docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io $SITESPEED_IMAGE:$SITESPEED_VERSION --plugins.add ./gitlab-exporter --cpu --outputFolder sitespeed-results .gitlab-urls.txt $SITESPEED_OPTIONS
+ docker run \
+ $(propagate_env_vars \
+ auto_proxy \
+ https_proxy \
+ http_proxy \
+ no_proxy \
+ AUTO_PROXY \
+ HTTPS_PROXY \
+ HTTP_PROXY \
+ NO_PROXY \
+ ) \
+ --shm-size=1g --rm -v "$(pwd)":/sitespeed.io $SITESPEED_IMAGE:$SITESPEED_VERSION --plugins.add ./gitlab-exporter --cpu --outputFolder sitespeed-results .gitlab-urls.txt $SITESPEED_OPTIONS
else
- docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io $SITESPEED_IMAGE:$SITESPEED_VERSION --plugins.add ./gitlab-exporter --cpu --outputFolder sitespeed-results "$CI_ENVIRONMENT_URL" $SITESPEED_OPTIONS
+ docker run \
+ $(propagate_env_vars \
+ auto_proxy \
+ https_proxy \
+ http_proxy \
+ no_proxy \
+ AUTO_PROXY \
+ HTTPS_PROXY \
+ HTTP_PROXY \
+ NO_PROXY \
+ ) \
+ --shm-size=1g --rm -v "$(pwd)":/sitespeed.io $SITESPEED_IMAGE:$SITESPEED_VERSION --plugins.add ./gitlab-exporter --cpu --outputFolder sitespeed-results "$CI_ENVIRONMENT_URL" $SITESPEED_OPTIONS
fi
- mv sitespeed-results/data/performance.json browser-performance.json
artifacts:
diff --git a/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml b/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml
index e591e3cc1e2..404d4a4c6db 100644
--- a/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml
+++ b/lib/gitlab/ci/templates/Verify/Browser-Performance.gitlab-ci.yml
@@ -18,9 +18,32 @@ performance:
- docker:stable-dind
script:
- mkdir gitlab-exporter
+ # Busybox wget does not support proxied HTTPS, get the real thing.
+ # See https://gitlab.com/gitlab-org/gitlab/-/issues/287611.
+ - (env | grep -i _proxy= 2>&1 >/dev/null) && apk --no-cache add wget
- wget -O ./gitlab-exporter/index.js https://gitlab.com/gitlab-org/gl-performance/raw/1.1.0/index.js
- mkdir sitespeed-results
- - docker run --shm-size=1g --rm -v "$(pwd)":/sitespeed.io $SITESPEED_IMAGE:$SITESPEED_VERSION --plugins.add ./gitlab-exporter --cpu --outputFolder sitespeed-results $URL $SITESPEED_OPTIONS
+ - |
+ function propagate_env_vars() {
+ CURRENT_ENV=$(printenv)
+
+ for VAR_NAME; do
+ echo $CURRENT_ENV | grep "${VAR_NAME}=" > /dev/null && echo "--env $VAR_NAME "
+ done
+ }
+ - |
+ docker run \
+ $(propagate_env_vars \
+ auto_proxy \
+ https_proxy \
+ http_proxy \
+ no_proxy \
+ AUTO_PROXY \
+ HTTPS_PROXY \
+ HTTP_PROXY \
+ NO_PROXY \
+ ) \
+ --shm-size=1g --rm -v "$(pwd)":/sitespeed.io $SITESPEED_IMAGE:$SITESPEED_VERSION --plugins.add ./gitlab-exporter --cpu --outputFolder sitespeed-results $URL $SITESPEED_OPTIONS
- mv sitespeed-results/data/performance.json browser-performance.json
artifacts:
paths:
diff --git a/spec/frontend/vue_shared/components/gl_toggle_vuex_spec.js b/spec/frontend/vue_shared/components/gl_toggle_vuex_spec.js
deleted file mode 100644
index ac670b622b1..00000000000
--- a/spec/frontend/vue_shared/components/gl_toggle_vuex_spec.js
+++ /dev/null
@@ -1,114 +0,0 @@
-import { GlToggle } from '@gitlab/ui';
-import { mount, createLocalVue } from '@vue/test-utils';
-import Vuex from 'vuex';
-import GlToggleVuex from '~/vue_shared/components/gl_toggle_vuex.vue';
-
-const localVue = createLocalVue();
-localVue.use(Vuex);
-
-describe('GlToggleVuex component', () => {
- let wrapper;
- let store;
-
- const findButton = () => wrapper.find('button');
-
- const createWrapper = (props = {}) => {
- wrapper = mount(GlToggleVuex, {
- localVue,
- store,
- propsData: {
- stateProperty: 'toggleState',
- ...props,
- },
- });
- };
-
- beforeEach(() => {
- store = new Vuex.Store({
- state: {
- toggleState: false,
- },
- actions: {
- setToggleState: ({ commit }, { key, value }) => commit('setToggleState', { key, value }),
- },
- mutations: {
- setToggleState: (state, { key, value }) => {
- state[key] = value;
- },
- },
- });
- createWrapper();
- });
-
- afterEach(() => {
- wrapper.destroy();
- });
-
- it('renders gl-toggle', () => {
- expect(wrapper.find(GlToggle).exists()).toBe(true);
- });
-
- it('properly computes default value for setAction', () => {
- expect(wrapper.props('setAction')).toBe('setToggleState');
- });
-
- describe('without a store module', () => {
- it('calls action with new value when value changes', () => {
- jest.spyOn(store, 'dispatch');
-
- findButton().trigger('click');
- expect(store.dispatch).toHaveBeenCalledWith('setToggleState', {
- key: 'toggleState',
- value: true,
- });
- });
-
- it('updates store property when value changes', () => {
- findButton().trigger('click');
- expect(store.state.toggleState).toBe(true);
- });
- });
-
- describe('with a store module', () => {
- beforeEach(() => {
- store = new Vuex.Store({
- modules: {
- someModule: {
- namespaced: true,
- state: {
- toggleState: false,
- },
- actions: {
- setToggleState: ({ commit }, { key, value }) =>
- commit('setToggleState', { key, value }),
- },
- mutations: {
- setToggleState: (state, { key, value }) => {
- state[key] = value;
- },
- },
- },
- },
- });
-
- createWrapper({
- storeModule: 'someModule',
- });
- });
-
- it('calls action with new value when value changes', () => {
- jest.spyOn(store, 'dispatch');
-
- findButton().trigger('click');
- expect(store.dispatch).toHaveBeenCalledWith('someModule/setToggleState', {
- key: 'toggleState',
- value: true,
- });
- });
-
- it('updates store property when value changes', () => {
- findButton().trigger('click');
- expect(store.state.someModule.toggleState).toBe(true);
- });
- });
-});
diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb
index 68d12f51d4b..c0afc1d50f6 100644
--- a/spec/models/deployment_spec.rb
+++ b/spec/models/deployment_spec.rb
@@ -574,7 +574,7 @@ RSpec.describe Deployment do
describe '#previous_deployment' do
it 'returns the previous deployment' do
- deploy1 = create(:deployment)
+ deploy1 = create(:deployment, :success)
deploy2 = create(
:deployment,
project: deploy1.project,
@@ -583,6 +583,18 @@ RSpec.describe Deployment do
expect(deploy2.previous_deployment).to eq(deploy1)
end
+
+ it 'returns nothing if the refs do not match' do
+ deploy1 = create(:deployment, :success)
+ deploy2 = create(
+ :deployment,
+ :review_app,
+ project: deploy1.project,
+ environment: deploy1.environment
+ )
+
+ expect(deploy2.previous_deployment).to be_nil
+ end
end
describe '#link_merge_requests' do
diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb
index de2cfb8fea0..57faac4292f 100644
--- a/spec/requests/api/commits_spec.rb
+++ b/spec/requests/api/commits_spec.rb
@@ -1898,8 +1898,12 @@ RSpec.describe API::Commits do
let(:merged_mr) { create(:merge_request, source_project: project, source_branch: 'master', target_branch: 'feature') }
let(:commit) { merged_mr.merge_request_diff.commits.last }
- it 'returns the correct merge request' do
+ def perform_request(user)
get api("/projects/#{project.id}/repository/commits/#{commit.id}/merge_requests", user)
+ end
+
+ it 'returns the correct merge request' do
+ perform_request(user)
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_limited_pagination_headers
@@ -1910,7 +1914,7 @@ RSpec.describe API::Commits do
it 'returns 403 for an unauthorized user' do
project.add_guest(user)
- get api("/projects/#{project.id}/repository/commits/#{commit.id}/merge_requests", user)
+ perform_request(user)
expect(response).to have_gitlab_http_status(:forbidden)
end
@@ -1926,11 +1930,21 @@ RSpec.describe API::Commits do
let(:non_member) { create(:user) }
it 'responds 403 when only members are allowed to read merge requests' do
- get api("/projects/#{project.id}/repository/commits/#{commit.id}/merge_requests", non_member)
+ perform_request(non_member)
expect(response).to have_gitlab_http_status(:forbidden)
end
end
+
+ it 'returns multiple merge requests without N + 1' do
+ perform_request(user)
+
+ control_count = ActiveRecord::QueryRecorder.new { perform_request(user) }.count
+
+ create(:merge_request, :closed, source_project: project, source_branch: 'master', target_branch: 'feature')
+
+ expect { perform_request(user) }.not_to exceed_query_limit(control_count)
+ end
end
describe 'GET /projects/:id/repository/commits/:sha/signature' do