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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-11-03 12:08:44 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-11-03 12:08:44 +0300
commitb4c39709e346f437a85829f985f6596cb6209d35 (patch)
tree010b87019e3f523045141f3ce683a1f5d4141499
parentea044b0c4c74b91c5d48435254e7fa60aea064ff (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--.haml-lint.yml1
-rw-r--r--.rubocop.yml3
-rw-r--r--.rubocop_todo/style/inline_disable_annotation.yml3411
-rw-r--r--app/assets/javascripts/ci/pipeline_details/graph/components/job_item.vue2
-rw-r--r--app/assets/javascripts/ci/pipeline_mini_graph/linked_pipelines_mini_list.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/ci_icon.vue125
-rw-r--r--app/assets/stylesheets/framework/icons.scss86
-rw-r--r--app/graphql/types/security/codequality_reports_comparer/degradation_type.rb1
-rw-r--r--app/graphql/types/security/codequality_reports_comparer/report_generation_status_enum.rb16
-rw-r--r--app/graphql/types/security/codequality_reports_comparer/status_enum.rb8
-rw-r--r--app/graphql/types/security/codequality_reports_comparer_type.rb5
-rw-r--r--app/helpers/ci/status_helper.rb29
-rw-r--r--app/helpers/nav/new_dropdown_helper.rb11
-rw-r--r--app/models/ci/pipeline.rb28
-rw-r--r--app/models/ci/ref.rb17
-rw-r--r--app/models/packages/protection/rule.rb6
-rw-r--r--app/services/ci/refs/enqueue_pipelines_to_unlock_service.rb33
-rw-r--r--app/workers/ci/refs/unlock_previous_pipelines_worker.rb4
-rw-r--r--config/feature_flags/development/ci_stop_unlock_pipelines.yml8
-rw-r--r--config/feature_flags/development/ci_unlock_non_successful_pipelines.yml8
-rw-r--r--config/feature_flags/ops/automatic_lock_writes_on_partition_tables.yml2
-rw-r--r--danger/gitlab_schema_validation/Dangerfile3
-rw-r--r--danger/plugins/gitlab_schema_validation.rb9
-rw-r--r--doc/api/graphql/reference/index.md23
-rw-r--r--doc/development/experiment_guide/implementing_experiments.md2
-rw-r--r--gems/config/rubocop.yml3
-rw-r--r--lib/gitlab/regex.rb1
-rw-r--r--lib/gitlab/regex/packages.rb8
-rw-r--r--lib/gitlab/regex/packages/protection/rules.rb15
-rw-r--r--locale/gitlab.pot6
-rw-r--r--qa/qa/page/project/pipeline/show.rb2
-rw-r--r--qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb17
-rw-r--r--rubocop/cop/style/inline_disable_annotation.rb51
-rw-r--r--spec/features/commits_spec.rb2
-rw-r--r--spec/features/dashboard/projects_spec.rb4
-rw-r--r--spec/features/merge_request/user_sees_merge_widget_spec.rb2
-rw-r--r--spec/features/projects/blobs/blob_show_spec.rb4
-rw-r--r--spec/features/projects/branches_spec.rb6
-rw-r--r--spec/features/projects/commit/mini_pipeline_graph_spec.rb4
-rw-r--r--spec/features/projects/files/user_reads_pipeline_status_spec.rb2
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb42
-rw-r--r--spec/frontend/ci/pipeline_details/graph/components/job_item_spec.js8
-rw-r--r--spec/frontend/ci/pipeline_details/graph/components/job_name_component_spec.js2
-rw-r--r--spec/frontend/ci/pipeline_details/graph/components/linked_pipeline_spec.js2
-rw-r--r--spec/frontend/ci/pipeline_mini_graph/linked_pipelines_mini_list_spec.js4
-rw-r--r--spec/frontend/ide/components/jobs/detail/description_spec.js3
-rw-r--r--spec/frontend/ide/components/jobs/item_spec.js2
-rw-r--r--spec/frontend/vue_shared/components/ci_icon_spec.js133
-rw-r--r--spec/graphql/types/security/codequality_reports_comparer/report_generation_status_enum_spec.rb11
-rw-r--r--spec/graphql/types/security/codequality_reports_comparer/status_enum_spec.rb4
-rw-r--r--spec/graphql/types/security/codequality_reports_comparer_type_spec.rb2
-rw-r--r--spec/helpers/ci/status_helper_spec.rb87
-rw-r--r--spec/helpers/nav/new_dropdown_helper_spec.rb35
-rw-r--r--spec/helpers/sidebars_helper_spec.rb3
-rw-r--r--spec/lib/gitlab/regex_requires_app_spec.rb40
-rw-r--r--spec/models/ci/pipeline_spec.rb128
-rw-r--r--spec/models/ci/ref_spec.rb168
-rw-r--r--spec/models/packages/protection/rule_spec.rb102
-rw-r--r--spec/requests/api/graphql/merge_requests/codequality_reports_comparer_spec.rb2
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/set_time_estimate_spec.rb5
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/update_spec.rb5
-rw-r--r--spec/requests/api/graphql/project/merge_request_spec.rb2
-rw-r--r--spec/requests/api/graphql/project/merge_requests_spec.rb5
-rw-r--r--spec/rubocop/cop/style/inline_disable_annotation_spec.rb46
-rw-r--r--spec/services/ci/refs/enqueue_pipelines_to_unlock_service_spec.rb58
-rw-r--r--spec/tooling/danger/gitlab_schema_validation_suggestion_spec.rb108
-rw-r--r--spec/views/ci/status/_icon.html.haml_spec.rb6
-rw-r--r--spec/views/layouts/header/_new_dropdown.haml_spec.rb5
-rw-r--r--spec/views/projects/issues/_related_branches.html.haml_spec.rb2
-rw-r--r--spec/views/projects/tags/index.html.haml_spec.rb2
-rw-r--r--spec/workers/ci/refs/unlock_previous_pipelines_worker_spec.rb21
-rw-r--r--tooling/danger/gitlab_schema_validation_suggestion.rb35
72 files changed, 4624 insertions, 428 deletions
diff --git a/.haml-lint.yml b/.haml-lint.yml
index 097f72e7cce..64eb1ff0a09 100644
--- a/.haml-lint.yml
+++ b/.haml-lint.yml
@@ -139,6 +139,7 @@ linters:
- Style/HashSyntax
- Style/IdenticalConditionalBranches
- Style/IfInsideElse
+ - Style/InlineDisableAnnotation
- Style/NegatedIf
- Style/NestedTernaryOperator
- Style/RedundantInterpolation
diff --git a/.rubocop.yml b/.rubocop.yml
index 00f77965d47..af65786c3eb 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -925,6 +925,9 @@ Cop/UserAdmin:
- 'spec/**/*.rb'
- 'ee/spec/**/*.rb'
+Style/InlineDisableAnnotation:
+ Enabled: true
+
# See https://gitlab.com/gitlab-org/gitlab/-/issues/327495
Style/RegexpLiteral:
Enabled: false
diff --git a/.rubocop_todo/style/inline_disable_annotation.yml b/.rubocop_todo/style/inline_disable_annotation.yml
new file mode 100644
index 00000000000..c235c35c043
--- /dev/null
+++ b/.rubocop_todo/style/inline_disable_annotation.yml
@@ -0,0 +1,3411 @@
+---
+Style/InlineDisableAnnotation:
+ Details: grace period
+ Exclude:
+ - 'Gemfile'
+ - 'Guardfile'
+ - 'app/channels/graphql_channel.rb'
+ - 'app/controllers/abuse_reports_controller.rb'
+ - 'app/controllers/acme_challenges_controller.rb'
+ - 'app/controllers/admin/application_settings_controller.rb'
+ - 'app/controllers/admin/background_jobs_controller.rb'
+ - 'app/controllers/admin/broadcast_messages_controller.rb'
+ - 'app/controllers/admin/dashboard_controller.rb'
+ - 'app/controllers/admin/dev_ops_report_controller.rb'
+ - 'app/controllers/admin/groups_controller.rb'
+ - 'app/controllers/admin/health_check_controller.rb'
+ - 'app/controllers/admin/identities_controller.rb'
+ - 'app/controllers/admin/impersonation_tokens_controller.rb'
+ - 'app/controllers/admin/keys_controller.rb'
+ - 'app/controllers/admin/plan_limits_controller.rb'
+ - 'app/controllers/admin/projects_controller.rb'
+ - 'app/controllers/admin/runners_controller.rb'
+ - 'app/controllers/admin/spam_logs_controller.rb'
+ - 'app/controllers/admin/system_info_controller.rb'
+ - 'app/controllers/admin/users_controller.rb'
+ - 'app/controllers/admin/version_check_controller.rb'
+ - 'app/controllers/chaos_controller.rb'
+ - 'app/controllers/concerns/access_tokens_actions.rb'
+ - 'app/controllers/concerns/analytics/cycle_analytics/value_stream_actions.rb'
+ - 'app/controllers/concerns/authenticates_with_two_factor.rb'
+ - 'app/controllers/concerns/boards_actions.rb'
+ - 'app/controllers/concerns/checks_collaboration.rb'
+ - 'app/controllers/concerns/creates_commit.rb'
+ - 'app/controllers/concerns/enforces_two_factor_authentication.rb'
+ - 'app/controllers/concerns/find_snippet.rb'
+ - 'app/controllers/concerns/group_tree.rb'
+ - 'app/controllers/concerns/import/github_oauth.rb'
+ - 'app/controllers/concerns/integrations/actions.rb'
+ - 'app/controllers/concerns/issuable_actions.rb'
+ - 'app/controllers/concerns/issuable_collections.rb'
+ - 'app/controllers/concerns/issuable_collections_action.rb'
+ - 'app/controllers/concerns/issues_calendar.rb'
+ - 'app/controllers/concerns/membership_actions.rb'
+ - 'app/controllers/concerns/milestone_actions.rb'
+ - 'app/controllers/concerns/notes_actions.rb'
+ - 'app/controllers/concerns/planning_hierarchy.rb'
+ - 'app/controllers/concerns/preferred_language_switcher.rb'
+ - 'app/controllers/concerns/preview_markdown.rb'
+ - 'app/controllers/concerns/registry/connection_errors_handler.rb'
+ - 'app/controllers/concerns/renders_commits.rb'
+ - 'app/controllers/concerns/renders_member_access.rb'
+ - 'app/controllers/concerns/renders_notes.rb'
+ - 'app/controllers/concerns/sends_blob.rb'
+ - 'app/controllers/concerns/skips_already_signed_in_message.rb'
+ - 'app/controllers/concerns/snippets_actions.rb'
+ - 'app/controllers/concerns/uploads_actions.rb'
+ - 'app/controllers/concerns/verifies_with_email.rb'
+ - 'app/controllers/concerns/web_hooks/hook_log_actions.rb'
+ - 'app/controllers/concerns/wiki_actions.rb'
+ - 'app/controllers/dashboard/projects_controller.rb'
+ - 'app/controllers/explore/projects_controller.rb'
+ - 'app/controllers/graphql_controller.rb'
+ - 'app/controllers/groups/autocomplete_sources_controller.rb'
+ - 'app/controllers/groups/labels_controller.rb'
+ - 'app/controllers/groups/milestones_controller.rb'
+ - 'app/controllers/groups_controller.rb'
+ - 'app/controllers/health_controller.rb'
+ - 'app/controllers/help_controller.rb'
+ - 'app/controllers/import/base_controller.rb'
+ - 'app/controllers/import/bitbucket_controller.rb'
+ - 'app/controllers/import/bitbucket_server_controller.rb'
+ - 'app/controllers/import/github_controller.rb'
+ - 'app/controllers/import/manifest_controller.rb'
+ - 'app/controllers/jira_connect/subscriptions_controller.rb'
+ - 'app/controllers/metrics_controller.rb'
+ - 'app/controllers/oauth/authorizations_controller.rb'
+ - 'app/controllers/passwords_controller.rb'
+ - 'app/controllers/profiles/accounts_controller.rb'
+ - 'app/controllers/profiles/notifications_controller.rb'
+ - 'app/controllers/profiles_controller.rb'
+ - 'app/controllers/projects/analytics/cycle_analytics/stages_controller.rb'
+ - 'app/controllers/projects/blob_controller.rb'
+ - 'app/controllers/projects/branches_controller.rb'
+ - 'app/controllers/projects/commit_controller.rb'
+ - 'app/controllers/projects/commits_controller.rb'
+ - 'app/controllers/projects/compare_controller.rb'
+ - 'app/controllers/projects/deployments_controller.rb'
+ - 'app/controllers/projects/design_management/designs/resized_image_controller.rb'
+ - 'app/controllers/projects/discussions_controller.rb'
+ - 'app/controllers/projects/environments_controller.rb'
+ - 'app/controllers/projects/forks_controller.rb'
+ - 'app/controllers/projects/incidents_controller.rb'
+ - 'app/controllers/projects/issue_links_controller.rb'
+ - 'app/controllers/projects/issues_controller.rb'
+ - 'app/controllers/projects/labels_controller.rb'
+ - 'app/controllers/projects/merge_requests/application_controller.rb'
+ - 'app/controllers/projects/merge_requests/creations_controller.rb'
+ - 'app/controllers/projects/merge_requests/diffs_controller.rb'
+ - 'app/controllers/projects/merge_requests/drafts_controller.rb'
+ - 'app/controllers/projects/merge_requests_controller.rb'
+ - 'app/controllers/projects/milestones_controller.rb'
+ - 'app/controllers/projects/pages_controller.rb'
+ - 'app/controllers/projects/pipeline_schedules_controller.rb'
+ - 'app/controllers/projects/pipelines_controller.rb'
+ - 'app/controllers/projects/settings/ci_cd_controller.rb'
+ - 'app/controllers/projects/settings/repository_controller.rb'
+ - 'app/controllers/projects/tags_controller.rb'
+ - 'app/controllers/projects/work_items_controller.rb'
+ - 'app/controllers/projects_controller.rb'
+ - 'app/controllers/pwa_controller.rb'
+ - 'app/controllers/registrations_controller.rb'
+ - 'app/controllers/repositories/lfs_storage_controller.rb'
+ - 'app/controllers/sandbox_controller.rb'
+ - 'app/controllers/snippets/notes_controller.rb'
+ - 'app/controllers/users/namespace_visits_controller.rb'
+ - 'app/controllers/users/unsubscribes_controller.rb'
+ - 'app/finders/admin/abuse_report_labels_finder.rb'
+ - 'app/finders/admin/plans_finder.rb'
+ - 'app/finders/admin/projects_finder.rb'
+ - 'app/finders/applications_finder.rb'
+ - 'app/finders/autocomplete/acts_as_taggable_on/tags_finder.rb'
+ - 'app/finders/autocomplete/group_users_finder.rb'
+ - 'app/finders/autocomplete/move_to_project_finder.rb'
+ - 'app/finders/autocomplete/routes_finder.rb'
+ - 'app/finders/autocomplete/users_finder.rb'
+ - 'app/finders/bulk_imports/entities_finder.rb'
+ - 'app/finders/ci/daily_build_group_report_results_finder.rb'
+ - 'app/finders/ci/pipeline_schedules_finder.rb'
+ - 'app/finders/ci/pipelines_finder.rb'
+ - 'app/finders/ci/pipelines_for_merge_request_finder.rb'
+ - 'app/finders/ci/runner_jobs_finder.rb'
+ - 'app/finders/ci/runners_finder.rb'
+ - 'app/finders/clusters/agents/authorizations/ci_access/finder.rb'
+ - 'app/finders/concerns/custom_attributes_filter.rb'
+ - 'app/finders/concerns/finder_methods.rb'
+ - 'app/finders/deployments_finder.rb'
+ - 'app/finders/environments/environments_by_deployments_finder.rb'
+ - 'app/finders/events_finder.rb'
+ - 'app/finders/fork_projects_finder.rb'
+ - 'app/finders/fork_targets_finder.rb'
+ - 'app/finders/group_descendants_finder.rb'
+ - 'app/finders/group_finder.rb'
+ - 'app/finders/group_members_finder.rb'
+ - 'app/finders/groups/accepting_group_transfers_finder.rb'
+ - 'app/finders/groups/accepting_project_creations_finder.rb'
+ - 'app/finders/groups/accepting_project_shares_finder.rb'
+ - 'app/finders/groups/base.rb'
+ - 'app/finders/groups/projects_requiring_authorizations_refresh/base.rb'
+ - 'app/finders/groups/user_groups_finder.rb'
+ - 'app/finders/groups_finder.rb'
+ - 'app/finders/issuable_finder.rb'
+ - 'app/finders/issuable_finder/params.rb'
+ - 'app/finders/issuables/crm_contact_filter.rb'
+ - 'app/finders/issuables/crm_organization_filter.rb'
+ - 'app/finders/issuables/label_filter.rb'
+ - 'app/finders/issues_finder.rb'
+ - 'app/finders/keys_finder.rb'
+ - 'app/finders/labels_finder.rb'
+ - 'app/finders/members_finder.rb'
+ - 'app/finders/merge_request_target_project_finder.rb'
+ - 'app/finders/merge_requests/by_approvals_finder.rb'
+ - 'app/finders/merge_requests_finder.rb'
+ - 'app/finders/milestones_finder.rb'
+ - 'app/finders/notes_finder.rb'
+ - 'app/finders/organizations/groups_finder.rb'
+ - 'app/finders/packages/build_infos_finder.rb'
+ - 'app/finders/projects/groups_finder.rb'
+ - 'app/finders/projects/members/effective_access_level_finder.rb'
+ - 'app/finders/projects/members/effective_access_level_per_user_finder.rb'
+ - 'app/finders/projects_finder.rb'
+ - 'app/finders/releases/group_releases_finder.rb'
+ - 'app/finders/releases_finder.rb'
+ - 'app/finders/repositories/branch_names_finder.rb'
+ - 'app/finders/resource_milestone_event_finder.rb'
+ - 'app/finders/resource_state_event_finder.rb'
+ - 'app/finders/template_finder.rb'
+ - 'app/finders/user_groups_counter.rb'
+ - 'app/finders/user_recent_events_finder.rb'
+ - 'app/finders/users_finder.rb'
+ - 'app/graphql/gitlab_schema.rb'
+ - 'app/graphql/graphql_triggers.rb'
+ - 'app/graphql/mutations/issues/update.rb'
+ - 'app/graphql/mutations/metrics/dashboard/annotations/delete.rb'
+ - 'app/graphql/mutations/projects/sync_fork.rb'
+ - 'app/graphql/mutations/releases/create.rb'
+ - 'app/graphql/mutations/work_items/export.rb'
+ - 'app/graphql/resolvers/base_resolver.rb'
+ - 'app/graphql/resolvers/ci/pipeline_job_artifacts_resolver.rb'
+ - 'app/graphql/resolvers/ci/runner_groups_resolver.rb'
+ - 'app/graphql/resolvers/ci/runner_job_count_resolver.rb'
+ - 'app/graphql/resolvers/ci/runner_owner_project_resolver.rb'
+ - 'app/graphql/resolvers/ci/runner_projects_resolver.rb'
+ - 'app/graphql/resolvers/commit_pipelines_resolver.rb'
+ - 'app/graphql/resolvers/concerns/caching_array_resolver.rb'
+ - 'app/graphql/resolvers/concerns/looks_ahead.rb'
+ - 'app/graphql/resolvers/environments/last_deployment_resolver.rb'
+ - 'app/graphql/resolvers/group_packages_resolver.rb'
+ - 'app/graphql/resolvers/groups_resolver.rb'
+ - 'app/graphql/resolvers/issues/base_resolver.rb'
+ - 'app/graphql/resolvers/merge_request_pipelines_resolver.rb'
+ - 'app/graphql/resolvers/nested_groups_resolver.rb'
+ - 'app/graphql/resolvers/project_packages_resolver.rb'
+ - 'app/graphql/resolvers/project_pipelines_resolver.rb'
+ - 'app/graphql/types/access_level_type.rb'
+ - 'app/graphql/types/admin/sidekiq_queues/delete_jobs_response_type.rb'
+ - 'app/graphql/types/alert_management/alert_type.rb'
+ - 'app/graphql/types/analytics/cycle_analytics/link_type.rb'
+ - 'app/graphql/types/analytics/cycle_analytics/metric_type.rb'
+ - 'app/graphql/types/base_enum.rb'
+ - 'app/graphql/types/blame/blame_type.rb'
+ - 'app/graphql/types/blame/commit_data_type.rb'
+ - 'app/graphql/types/blame/groups_type.rb'
+ - 'app/graphql/types/blob_viewer_type.rb'
+ - 'app/graphql/types/board_list_type.rb'
+ - 'app/graphql/types/boards/board_issue_input_base_type.rb'
+ - 'app/graphql/types/branch_protections/merge_access_level_type.rb'
+ - 'app/graphql/types/branch_protections/push_access_level_type.rb'
+ - 'app/graphql/types/branch_type.rb'
+ - 'app/graphql/types/ci/analytics_type.rb'
+ - 'app/graphql/types/ci/build_need_type.rb'
+ - 'app/graphql/types/ci/catalog/resource_type.rb'
+ - 'app/graphql/types/ci/code_quality_report_summary_type.rb'
+ - 'app/graphql/types/ci/config/config_type.rb'
+ - 'app/graphql/types/ci/config/group_type.rb'
+ - 'app/graphql/types/ci/config/include_type.rb'
+ - 'app/graphql/types/ci/config/job_restriction_type.rb'
+ - 'app/graphql/types/ci/config/job_type.rb'
+ - 'app/graphql/types/ci/config/need_type.rb'
+ - 'app/graphql/types/ci/config/stage_type.rb'
+ - 'app/graphql/types/ci/config_variable_type.rb'
+ - 'app/graphql/types/ci/detailed_status_type.rb'
+ - 'app/graphql/types/ci/group_environment_scope_connection_type.rb'
+ - 'app/graphql/types/ci/group_environment_scope_type.rb'
+ - 'app/graphql/types/ci/group_type.rb'
+ - 'app/graphql/types/ci/group_variable_connection_type.rb'
+ - 'app/graphql/types/ci/group_variable_type.rb'
+ - 'app/graphql/types/ci/inherited_ci_variable_type.rb'
+ - 'app/graphql/types/ci/instance_variable_type.rb'
+ - 'app/graphql/types/ci/job_artifact_type.rb'
+ - 'app/graphql/types/ci/job_base_field.rb'
+ - 'app/graphql/types/ci/job_token_scope_type.rb'
+ - 'app/graphql/types/ci/job_trace_type.rb'
+ - 'app/graphql/types/ci/job_type.rb'
+ - 'app/graphql/types/ci/manual_variable_type.rb'
+ - 'app/graphql/types/ci/pipeline_message_type.rb'
+ - 'app/graphql/types/ci/pipeline_type.rb'
+ - 'app/graphql/types/ci/project_variable_connection_type.rb'
+ - 'app/graphql/types/ci/project_variable_type.rb'
+ - 'app/graphql/types/ci/recent_failures_type.rb'
+ - 'app/graphql/types/ci/runner_architecture_type.rb'
+ - 'app/graphql/types/ci/runner_countable_connection_type.rb'
+ - 'app/graphql/types/ci/runner_platform_type.rb'
+ - 'app/graphql/types/ci/runner_setup_type.rb'
+ - 'app/graphql/types/ci/runner_type.rb'
+ - 'app/graphql/types/ci/runner_web_url_edge.rb'
+ - 'app/graphql/types/ci/stage_type.rb'
+ - 'app/graphql/types/ci/status_action_type.rb'
+ - 'app/graphql/types/ci/template_type.rb'
+ - 'app/graphql/types/ci/test_case_type.rb'
+ - 'app/graphql/types/ci/test_report_summary_type.rb'
+ - 'app/graphql/types/ci/test_report_total_type.rb'
+ - 'app/graphql/types/ci/test_suite_summary_type.rb'
+ - 'app/graphql/types/ci/test_suite_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/analyzers_entity_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/entity_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/options_entity_type.rb'
+ - 'app/graphql/types/ci_configuration/sast/type.rb'
+ - 'app/graphql/types/clusters/agents/authorizations/ci_access_type.rb'
+ - 'app/graphql/types/clusters/agents/authorizations/user_access_type.rb'
+ - 'app/graphql/types/commit_references_type.rb'
+ - 'app/graphql/types/commit_signatures/verification_status_enum.rb'
+ - 'app/graphql/types/countable_connection_type.rb'
+ - 'app/graphql/types/customer_relations/organization_state_counts_type.rb'
+ - 'app/graphql/types/deployment_tag_type.rb'
+ - 'app/graphql/types/design_management_type.rb'
+ - 'app/graphql/types/diff_refs_type.rb'
+ - 'app/graphql/types/diff_stats_summary_type.rb'
+ - 'app/graphql/types/diff_stats_type.rb'
+ - 'app/graphql/types/diff_type.rb'
+ - 'app/graphql/types/error_tracking/sentry_error_frequency_type.rb'
+ - 'app/graphql/types/error_tracking/sentry_error_stack_trace_context_type.rb'
+ - 'app/graphql/types/error_tracking/sentry_error_stack_trace_entry_type.rb'
+ - 'app/graphql/types/error_tracking/sentry_error_tags_type.rb'
+ - 'app/graphql/types/error_tracking/sentry_error_type.rb'
+ - 'app/graphql/types/issue_connection_type.rb'
+ - 'app/graphql/types/issue_type.rb'
+ - 'app/graphql/types/jira_import_type.rb'
+ - 'app/graphql/types/jira_user_type.rb'
+ - 'app/graphql/types/kas/agent_configuration_type.rb'
+ - 'app/graphql/types/kas/agent_connection_type.rb'
+ - 'app/graphql/types/kas/agent_metadata_type.rb'
+ - 'app/graphql/types/key_type.rb'
+ - 'app/graphql/types/limited_countable_connection_type.rb'
+ - 'app/graphql/types/merge_request_connection_type.rb'
+ - 'app/graphql/types/merge_requests/mergeability_check_type.rb'
+ - 'app/graphql/types/nested_environment_type.rb'
+ - 'app/graphql/types/notes/deleted_note_type.rb'
+ - 'app/graphql/types/notes/diff_position_type.rb'
+ - 'app/graphql/types/organizations/organization_user_type.rb'
+ - 'app/graphql/types/packages/composer/json_type.rb'
+ - 'app/graphql/types/packages/helm/dependency_type.rb'
+ - 'app/graphql/types/packages/helm/maintainer_type.rb'
+ - 'app/graphql/types/packages/helm/metadata_type.rb'
+ - 'app/graphql/types/packages/package_base_type.rb'
+ - 'app/graphql/types/packages/package_dependency_link_type.rb'
+ - 'app/graphql/types/packages/package_dependency_type.rb'
+ - 'app/graphql/types/permission_types/base_permission_type.rb'
+ - 'app/graphql/types/project_statistics_redirect_type.rb'
+ - 'app/graphql/types/project_type.rb'
+ - 'app/graphql/types/projects/commit_parent_names_type.rb'
+ - 'app/graphql/types/projects/fork_details_type.rb'
+ - 'app/graphql/types/projects/repository_language_type.rb'
+ - 'app/graphql/types/projects/service_type_enum.rb'
+ - 'app/graphql/types/projects/services/jira_project_type.rb'
+ - 'app/graphql/types/projects/topic_type.rb'
+ - 'app/graphql/types/query_complexity_type.rb'
+ - 'app/graphql/types/repository/blob_type.rb'
+ - 'app/graphql/types/snippets/blob_connection_type.rb'
+ - 'app/graphql/types/snippets/blob_type.rb'
+ - 'app/graphql/types/snippets/blob_viewer_type.rb'
+ - 'app/graphql/types/task_completion_status.rb'
+ - 'app/graphql/types/time_tracking/timelog_connection_type.rb'
+ - 'app/graphql/types/tree/blob_type.rb'
+ - 'app/graphql/types/tree/submodule_type.rb'
+ - 'app/graphql/types/tree/tree_entry_type.rb'
+ - 'app/graphql/types/tree/tree_type.rb'
+ - 'app/graphql/types/user_callout_type.rb'
+ - 'app/graphql/types/user_preferences_type.rb'
+ - 'app/graphql/types/user_status_type.rb'
+ - 'app/graphql/types/work_item_id_type.rb'
+ - 'app/graphql/types/work_items/linked_item_type.rb'
+ - 'app/graphql/types/work_items/widgets/assignees_type.rb'
+ - 'app/graphql/types/work_items/widgets/award_emoji_type.rb'
+ - 'app/graphql/types/work_items/widgets/current_user_todos_type.rb'
+ - 'app/graphql/types/work_items/widgets/description_type.rb'
+ - 'app/graphql/types/work_items/widgets/hierarchy_type.rb'
+ - 'app/graphql/types/work_items/widgets/labels_type.rb'
+ - 'app/graphql/types/work_items/widgets/linked_items_type.rb'
+ - 'app/graphql/types/work_items/widgets/milestone_type.rb'
+ - 'app/graphql/types/work_items/widgets/notes_type.rb'
+ - 'app/graphql/types/work_items/widgets/notifications_type.rb'
+ - 'app/graphql/types/work_items/widgets/start_and_due_date_type.rb'
+ - 'app/graphql/types/x509_certificate_type.rb'
+ - 'app/graphql/types/x509_issuer_type.rb'
+ - 'app/helpers/application_helper.rb'
+ - 'app/helpers/auth_helper.rb'
+ - 'app/helpers/ci/status_helper.rb'
+ - 'app/helpers/commits_helper.rb'
+ - 'app/helpers/diff_helper.rb'
+ - 'app/helpers/dropdowns_helper.rb'
+ - 'app/helpers/environment_helper.rb'
+ - 'app/helpers/integrations_helper.rb'
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/helpers/lazy_image_tag_helper.rb'
+ - 'app/helpers/namespaces_helper.rb'
+ - 'app/helpers/nav/top_nav_helper.rb'
+ - 'app/helpers/page_layout_helper.rb'
+ - 'app/helpers/routing/projects_helper.rb'
+ - 'app/helpers/routing/pseudonymization_helper.rb'
+ - 'app/helpers/search_helper.rb'
+ - 'app/helpers/sidebars_helper.rb'
+ - 'app/helpers/sorting_helper.rb'
+ - 'app/helpers/users_helper.rb'
+ - 'app/helpers/visibility_level_helper.rb'
+ - 'app/mailers/emails/issues.rb'
+ - 'app/mailers/emails/members.rb'
+ - 'app/mailers/emails/merge_requests.rb'
+ - 'app/mailers/emails/profile.rb'
+ - 'app/mailers/previews/notify_preview.rb'
+ - 'app/mailers/repository_check_mailer.rb'
+ - 'app/models/active_session.rb'
+ - 'app/models/alert_management/alert.rb'
+ - 'app/models/application_record.rb'
+ - 'app/models/application_setting.rb'
+ - 'app/models/application_setting_implementation.rb'
+ - 'app/models/audit_event.rb'
+ - 'app/models/award_emoji.rb'
+ - 'app/models/badge.rb'
+ - 'app/models/board.rb'
+ - 'app/models/bulk_import.rb'
+ - 'app/models/bulk_imports/entity.rb'
+ - 'app/models/ci/bridge.rb'
+ - 'app/models/ci/build.rb'
+ - 'app/models/ci/build_trace_chunk.rb'
+ - 'app/models/ci/freeze_period.rb'
+ - 'app/models/ci/job_artifact.rb'
+ - 'app/models/ci/namespace_mirror.rb'
+ - 'app/models/ci/pipeline.rb'
+ - 'app/models/ci/pipeline_schedule.rb'
+ - 'app/models/ci/processable.rb'
+ - 'app/models/ci/runner.rb'
+ - 'app/models/ci/trigger_request.rb'
+ - 'app/models/clusters/cluster.rb'
+ - 'app/models/commit.rb'
+ - 'app/models/commit_collection.rb'
+ - 'app/models/commit_status.rb'
+ - 'app/models/concerns/analytics/cycle_analytics/parentable.rb'
+ - 'app/models/concerns/approvable.rb'
+ - 'app/models/concerns/async_devise_email.rb'
+ - 'app/models/concerns/atomic_internal_id.rb'
+ - 'app/models/concerns/awardable.rb'
+ - 'app/models/concerns/batch_destroy_dependent_associations.rb'
+ - 'app/models/concerns/batch_nullify_dependent_associations.rb'
+ - 'app/models/concerns/boards/listable.rb'
+ - 'app/models/concerns/cache_markdown_field.rb'
+ - 'app/models/concerns/cached_commit.rb'
+ - 'app/models/concerns/cascading_namespace_setting_attribute.rb'
+ - 'app/models/concerns/ci/deployable.rb'
+ - 'app/models/concerns/ci/partitionable/switch.rb'
+ - 'app/models/concerns/deployment_platform.rb'
+ - 'app/models/concerns/diff_positionable_note.rb'
+ - 'app/models/concerns/encrypted_user_password.rb'
+ - 'app/models/concerns/fast_destroy_all.rb'
+ - 'app/models/concerns/featurable.rb'
+ - 'app/models/concerns/file_store_mounter.rb'
+ - 'app/models/concerns/from_except.rb'
+ - 'app/models/concerns/from_intersect.rb'
+ - 'app/models/concerns/from_set_operator.rb'
+ - 'app/models/concerns/from_union.rb'
+ - 'app/models/concerns/has_repository.rb'
+ - 'app/models/concerns/has_wiki_page_meta_attributes.rb'
+ - 'app/models/concerns/ignorable_columns.rb'
+ - 'app/models/concerns/integrations/reset_secret_fields.rb'
+ - 'app/models/concerns/issuable.rb'
+ - 'app/models/concerns/limitable.rb'
+ - 'app/models/concerns/mentionable.rb'
+ - 'app/models/concerns/noteable.rb'
+ - 'app/models/concerns/packages/debian/architecture.rb'
+ - 'app/models/concerns/packages/debian/component.rb'
+ - 'app/models/concerns/packages/debian/distribution.rb'
+ - 'app/models/concerns/packages/fips.rb'
+ - 'app/models/concerns/participable.rb'
+ - 'app/models/concerns/project_features_compatibility.rb'
+ - 'app/models/concerns/redactable.rb'
+ - 'app/models/concerns/redis_cacheable.rb'
+ - 'app/models/concerns/resolvable_discussion.rb'
+ - 'app/models/concerns/routable.rb'
+ - 'app/models/concerns/sanitizable.rb'
+ - 'app/models/concerns/sortable.rb'
+ - 'app/models/concerns/spammable.rb'
+ - 'app/models/concerns/subscribable.rb'
+ - 'app/models/concerns/taggable_queries.rb'
+ - 'app/models/concerns/taskable.rb'
+ - 'app/models/concerns/time_trackable.rb'
+ - 'app/models/concerns/token_authenticatable_strategies/base.rb'
+ - 'app/models/concerns/triggerable_hooks.rb'
+ - 'app/models/concerns/with_uploads.rb'
+ - 'app/models/container_repository.rb'
+ - 'app/models/cycle_analytics/project_level_stage_adapter.rb'
+ - 'app/models/deploy_key.rb'
+ - 'app/models/deployment.rb'
+ - 'app/models/design_management/design.rb'
+ - 'app/models/design_management/version.rb'
+ - 'app/models/discussion_note.rb'
+ - 'app/models/event.rb'
+ - 'app/models/group.rb'
+ - 'app/models/group_deploy_key.rb'
+ - 'app/models/hooks/web_hook.rb'
+ - 'app/models/hooks/web_hook_log.rb'
+ - 'app/models/integrations/apple_app_store.rb'
+ - 'app/models/integrations/base_chat_notification.rb'
+ - 'app/models/integrations/base_slash_commands.rb'
+ - 'app/models/integrations/base_third_party_wiki.rb'
+ - 'app/models/integrations/google_play.rb'
+ - 'app/models/integrations/pumble.rb'
+ - 'app/models/issue.rb'
+ - 'app/models/key.rb'
+ - 'app/models/label.rb'
+ - 'app/models/label_link.rb'
+ - 'app/models/legacy_diff_note.rb'
+ - 'app/models/lfs_objects_project.rb'
+ - 'app/models/member.rb'
+ - 'app/models/members/group_member.rb'
+ - 'app/models/members/project_member.rb'
+ - 'app/models/members/project_namespace_member.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/merge_request/approval_removal_settings.rb'
+ - 'app/models/merge_request_context_commit.rb'
+ - 'app/models/merge_request_context_commit_diff_file.rb'
+ - 'app/models/merge_request_diff.rb'
+ - 'app/models/merge_request_diff_commit.rb'
+ - 'app/models/milestone.rb'
+ - 'app/models/ml/candidate.rb'
+ - 'app/models/ml/experiment.rb'
+ - 'app/models/ml/model.rb'
+ - 'app/models/namespace.rb'
+ - 'app/models/namespace_ci_cd_setting.rb'
+ - 'app/models/namespace_statistics.rb'
+ - 'app/models/namespaces/sync_event.rb'
+ - 'app/models/network/commit.rb'
+ - 'app/models/note.rb'
+ - 'app/models/notification_setting.rb'
+ - 'app/models/operations/feature_flags/user_list.rb'
+ - 'app/models/packages/debian/file_entry.rb'
+ - 'app/models/packages/package.rb'
+ - 'app/models/personal_access_token.rb'
+ - 'app/models/project.rb'
+ - 'app/models/project_export_job.rb'
+ - 'app/models/project_feature.rb'
+ - 'app/models/project_import_data.rb'
+ - 'app/models/project_statistics.rb'
+ - 'app/models/project_team.rb'
+ - 'app/models/projects/sync_event.rb'
+ - 'app/models/prometheus_alert_event.rb'
+ - 'app/models/protectable_dropdown.rb'
+ - 'app/models/protected_branch.rb'
+ - 'app/models/redirect_route.rb'
+ - 'app/models/releases/evidence.rb'
+ - 'app/models/repository.rb'
+ - 'app/models/repository_language.rb'
+ - 'app/models/route.rb'
+ - 'app/models/sent_notification.rb'
+ - 'app/models/slack_integration.rb'
+ - 'app/models/snippet.rb'
+ - 'app/models/subscription.rb'
+ - 'app/models/todo.rb'
+ - 'app/models/token_with_iv.rb'
+ - 'app/models/upload.rb'
+ - 'app/models/user.rb'
+ - 'app/models/user_agent_detail.rb'
+ - 'app/models/wiki.rb'
+ - 'app/models/wiki_page.rb'
+ - 'app/policies/application_setting/term_policy.rb'
+ - 'app/policies/application_setting_policy.rb'
+ - 'app/policies/ci/deployable_policy.rb'
+ - 'app/policies/concerns/member_policy_helpers.rb'
+ - 'app/policies/email_policy.rb'
+ - 'app/policies/event_policy.rb'
+ - 'app/policies/issue_policy.rb'
+ - 'app/policies/list_policy.rb'
+ - 'app/policies/namespace_ci_cd_setting_policy.rb'
+ - 'app/policies/project_group_link_policy.rb'
+ - 'app/policies/project_policy.rb'
+ - 'app/policies/upload_policy.rb'
+ - 'app/presenters/ci/build_runner_presenter.rb'
+ - 'app/presenters/deploy_key_presenter.rb'
+ - 'app/presenters/dev_ops_report/metric_presenter.rb'
+ - 'app/presenters/key_presenter.rb'
+ - 'app/presenters/label_presenter.rb'
+ - 'app/presenters/merge_request_presenter.rb'
+ - 'app/presenters/project_presenter.rb'
+ - 'app/presenters/projects/import_export/project_export_presenter.rb'
+ - 'app/presenters/projects/settings/deploy_keys_presenter.rb'
+ - 'app/presenters/search_service_presenter.rb'
+ - 'app/presenters/work_item_presenter.rb'
+ - 'app/serializers/access_token_entity_base.rb'
+ - 'app/serializers/analytics/cycle_analytics/value_stream_entity.rb'
+ - 'app/serializers/analytics_build_entity.rb'
+ - 'app/serializers/analytics_issue_entity.rb'
+ - 'app/serializers/ci/dag_job_entity.rb'
+ - 'app/serializers/ci/dag_pipeline_entity.rb'
+ - 'app/serializers/ci/job_entity.rb'
+ - 'app/serializers/cluster_entity.rb'
+ - 'app/serializers/diffs_entity.rb'
+ - 'app/serializers/diffs_metadata_entity.rb'
+ - 'app/serializers/environment_serializer.rb'
+ - 'app/serializers/fork_namespace_entity.rb'
+ - 'app/serializers/group_access_token_entity.rb'
+ - 'app/serializers/group_access_token_serializer.rb'
+ - 'app/serializers/group_child_entity.rb'
+ - 'app/serializers/group_entity.rb'
+ - 'app/serializers/impersonation_access_token_entity.rb'
+ - 'app/serializers/impersonation_access_token_serializer.rb'
+ - 'app/serializers/import/github_failure_entity.rb'
+ - 'app/serializers/integrations/field_entity.rb'
+ - 'app/serializers/merge_request_noteable_entity.rb'
+ - 'app/serializers/merge_request_poll_cached_widget_entity.rb'
+ - 'app/serializers/merge_request_poll_widget_entity.rb'
+ - 'app/serializers/merge_request_widget_entity.rb'
+ - 'app/serializers/personal_access_token_entity.rb'
+ - 'app/serializers/personal_access_token_serializer.rb'
+ - 'app/serializers/pipeline_serializer.rb'
+ - 'app/serializers/profile/event_entity.rb'
+ - 'app/serializers/project_access_token_entity.rb'
+ - 'app/serializers/project_access_token_serializer.rb'
+ - 'app/services/admin/set_feature_flag_service.rb'
+ - 'app/services/authorized_project_update/project_access_changed_service.rb'
+ - 'app/services/authorized_project_update/project_recalculate_per_user_service.rb'
+ - 'app/services/authorized_project_update/project_recalculate_service.rb'
+ - 'app/services/award_emojis/destroy_service.rb'
+ - 'app/services/base_group_service.rb'
+ - 'app/services/boards/base_item_move_service.rb'
+ - 'app/services/boards/base_items_list_service.rb'
+ - 'app/services/boards/lists/base_create_service.rb'
+ - 'app/services/boards/lists/base_destroy_service.rb'
+ - 'app/services/boards/lists/move_service.rb'
+ - 'app/services/branches/delete_merged_service.rb'
+ - 'app/services/bulk_imports/batched_relation_export_service.rb'
+ - 'app/services/bulk_imports/create_service.rb'
+ - 'app/services/bulk_imports/lfs_objects_export_service.rb'
+ - 'app/services/bulk_imports/relation_batch_export_service.rb'
+ - 'app/services/bulk_imports/relation_export_service.rb'
+ - 'app/services/bulk_imports/tree_export_service.rb'
+ - 'app/services/bulk_imports/uploads_export_service.rb'
+ - 'app/services/bulk_update_integration_service.rb'
+ - 'app/services/chat_names/find_user_service.rb'
+ - 'app/services/ci/abort_pipelines_service.rb'
+ - 'app/services/ci/archive_trace_service.rb'
+ - 'app/services/ci/change_variable_service.rb'
+ - 'app/services/ci/create_commit_status_service.rb'
+ - 'app/services/ci/create_pipeline_service.rb'
+ - 'app/services/ci/delete_objects_service.rb'
+ - 'app/services/ci/delete_unit_tests_service.rb'
+ - 'app/services/ci/ensure_stage_service.rb'
+ - 'app/services/ci/expire_pipeline_cache_service.rb'
+ - 'app/services/ci/job_artifacts/bulk_delete_by_project_service.rb'
+ - 'app/services/ci/job_artifacts/destroy_batch_service.rb'
+ - 'app/services/ci/job_artifacts/expire_project_build_artifacts_service.rb'
+ - 'app/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service.rb'
+ - 'app/services/ci/pipeline_creation/cancel_redundant_pipelines_service.rb'
+ - 'app/services/ci/pipeline_processing/atomic_processing_service.rb'
+ - 'app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb'
+ - 'app/services/ci/queue/build_queue_service.rb'
+ - 'app/services/ci/queue/pending_builds_strategy.rb'
+ - 'app/services/ci/refs/enqueue_pipelines_to_unlock_service.rb'
+ - 'app/services/ci/register_job_service.rb'
+ - 'app/services/ci/reset_skipped_jobs_service.rb'
+ - 'app/services/ci/resource_groups/assign_resource_from_resource_group_service.rb'
+ - 'app/services/ci/retry_job_service.rb'
+ - 'app/services/ci/runners/bulk_delete_runners_service.rb'
+ - 'app/services/ci/runners/reconcile_existing_runner_versions_service.rb'
+ - 'app/services/ci/runners/set_runner_associated_projects_service.rb'
+ - 'app/services/ci/stuck_builds/drop_helpers.rb'
+ - 'app/services/ci/stuck_builds/drop_pending_service.rb'
+ - 'app/services/ci/stuck_builds/drop_running_service.rb'
+ - 'app/services/ci/track_failed_build_service.rb'
+ - 'app/services/ci/unlock_artifacts_service.rb'
+ - 'app/services/ci/unlock_pipeline_service.rb'
+ - 'app/services/ci/update_build_state_service.rb'
+ - 'app/services/clusters/agents/authorizations/ci_access/refresh_service.rb'
+ - 'app/services/cohorts_service.rb'
+ - 'app/services/commits/change_service.rb'
+ - 'app/services/concerns/issues/resolve_discussions.rb'
+ - 'app/services/concerns/rate_limited_service.rb'
+ - 'app/services/concerns/work_items/widgetable_service.rb'
+ - 'app/services/database/consistency_check_service.rb'
+ - 'app/services/database/consistency_fix_service.rb'
+ - 'app/services/database/mark_migration_service.rb'
+ - 'app/services/deployments/create_for_job_service.rb'
+ - 'app/services/design_management/copy_design_collection/copy_service.rb'
+ - 'app/services/design_management/generate_image_versions_service.rb'
+ - 'app/services/environments/create_for_job_service.rb'
+ - 'app/services/environments/stop_stale_service.rb'
+ - 'app/services/export_csv/base_service.rb'
+ - 'app/services/git/wiki_push_service.rb'
+ - 'app/services/groups/autocomplete_service.rb'
+ - 'app/services/groups/destroy_service.rb'
+ - 'app/services/groups/import_export/import_service.rb'
+ - 'app/services/groups/transfer_service.rb'
+ - 'app/services/integrations/slack_options/label_search_handler.rb'
+ - 'app/services/integrations/slack_options/user_search_handler.rb'
+ - 'app/services/issuable_base_service.rb'
+ - 'app/services/issuable_links/create_service.rb'
+ - 'app/services/issues/build_service.rb'
+ - 'app/services/issues/export_csv_service.rb'
+ - 'app/services/issues/referenced_merge_requests_service.rb'
+ - 'app/services/issues/relative_position_rebalancing_service.rb'
+ - 'app/services/issues/set_crm_contacts_service.rb'
+ - 'app/services/issues/update_service.rb'
+ - 'app/services/labels/available_labels_service.rb'
+ - 'app/services/labels/find_or_create_service.rb'
+ - 'app/services/labels/promote_service.rb'
+ - 'app/services/labels/transfer_service.rb'
+ - 'app/services/lfs/file_transformer.rb'
+ - 'app/services/lfs/lock_file_service.rb'
+ - 'app/services/lfs/locks_finder_service.rb'
+ - 'app/services/lfs/unlock_file_service.rb'
+ - 'app/services/loose_foreign_keys/cleaner_service.rb'
+ - 'app/services/members/create_service.rb'
+ - 'app/services/members/invite_member_builder.rb'
+ - 'app/services/members/projects/creator_service.rb'
+ - 'app/services/members/standard_member_builder.rb'
+ - 'app/services/merge_requests/base_service.rb'
+ - 'app/services/merge_requests/create_from_issue_service.rb'
+ - 'app/services/merge_requests/delete_non_latest_diffs_service.rb'
+ - 'app/services/merge_requests/migrate_external_diffs_service.rb'
+ - 'app/services/merge_requests/push_options_handler_service.rb'
+ - 'app/services/merge_requests/pushed_branches_service.rb'
+ - 'app/services/merge_requests/refresh_service.rb'
+ - 'app/services/merge_requests/reload_diffs_service.rb'
+ - 'app/services/merge_requests/remove_approval_service.rb'
+ - 'app/services/merge_requests/update_service.rb'
+ - 'app/services/milestones/find_or_create_service.rb'
+ - 'app/services/milestones/promote_service.rb'
+ - 'app/services/milestones/transfer_service.rb'
+ - 'app/services/notification_recipients/builder/base.rb'
+ - 'app/services/notification_service.rb'
+ - 'app/services/packages/cleanup/execute_policy_service.rb'
+ - 'app/services/packages/conan/single_package_search_service.rb'
+ - 'app/services/packages/create_dependency_service.rb'
+ - 'app/services/packages/create_package_service.rb'
+ - 'app/services/packages/debian/extract_metadata_service.rb'
+ - 'app/services/packages/debian/generate_distribution_key_service.rb'
+ - 'app/services/packages/debian/generate_distribution_service.rb'
+ - 'app/services/packages/helm/extract_file_metadata_service.rb'
+ - 'app/services/packages/npm/create_package_service.rb'
+ - 'app/services/packages/nuget/create_dependency_service.rb'
+ - 'app/services/packages/nuget/extract_remote_metadata_file_service.rb'
+ - 'app/services/packages/nuget/process_package_file_service.rb'
+ - 'app/services/packages/nuget/search_service.rb'
+ - 'app/services/packages/rpm/repository_metadata/build_xml_base_service.rb'
+ - 'app/services/packages/rubygems/metadata_extraction_service.rb'
+ - 'app/services/packages/update_tags_service.rb'
+ - 'app/services/pages/destroy_deployments_service.rb'
+ - 'app/services/personal_access_tokens/revoke_token_family_service.rb'
+ - 'app/services/projects/auto_devops/disable_service.rb'
+ - 'app/services/projects/autocomplete_service.rb'
+ - 'app/services/projects/batch_forks_count_service.rb'
+ - 'app/services/projects/batch_open_issues_count_service.rb'
+ - 'app/services/projects/batch_open_merge_requests_count_service.rb'
+ - 'app/services/projects/branches_by_mode_service.rb'
+ - 'app/services/projects/cleanup_service.rb'
+ - 'app/services/projects/container_repository/third_party/delete_tags_service.rb'
+ - 'app/services/projects/destroy_service.rb'
+ - 'app/services/projects/detect_repository_languages_service.rb'
+ - 'app/services/projects/disable_deploy_key_service.rb'
+ - 'app/services/projects/forks_count_service.rb'
+ - 'app/services/projects/gitlab_projects_import_service.rb'
+ - 'app/services/projects/lfs_pointers/lfs_link_service.rb'
+ - 'app/services/projects/move_deploy_keys_projects_service.rb'
+ - 'app/services/projects/move_forks_service.rb'
+ - 'app/services/projects/move_lfs_objects_projects_service.rb'
+ - 'app/services/projects/move_notification_settings_service.rb'
+ - 'app/services/projects/move_project_authorizations_service.rb'
+ - 'app/services/projects/move_project_group_links_service.rb'
+ - 'app/services/projects/move_project_members_service.rb'
+ - 'app/services/projects/open_issues_count_service.rb'
+ - 'app/services/projects/overwrite_project_service.rb'
+ - 'app/services/projects/record_target_platforms_service.rb'
+ - 'app/services/projects/slack_application_install_service.rb'
+ - 'app/services/projects/transfer_service.rb'
+ - 'app/services/projects/unlink_fork_service.rb'
+ - 'app/services/projects/update_pages_service.rb'
+ - 'app/services/protected_branches/cache_service.rb'
+ - 'app/services/protected_branches/legacy_api_update_service.rb'
+ - 'app/services/quick_actions/interpret_service.rb'
+ - 'app/services/quick_actions/target_service.rb'
+ - 'app/services/releases/create_evidence_service.rb'
+ - 'app/services/releases/create_service.rb'
+ - 'app/services/releases/update_service.rb'
+ - 'app/services/repositories/changelog_service.rb'
+ - 'app/services/resource_events/change_labels_service.rb'
+ - 'app/services/resource_events/synthetic_label_notes_builder_service.rb'
+ - 'app/services/resource_events/synthetic_milestone_notes_builder_service.rb'
+ - 'app/services/resource_events/synthetic_state_notes_builder_service.rb'
+ - 'app/services/search/global_service.rb'
+ - 'app/services/search_service.rb'
+ - 'app/services/service_ping/submit_service.rb'
+ - 'app/services/snippets/bulk_destroy_service.rb'
+ - 'app/services/snippets/count_service.rb'
+ - 'app/services/spam/akismet_service.rb'
+ - 'app/services/suggestions/create_service.rb'
+ - 'app/services/suggestions/outdate_service.rb'
+ - 'app/services/system_notes/commit_service.rb'
+ - 'app/services/system_notes/issuables_service.rb'
+ - 'app/services/terraform/remote_state_handler.rb'
+ - 'app/services/todos/destroy/confidential_issue_service.rb'
+ - 'app/services/todos/destroy/entity_leave_service.rb'
+ - 'app/services/todos/destroy/unauthorized_features_service.rb'
+ - 'app/services/topics/merge_service.rb'
+ - 'app/services/uploads/destroy_service.rb'
+ - 'app/services/user_project_access_changed_service.rb'
+ - 'app/services/users/activate_service.rb'
+ - 'app/services/users/assigned_issues_count_service.rb'
+ - 'app/services/users/batch_status_cleaner_service.rb'
+ - 'app/services/users/destroy_service.rb'
+ - 'app/services/users/last_push_event_service.rb'
+ - 'app/services/users/migrate_records_to_ghost_user_service.rb'
+ - 'app/services/users/respond_to_terms_service.rb'
+ - 'app/services/users/set_namespace_commit_email_service.rb'
+ - 'app/services/users/update_service.rb'
+ - 'app/services/verify_pages_domain_service.rb'
+ - 'app/services/web_hook_service.rb'
+ - 'app/services/wiki_pages/update_service.rb'
+ - 'app/services/work_items/widgets/hierarchy_service/base_service.rb'
+ - 'app/uploaders/gitlab_uploader.rb'
+ - 'app/uploaders/metric_image_uploader.rb'
+ - 'app/uploaders/object_storage.rb'
+ - 'app/uploaders/object_storage/cdn.rb'
+ - 'app/uploaders/object_storage/cdn/google_cdn.rb'
+ - 'app/uploaders/object_storage/cdn/google_ip_cache.rb'
+ - 'app/uploaders/records_uploads.rb'
+ - 'app/validators/addressable_url_validator.rb'
+ - 'app/validators/cron_validator.rb'
+ - 'app/validators/ip_address_validator.rb'
+ - 'app/validators/nested_attributes_duplicates_validator.rb'
+ - 'app/validators/x509_certificate_credentials_validator.rb'
+ - 'app/views/dashboard/issues.atom.builder'
+ - 'app/views/groups/issues.atom.builder'
+ - 'app/views/issues/_issues_calendar.ics.ruby'
+ - 'app/views/projects/issues/index.atom.builder'
+ - 'app/views/projects/merge_requests/index.atom.builder'
+ - 'app/workers/admin_email_worker.rb'
+ - 'app/workers/analytics/usage_trends/count_job_trigger_worker.rb'
+ - 'app/workers/authorized_project_update/periodic_recalculate_worker.rb'
+ - 'app/workers/authorized_project_update/user_refresh_over_user_range_worker.rb'
+ - 'app/workers/auto_devops/disable_worker.rb'
+ - 'app/workers/auto_merge_process_worker.rb'
+ - 'app/workers/background_migration/ci_database_worker.rb'
+ - 'app/workers/background_migration_worker.rb'
+ - 'app/workers/batched_git_ref_updates/cleanup_scheduler_worker.rb'
+ - 'app/workers/build_hooks_worker.rb'
+ - 'app/workers/build_queue_worker.rb'
+ - 'app/workers/build_success_worker.rb'
+ - 'app/workers/bulk_import_worker.rb'
+ - 'app/workers/bulk_imports/finish_batched_pipeline_worker.rb'
+ - 'app/workers/bulk_imports/pipeline_batch_worker.rb'
+ - 'app/workers/bulk_imports/pipeline_worker.rb'
+ - 'app/workers/bulk_imports/relation_batch_export_worker.rb'
+ - 'app/workers/bulk_imports/stuck_import_worker.rb'
+ - 'app/workers/chaos/cpu_spin_worker.rb'
+ - 'app/workers/chaos/db_spin_worker.rb'
+ - 'app/workers/chaos/kill_worker.rb'
+ - 'app/workers/chaos/leak_mem_worker.rb'
+ - 'app/workers/chaos/sleep_worker.rb'
+ - 'app/workers/chat_notification_worker.rb'
+ - 'app/workers/ci/archive_trace_worker.rb'
+ - 'app/workers/ci/archive_traces_cron_worker.rb'
+ - 'app/workers/ci/build_finished_worker.rb'
+ - 'app/workers/ci/build_prepare_worker.rb'
+ - 'app/workers/ci/build_schedule_worker.rb'
+ - 'app/workers/ci/create_downstream_pipeline_worker.rb'
+ - 'app/workers/ci/delete_unit_tests_worker.rb'
+ - 'app/workers/ci/external_pull_requests/create_pipeline_worker.rb'
+ - 'app/workers/ci/pipeline_artifacts/expire_artifacts_worker.rb'
+ - 'app/workers/ci/pipeline_bridge_status_worker.rb'
+ - 'app/workers/ci/pipeline_cleanup_ref_worker.rb'
+ - 'app/workers/ci/refs/unlock_previous_pipelines_worker.rb'
+ - 'app/workers/ci/retry_pipeline_worker.rb'
+ - 'app/workers/ci/runners/reconcile_existing_runner_versions_cron_worker.rb'
+ - 'app/workers/ci/runners/stale_machines_cleanup_cron_worker.rb'
+ - 'app/workers/ci/schedule_delete_objects_cron_worker.rb'
+ - 'app/workers/ci/schedule_unlock_pipelines_in_queue_cron_worker.rb'
+ - 'app/workers/ci/stuck_builds/drop_running_worker.rb'
+ - 'app/workers/ci/stuck_builds/drop_scheduled_worker.rb'
+ - 'app/workers/ci/track_failed_build_worker.rb'
+ - 'app/workers/ci/unlock_pipelines_in_queue_worker.rb'
+ - 'app/workers/ci/update_locked_unknown_artifacts_worker.rb'
+ - 'app/workers/ci_platform_metrics_update_cron_worker.rb'
+ - 'app/workers/click_house/events_sync_worker.rb'
+ - 'app/workers/cluster_configure_istio_worker.rb'
+ - 'app/workers/cluster_install_app_worker.rb'
+ - 'app/workers/cluster_patch_app_worker.rb'
+ - 'app/workers/cluster_update_app_worker.rb'
+ - 'app/workers/cluster_upgrade_app_worker.rb'
+ - 'app/workers/cluster_wait_for_app_installation_worker.rb'
+ - 'app/workers/cluster_wait_for_app_update_worker.rb'
+ - 'app/workers/cluster_wait_for_ingress_ip_address_worker.rb'
+ - 'app/workers/clusters/applications/activate_integration_worker.rb'
+ - 'app/workers/clusters/applications/deactivate_integration_worker.rb'
+ - 'app/workers/clusters/applications/uninstall_worker.rb'
+ - 'app/workers/clusters/applications/wait_for_uninstall_app_worker.rb'
+ - 'app/workers/clusters/cleanup/project_namespace_worker.rb'
+ - 'app/workers/clusters/cleanup/service_account_worker.rb'
+ - 'app/workers/concerns/application_worker.rb'
+ - 'app/workers/concerns/chaos_queue.rb'
+ - 'app/workers/concerns/gitlab/bitbucket_import/stage_methods.rb'
+ - 'app/workers/concerns/gitlab/bitbucket_server_import/stage_methods.rb'
+ - 'app/workers/concerns/gitlab/github_import/stage_methods.rb'
+ - 'app/workers/concerns/limited_capacity/job_tracker.rb'
+ - 'app/workers/concerns/limited_capacity/worker.rb'
+ - 'app/workers/concerns/new_issuable.rb'
+ - 'app/workers/concerns/reactive_cacheable_worker.rb'
+ - 'app/workers/container_expiration_policies/cleanup_container_repository_worker.rb'
+ - 'app/workers/container_expiration_policy_worker.rb'
+ - 'app/workers/container_registry/cleanup_worker.rb'
+ - 'app/workers/container_registry/migration/enqueuer_worker.rb'
+ - 'app/workers/container_registry/migration/guard_worker.rb'
+ - 'app/workers/container_registry/migration/observer_worker.rb'
+ - 'app/workers/container_registry/record_data_repair_detail_worker.rb'
+ - 'app/workers/counters/cleanup_refresh_worker.rb'
+ - 'app/workers/create_note_diff_file_worker.rb'
+ - 'app/workers/create_pipeline_worker.rb'
+ - 'app/workers/database/batched_background_migration/ci_database_worker.rb'
+ - 'app/workers/database/batched_background_migration/ci_execution_worker.rb'
+ - 'app/workers/database/batched_background_migration/execution_worker.rb'
+ - 'app/workers/database/batched_background_migration/main_execution_worker.rb'
+ - 'app/workers/database/batched_background_migration/single_database_worker.rb'
+ - 'app/workers/database/batched_background_migration_worker.rb'
+ - 'app/workers/database/ci_namespace_mirrors_consistency_check_worker.rb'
+ - 'app/workers/database/ci_project_mirrors_consistency_check_worker.rb'
+ - 'app/workers/database/drop_detached_partitions_worker.rb'
+ - 'app/workers/database/lock_tables_worker.rb'
+ - 'app/workers/database/monitor_locked_tables_worker.rb'
+ - 'app/workers/database/partition_management_worker.rb'
+ - 'app/workers/delete_diff_files_worker.rb'
+ - 'app/workers/delete_merged_branches_worker.rb'
+ - 'app/workers/delete_stored_files_worker.rb'
+ - 'app/workers/delete_user_worker.rb'
+ - 'app/workers/dependency_proxy/cleanup_dependency_proxy_worker.rb'
+ - 'app/workers/dependency_proxy/image_ttl_group_policy_worker.rb'
+ - 'app/workers/deployments/hooks_worker.rb'
+ - 'app/workers/design_management/new_version_worker.rb'
+ - 'app/workers/detect_repository_languages_worker.rb'
+ - 'app/workers/disallow_two_factor_for_subgroups_worker.rb'
+ - 'app/workers/email_receiver_worker.rb'
+ - 'app/workers/emails_on_push_worker.rb'
+ - 'app/workers/environments/auto_delete_cron_worker.rb'
+ - 'app/workers/environments/auto_stop_cron_worker.rb'
+ - 'app/workers/error_tracking_issue_link_worker.rb'
+ - 'app/workers/expire_build_artifacts_worker.rb'
+ - 'app/workers/export_csv_worker.rb'
+ - 'app/workers/external_service_reactive_caching_worker.rb'
+ - 'app/workers/file_hook_worker.rb'
+ - 'app/workers/flush_counter_increments_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/advance_stage_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/import_issue_notes_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/import_issue_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/import_lfs_object_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/import_pull_request_notes_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/import_pull_request_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/stage/finish_import_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/stage/import_issues_notes_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/stage/import_issues_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/stage/import_lfs_objects_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/stage/import_pull_requests_notes_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/stage/import_pull_requests_worker.rb'
+ - 'app/workers/gitlab/bitbucket_import/stage/import_repository_worker.rb'
+ - 'app/workers/gitlab/bitbucket_server_import/advance_stage_worker.rb'
+ - 'app/workers/gitlab/bitbucket_server_import/import_lfs_object_worker.rb'
+ - 'app/workers/gitlab/bitbucket_server_import/import_pull_request_notes_worker.rb'
+ - 'app/workers/gitlab/bitbucket_server_import/import_pull_request_worker.rb'
+ - 'app/workers/gitlab/bitbucket_server_import/stage/finish_import_worker.rb'
+ - 'app/workers/gitlab/bitbucket_server_import/stage/import_lfs_objects_worker.rb'
+ - 'app/workers/gitlab/bitbucket_server_import/stage/import_notes_worker.rb'
+ - 'app/workers/gitlab/bitbucket_server_import/stage/import_pull_requests_worker.rb'
+ - 'app/workers/gitlab/bitbucket_server_import/stage/import_repository_worker.rb'
+ - 'app/workers/gitlab/export/prune_project_export_jobs_worker.rb'
+ - 'app/workers/gitlab/github_gists_import/import_gist_worker.rb'
+ - 'app/workers/gitlab/github_gists_import/start_import_worker.rb'
+ - 'app/workers/gitlab/github_import/advance_stage_worker.rb'
+ - 'app/workers/gitlab/github_import/attachments/import_issue_worker.rb'
+ - 'app/workers/gitlab/github_import/attachments/import_merge_request_worker.rb'
+ - 'app/workers/gitlab/github_import/attachments/import_note_worker.rb'
+ - 'app/workers/gitlab/github_import/attachments/import_release_worker.rb'
+ - 'app/workers/gitlab/github_import/import_collaborator_worker.rb'
+ - 'app/workers/gitlab/github_import/import_diff_note_worker.rb'
+ - 'app/workers/gitlab/github_import/import_issue_event_worker.rb'
+ - 'app/workers/gitlab/github_import/import_issue_worker.rb'
+ - 'app/workers/gitlab/github_import/import_lfs_object_worker.rb'
+ - 'app/workers/gitlab/github_import/import_note_worker.rb'
+ - 'app/workers/gitlab/github_import/import_protected_branch_worker.rb'
+ - 'app/workers/gitlab/github_import/import_pull_request_worker.rb'
+ - 'app/workers/gitlab/github_import/pull_requests/import_merged_by_worker.rb'
+ - 'app/workers/gitlab/github_import/pull_requests/import_review_request_worker.rb'
+ - 'app/workers/gitlab/github_import/pull_requests/import_review_worker.rb'
+ - 'app/workers/gitlab/github_import/refresh_import_jid_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/finish_import_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_attachments_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_base_data_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_collaborators_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_issue_events_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_lfs_objects_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_notes_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_protected_branches_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_pull_requests_merged_by_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_pull_requests_review_requests_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_pull_requests_reviews_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_pull_requests_worker.rb'
+ - 'app/workers/gitlab/github_import/stage/import_repository_worker.rb'
+ - 'app/workers/gitlab/import/stuck_import_job.rb'
+ - 'app/workers/gitlab/import/stuck_project_import_jobs_worker.rb'
+ - 'app/workers/gitlab/jira_import/advance_stage_worker.rb'
+ - 'app/workers/gitlab/jira_import/import_issue_worker.rb'
+ - 'app/workers/gitlab/jira_import/stage/finish_import_worker.rb'
+ - 'app/workers/gitlab/jira_import/stage/import_attachments_worker.rb'
+ - 'app/workers/gitlab/jira_import/stage/import_issues_worker.rb'
+ - 'app/workers/gitlab/jira_import/stage/import_labels_worker.rb'
+ - 'app/workers/gitlab/jira_import/stage/import_notes_worker.rb'
+ - 'app/workers/gitlab/jira_import/stage/start_import_worker.rb'
+ - 'app/workers/gitlab/jira_import/stuck_jira_import_jobs_worker.rb'
+ - 'app/workers/gitlab_performance_bar_stats_worker.rb'
+ - 'app/workers/gitlab_service_ping_worker.rb'
+ - 'app/workers/google_cloud/create_cloudsql_instance_worker.rb'
+ - 'app/workers/group_export_worker.rb'
+ - 'app/workers/group_import_worker.rb'
+ - 'app/workers/import_export_project_cleanup_worker.rb'
+ - 'app/workers/import_issues_csv_worker.rb'
+ - 'app/workers/incident_management/add_severity_system_note_worker.rb'
+ - 'app/workers/incident_management/pager_duty/process_incident_worker.rb'
+ - 'app/workers/incident_management/process_alert_worker_v2.rb'
+ - 'app/workers/integrations/execute_worker.rb'
+ - 'app/workers/integrations/irker_worker.rb'
+ - 'app/workers/invalid_gpg_signature_update_worker.rb'
+ - 'app/workers/issuable_export_csv_worker.rb'
+ - 'app/workers/issue_due_scheduler_worker.rb'
+ - 'app/workers/issues/placement_worker.rb'
+ - 'app/workers/jira_connect/forward_event_worker.rb'
+ - 'app/workers/jira_connect/retry_request_worker.rb'
+ - 'app/workers/jira_connect/sync_branch_worker.rb'
+ - 'app/workers/jira_connect/sync_builds_worker.rb'
+ - 'app/workers/jira_connect/sync_deployments_worker.rb'
+ - 'app/workers/jira_connect/sync_feature_flags_worker.rb'
+ - 'app/workers/jira_connect/sync_merge_request_worker.rb'
+ - 'app/workers/jira_connect/sync_project_worker.rb'
+ - 'app/workers/loose_foreign_keys/cleanup_worker.rb'
+ - 'app/workers/mail_scheduler/issue_due_worker.rb'
+ - 'app/workers/mail_scheduler/notification_service_worker.rb'
+ - 'app/workers/member_invitation_reminder_emails_worker.rb'
+ - 'app/workers/members/expiring_email_notification_worker.rb'
+ - 'app/workers/members/expiring_worker.rb'
+ - 'app/workers/merge_worker.rb'
+ - 'app/workers/metrics/global_metrics_update_worker.rb'
+ - 'app/workers/migrate_external_diffs_worker.rb'
+ - 'app/workers/namespaces/prune_aggregation_schedules_worker.rb'
+ - 'app/workers/new_issue_worker.rb'
+ - 'app/workers/new_merge_request_worker.rb'
+ - 'app/workers/new_note_worker.rb'
+ - 'app/workers/object_pool/create_worker.rb'
+ - 'app/workers/object_pool/destroy_worker.rb'
+ - 'app/workers/object_pool/join_worker.rb'
+ - 'app/workers/object_pool/schedule_join_worker.rb'
+ - 'app/workers/object_storage/delete_stale_direct_uploads_worker.rb'
+ - 'app/workers/object_storage/migrate_uploads_worker.rb'
+ - 'app/workers/packages/cleanup/delete_orphaned_dependencies_worker.rb'
+ - 'app/workers/packages/cleanup/execute_policy_worker.rb'
+ - 'app/workers/packages/cleanup_package_registry_worker.rb'
+ - 'app/workers/packages/composer/cache_cleanup_worker.rb'
+ - 'app/workers/packages/debian/cleanup_dangling_package_files_worker.rb'
+ - 'app/workers/packages/nuget/extraction_worker.rb'
+ - 'app/workers/packages/rubygems/extraction_worker.rb'
+ - 'app/workers/pages/deactivated_deployments_delete_cron_worker.rb'
+ - 'app/workers/pages_domain_removal_cron_worker.rb'
+ - 'app/workers/pages_domain_ssl_renewal_cron_worker.rb'
+ - 'app/workers/pages_domain_ssl_renewal_worker.rb'
+ - 'app/workers/pages_domain_verification_cron_worker.rb'
+ - 'app/workers/pages_domain_verification_worker.rb'
+ - 'app/workers/pages_worker.rb'
+ - 'app/workers/partition_creation_worker.rb'
+ - 'app/workers/pause_control/resume_worker.rb'
+ - 'app/workers/personal_access_tokens/expired_notification_worker.rb'
+ - 'app/workers/personal_access_tokens/expiring_worker.rb'
+ - 'app/workers/pipeline_hooks_worker.rb'
+ - 'app/workers/pipeline_metrics_worker.rb'
+ - 'app/workers/pipeline_notification_worker.rb'
+ - 'app/workers/pipeline_schedule_worker.rb'
+ - 'app/workers/project_export_worker.rb'
+ - 'app/workers/projects/finalize_project_statistics_refresh_worker.rb'
+ - 'app/workers/projects/git_garbage_collect_worker.rb'
+ - 'app/workers/projects/import_export/create_relation_exports_worker.rb'
+ - 'app/workers/projects/inactive_projects_deletion_cron_worker.rb'
+ - 'app/workers/projects/schedule_refresh_build_artifacts_size_statistics_worker.rb'
+ - 'app/workers/projects/update_repository_storage_worker.rb'
+ - 'app/workers/propagate_integration_group_worker.rb'
+ - 'app/workers/propagate_integration_inherit_descendant_worker.rb'
+ - 'app/workers/propagate_integration_inherit_worker.rb'
+ - 'app/workers/propagate_integration_project_worker.rb'
+ - 'app/workers/prune_old_events_worker.rb'
+ - 'app/workers/reactive_caching_worker.rb'
+ - 'app/workers/rebase_worker.rb'
+ - 'app/workers/releases/create_evidence_worker.rb'
+ - 'app/workers/releases/manage_evidence_worker.rb'
+ - 'app/workers/remote_mirror_notification_worker.rb'
+ - 'app/workers/remove_expired_group_links_worker.rb'
+ - 'app/workers/remove_expired_members_worker.rb'
+ - 'app/workers/remove_unaccepted_member_invites_worker.rb'
+ - 'app/workers/remove_unreferenced_lfs_objects_worker.rb'
+ - 'app/workers/repository_archive_cache_worker.rb'
+ - 'app/workers/repository_check/batch_worker.rb'
+ - 'app/workers/repository_check/clear_worker.rb'
+ - 'app/workers/repository_check/dispatch_worker.rb'
+ - 'app/workers/repository_check/single_repository_worker.rb'
+ - 'app/workers/repository_cleanup_worker.rb'
+ - 'app/workers/repository_fork_worker.rb'
+ - 'app/workers/repository_import_worker.rb'
+ - 'app/workers/run_pipeline_schedule_worker.rb'
+ - 'app/workers/schedule_merge_request_cleanup_refs_worker.rb'
+ - 'app/workers/schedule_migrate_external_diffs_worker.rb'
+ - 'app/workers/service_desk_email_receiver_worker.rb'
+ - 'app/workers/snippets/update_repository_storage_worker.rb'
+ - 'app/workers/ssh_keys/expired_notification_worker.rb'
+ - 'app/workers/ssh_keys/expiring_soon_notification_worker.rb'
+ - 'app/workers/stuck_ci_jobs_worker.rb'
+ - 'app/workers/stuck_export_jobs_worker.rb'
+ - 'app/workers/stuck_merge_jobs_worker.rb'
+ - 'app/workers/system_hook_push_worker.rb'
+ - 'app/workers/todos_destroyer/confidential_issue_worker.rb'
+ - 'app/workers/todos_destroyer/entity_leave_worker.rb'
+ - 'app/workers/todos_destroyer/group_private_worker.rb'
+ - 'app/workers/todos_destroyer/private_features_worker.rb'
+ - 'app/workers/todos_destroyer/project_private_worker.rb'
+ - 'app/workers/trending_projects_worker.rb'
+ - 'app/workers/update_container_registry_info_worker.rb'
+ - 'app/workers/update_external_pull_requests_worker.rb'
+ - 'app/workers/update_highest_role_worker.rb'
+ - 'app/workers/update_merge_requests_worker.rb'
+ - 'app/workers/update_project_statistics_worker.rb'
+ - 'app/workers/upload_checksum_worker.rb'
+ - 'app/workers/user_status_cleanup/batch_worker.rb'
+ - 'app/workers/users/create_statistics_worker.rb'
+ - 'app/workers/users/deactivate_dormant_users_worker.rb'
+ - 'app/workers/users/migrate_records_to_ghost_user_in_batches_worker.rb'
+ - 'app/workers/web_hook_worker.rb'
+ - 'app/workers/wikis/git_garbage_collect_worker.rb'
+ - 'app/workers/x509_issuer_crl_check_worker.rb'
+ - 'config/application.rb'
+ - 'config/initializers/00_deprecations.rb'
+ - 'config/initializers/01_secret_token.rb'
+ - 'config/initializers/0_inject_enterprise_edition_module.rb'
+ - 'config/initializers/0_postgresql_types.rb'
+ - 'config/initializers/1_active_record_data_types.rb'
+ - 'config/initializers/7_redis.rb'
+ - 'config/initializers/active_record_lifecycle.rb'
+ - 'config/initializers/active_record_transaction_observer.rb'
+ - 'config/initializers/carrierwave_performance_patch.rb'
+ - 'config/initializers/database_config.rb'
+ - 'config/initializers/enumerator_next_patch.rb'
+ - 'config/initializers/fix_local_cache_middleware.rb'
+ - 'config/initializers/fog_core_patch.rb'
+ - 'config/initializers/grape_validators.rb'
+ - 'config/initializers/grpc_patch.rb'
+ - 'config/initializers/kaminari_active_record_relation_methods_with_limit.rb'
+ - 'config/initializers/mail_starttls_patch.rb'
+ - 'config/initializers/postgres_cte_as_materialized.rb'
+ - 'config/initializers/rack_VULNDB-255039_patch.rb'
+ - 'config/initializers/rspec_profiling.rb'
+ - 'config/initializers/safe_session_store_patch.rb'
+ - 'config/initializers/sidekiq.rb'
+ - 'config/initializers/warden.rb'
+ - 'config/initializers/wikicloth_redos_patch.rb'
+ - 'config/initializers/wikicloth_ruby_3_patch.rb'
+ - 'config/routes/api.rb'
+ - 'config/routes/group.rb'
+ - 'config/routes/project.rb'
+ - 'danger/ce_ee_vue_templates/Dangerfile'
+ - 'danger/roulette/Dangerfile'
+ - 'db/migrate/20220316022505_create_namespace_details.rb'
+ - 'db/migrate/20220331125725_add_title_to_topic.rb'
+ - 'db/migrate/20220401071609_add_campaign_to_in_product_marketing_email.rb'
+ - 'db/migrate/20220421141342_add_allowed_plans_to_ci_runners.rb'
+ - 'db/migrate/20220503035221_add_gitlab_schema_to_batched_background_migrations.rb'
+ - 'db/migrate/20220513114706_add_jira_connect_application_id_application_setting.rb'
+ - 'db/migrate/20220516092207_add_globally_allowed_ips_to_application_setting.rb'
+ - 'db/migrate/20220531024905_add_operations_access_levels_to_project_feature.rb'
+ - 'db/migrate/20220601091804_add_semver_column_to_ci_runners.rb'
+ - 'db/migrate/20220602130306_add_namespace_type_index.rb'
+ - 'db/migrate/20220617141347_create_ci_secure_file_states.rb'
+ - 'db/migrate/20220726154013_add_component_id_to_sbom_occurrences.rb'
+ - 'db/migrate/20220802200719_add_user_details_profile_fields.rb'
+ - 'db/migrate/20220818125332_add_jitsu_tracking_columns_to_application_settings.rb'
+ - 'db/migrate/20220825105631_add_cube_api_key_to_application_settings.rb'
+ - 'db/migrate/20220902065317_add_partition_id_to_ci_builds.rb'
+ - 'db/migrate/20220914130800_add_jitsu_key_to_projects.rb'
+ - 'db/migrate/20220920135632_add_jira_connect_proxy_url_setting.rb'
+ - 'db/migrate/20220926023734_add_mirror_branch_regex_to_project_settings.rb'
+ - 'db/migrate/20221014034338_populate_releases_access_level_from_repository.rb'
+ - 'db/migrate/20221025043930_change_default_value_on_password_last_changed_at_to_user_details.rb'
+ - 'db/migrate/20221101032521_add_default_preferred_language_to_application_settings.rb'
+ - 'db/migrate/20221111123146_add_onboarding_in_progress_to_users.rb'
+ - 'db/migrate/20221111123147_add_onboarding_step_url_to_user_details.rb'
+ - 'db/migrate/20221114131943_add_short_title_to_appearances.rb'
+ - 'db/migrate/20221128155738_add_discord_to_user_details.rb'
+ - 'db/migrate/20221212192452_add_uuid_column_to_sbom_occurrences.rb'
+ - 'db/migrate/20221219103007_add_name_to_ml_candidates.rb'
+ - 'db/migrate/20221223114543_add_pwa_icon_to_appearances.rb'
+ - 'db/migrate/20221228072549_add_pwa_attributes_to_appearances.rb'
+ - 'db/migrate/20230102131000_add_smtp_credentials_to_service_desk_settings.rb'
+ - 'db/migrate/20230102180341_add_merge_request_meta_to_merge_requests_compliance_violations.rb'
+ - 'db/migrate/20230111132621_unpartition_pm_package_metadata_tables.rb'
+ - 'db/migrate/20230116143310_add_pages_unique_domain_columns_to_project_settings.rb'
+ - 'db/migrate/20230119151636_add_url_hash_to_web_hook_logs.rb'
+ - 'db/migrate/20230119214643_add_deactivation_email_additional_text_to_application_settings.rb'
+ - 'db/migrate/20230127155217_add_id_column_to_package_metadata_join_table.rb'
+ - 'db/migrate/20230130125541_add_attempts_and_last_error_to_postgres_async_indexes.rb'
+ - 'db/migrate/20230214142813_remove_ci_job_artifacts_original_filename.rb'
+ - 'db/migrate/20230216144719_drop_table_airflow_dags.rb'
+ - 'db/migrate/20230222161226_add_custom_jira_regex_to_jira_tracker_data.rb'
+ - 'db/migrate/20230228133011_add_design_description.rb'
+ - 'db/migrate/20230306145230_add_product_analytics_data_collector_host_to_application_settings.rb'
+ - 'db/migrate/20230313181536_create_packages_npm_metadata_caches.rb'
+ - 'db/migrate/20230315053635_add_screenshot_to_abuse_reports.rb'
+ - 'db/migrate/20230323140745_add_root_directory_to_pages_deployment.rb'
+ - 'db/migrate/20230329235300_add_diagramsnet_to_application_settings.rb'
+ - 'db/migrate/20230405071033_add_object_storage_key_to_packages_npm_metadata_caches.rb'
+ - 'db/migrate/20230406060452_create_instance_external_audit_event_destinations.rb'
+ - 'db/migrate/20230410092450_add_product_analytics_instrumentation_key_to_project_settings.rb'
+ - 'db/migrate/20230412151659_add_ci_job_artifacts_file_final_path.rb'
+ - 'db/migrate/20230503100753_add_version_format_and_data_type_to_checkpoints.rb'
+ - 'db/migrate/20230507192028_create_audit_events_google_cloud_logging_configurations.rb'
+ - 'db/migrate/20230509072635_drop_unused_sequence_by_recreating_vsa_table.rb'
+ - 'db/migrate/20230509115525_add_name_to_organization.rb'
+ - 'db/migrate/20230519112106_add_diff_column_to_schema_inconsistencies.rb'
+ - 'db/migrate/20230522162742_cleanup_bigint_conversion_for_merge_request_metrics_for_self_hosts.rb'
+ - 'db/migrate/20230529173607_add_id_column_to_pm_checkpoints.rb'
+ - 'db/migrate/20230529182720_recreate_billable_index.rb'
+ - 'db/migrate/20230529184716_recreated_activity_index.rb'
+ - 'db/migrate/20230530112122_add_path_to_organizations.rb'
+ - 'db/migrate/20230601090722_add_status_message_to_packages.rb'
+ - 'db/migrate/20230605043258_add_unconfirmed_created_at_index_to_users.rb'
+ - 'db/migrate/20230612074428_add_name_to_external_audit_event_destination.rb'
+ - 'db/migrate/20230612091747_add_name_to_instance_audit_event_destination.rb'
+ - 'db/migrate/20230614180651_add_organization_id_to_namespaces.rb'
+ - 'db/migrate/20230621072726_add_description_to_ci_variable.rb'
+ - 'db/migrate/20230621083004_add_description_to_ci_group_variable.rb'
+ - 'db/migrate/20230706130217_add_column_model_id_to_ml_experiments.rb'
+ - 'db/migrate/20230710160232_add_expires_at_to_service_access_tokens.rb'
+ - 'db/migrate/20230718145747_create_target_branch_rules.rb'
+ - 'db/migrate/20230726104022_add_name_to_google_cloud_logging_configuration.rb'
+ - 'db/migrate/20230809165212_add_path_prefix_and_build_ref_to_pages_deployments.rb'
+ - 'db/migrate/20230822064649_add_organization_id_to_project.rb'
+ - 'db/migrate/20230906185552_add_markdown_fields_to_review_llm_summary.rb'
+ - 'db/migrate/20230906204935_restart_self_hosted_sent_notifications_backfill.rb'
+ - 'db/migrate/20230915103259_create_ci_finished_build_ch_sync_events.rb'
+ - 'db/migrate/20230917144717_add_package_name_pattern_query_to_packages_protection_rule.rb'
+ - 'db/migrate/20230921081527_add_queued_migration_version_to_batched_background_migrations.rb'
+ - 'db/migrate/20231019180421_add_name_description_to_catalog_resources.rb'
+ - 'db/post_migrate/20220328100456_schedule20220328_reset_duplicate_ci_runners_token_encrypted_values_on_projects.rb'
+ - 'db/post_migrate/20220328100457_schedule20220328_reset_duplicate_ci_runners_token_values_on_projects.rb'
+ - 'db/post_migrate/20220504083836_cleanup_after_fixing_regression_with_new_users_emails.rb'
+ - 'db/post_migrate/20220530082653_add_traversal_id_type_group_index.rb'
+ - 'db/post_migrate/20220617123022_add_unique_index_on_projects_on_runners_token.rb'
+ - 'db/post_migrate/20220617123034_add_unique_index_on_projects_on_runners_token_encrypted.rb'
+ - 'db/post_migrate/20220628111752_drop_token_index_from_ci_builds.rb'
+ - 'db/post_migrate/20220630085003_drop_project_successfull_pages_deploy_index_from_ci_builds.rb'
+ - 'db/post_migrate/20220719081542_drop_queued_at_index_from_ci_builds.rb'
+ - 'db/post_migrate/20220720090354_remove_pending_builds_covering_index_from_ci_builds.rb'
+ - 'db/post_migrate/20220804235614_add_comment_to_vulnerability_state_transitions.rb'
+ - 'db/post_migrate/20220822090656_drop_build_coverage_regex_from_project.rb'
+ - 'db/post_migrate/20220830061704_orphaned_invited_members_cleanup.rb'
+ - 'db/post_migrate/20220901071355_cleanup_attention_request_user_callouts.rb'
+ - 'db/post_migrate/20220902204048_move_security_findings_table_to_gitlab_partitions_dynamic_schema.rb'
+ - 'db/post_migrate/20220919023208_drop_unused_fields_from_merge_request_assignees.rb'
+ - 'db/post_migrate/20220919080303_delete_migrate_shared_vulnerability_scanners.rb'
+ - 'db/post_migrate/20220920135356_tiebreak_user_type_index.rb'
+ - 'db/post_migrate/20221006172302_adjust_task_note_rename_background_migration_values.rb'
+ - 'db/post_migrate/20221013154159_update_invalid_dormant_user_setting.rb'
+ - 'db/post_migrate/20221018232820_add_temp_index_for_user_details_fields.rb'
+ - 'db/post_migrate/20221102231131_remove_temp_index_for_user_details_fields.rb'
+ - 'db/post_migrate/20221115184525_remove_namespaces_tmp_project_id_column.rb'
+ - 'db/post_migrate/20221220131020_bump_default_partition_id_value_for_ci_tables.rb'
+ - 'db/post_migrate/20221221150123_update_billable_users_index.rb'
+ - 'db/post_migrate/20230104103748_remove_new_amount_used_column.rb'
+ - 'db/post_migrate/20230105180002_remove_new_amount_used_column_on_ci_namespace_monthly_usages.rb'
+ - 'db/post_migrate/20230110172751_add_partial_index_on_group_path_id.rb'
+ - 'db/post_migrate/20230117114739_clear_duplicate_jobs_cookies.rb'
+ - 'db/post_migrate/20230123095023_add_scan_result_policy_id_to_software_license_policies.rb'
+ - 'db/post_migrate/20230131184319_update_billable_users_index_for_service_accounts.rb'
+ - 'db/post_migrate/20230201082038_drop_web_hook_calls_high_column.rb'
+ - 'db/post_migrate/20230303154314_add_user_type_migration_indexes.rb'
+ - 'db/post_migrate/20230310111859_recreate_user_type_migration_indexes.rb'
+ - 'db/post_migrate/20230313150531_reschedule_migration_for_remediation.rb'
+ - 'db/post_migrate/20230314094215_drop_u2f_registrations_table.rb'
+ - 'db/post_migrate/20230322151635_cleanup_bigint_conversion_for_merge_request_metrics.rb'
+ - 'db/post_migrate/20230405200858_requeue_backfill_project_wiki_repositories.rb'
+ - 'db/post_migrate/20230420120431_create_namespaces_by_top_level_namespace_index.rb'
+ - 'db/post_migrate/20230427194552_drop_cycle_analytics_unused_tables.rb'
+ - 'db/post_migrate/20230502134532_drop_clusters_applications_cilium.rb'
+ - 'db/post_migrate/20230502193525_drop_clusters_applications_helm.rb'
+ - 'db/post_migrate/20230502201251_drop_clusters_applications_ingress.rb'
+ - 'db/post_migrate/20230508150219_reschedule_evidences_handling_unicode.rb'
+ - 'db/post_migrate/20230516123202_create_routing_table_for_ci_builds.rb'
+ - 'db/post_migrate/20230522111534_reschedule_migration_for_links_from_metadata.rb'
+ - 'db/post_migrate/20230528203340_drop_message_from_vulnerability_occurrences.rb'
+ - 'db/post_migrate/20230530015535_swap_notes_id_to_bigint_for_gitlab_dot_com.rb'
+ - 'db/post_migrate/20230607165718_drop_project_wiki_repository_states.rb'
+ - 'db/post_migrate/20230614182049_add_index_to_namespaces_organization_id.rb'
+ - 'db/post_migrate/20230619005223_change_unconfirmed_created_at_index_on_users.rb'
+ - 'db/post_migrate/20230711093010_drop_default_partition_id_value_for_ci_tables.rb'
+ - 'db/post_migrate/20230724123547_cleanup_conversion_big_int_ci_build_needs_self_managed.rb'
+ - 'db/post_migrate/20230724150939_index_projects_on_namespace_id_and_repository_size_limit.rb'
+ - 'db/post_migrate/20230728151058_add_auditor_index_to_users_table.rb'
+ - 'db/post_migrate/20230823145126_swap_notes_id_to_bigint_for_self_managed.rb'
+ - 'db/post_migrate/20230908033511_swap_columns_for_ci_pipeline_chat_data_pipeline_id_bigint.rb'
+ - 'db/post_migrate/20230913130629_index_org_id_on_projects.rb'
+ - 'db/post_migrate/20230924134453_cleanup_uuid_type_migration_on_vulnerability_occurrences.rb'
+ - 'db/post_migrate/20231003045342_migrate_sidekiq_namespaced_jobs.rb'
+ - 'db/post_migrate/20231003142534_add_build_timeout_index.rb'
+ - 'db/post_migrate/20231005131445_add_work_items_related_link_restrictions.rb'
+ - 'db/post_migrate/20231009105056_index_users_on_email_domain_and_id.rb'
+ - 'db/post_migrate/20231017064317_swap_columns_for_ci_pipeline_variables_pipeline_id_bigint.rb'
+ - 'db/post_migrate/20231017172156_add_index_on_projects_for_adjourned_deletion.rb'
+ - 'db/post_migrate/20231018083247_remove_users_email_opted_in_columns.rb'
+ - 'db/post_migrate/20231019003052_swap_columns_for_ci_pipelines_pipeline_id_bigint_v2.rb'
+ - 'db/post_migrate/20231019084731_swap_columns_for_ci_stages_pipeline_id_bigint_v2.rb'
+ - 'db/post_migrate/20231024025629_cleanup_ci_pipeline_chat_data_pipeline_id_bigint.rb'
+ - 'ee/app/controllers/admin/application_settings/scim_oauth_controller.rb'
+ - 'ee/app/controllers/admin/emails_controller.rb'
+ - 'ee/app/controllers/admin/namespace_limits_controller.rb'
+ - 'ee/app/controllers/admin/push_rules_controller.rb'
+ - 'ee/app/controllers/concerns/credentials_inventory_actions.rb'
+ - 'ee/app/controllers/concerns/iteration_cadences_actions.rb'
+ - 'ee/app/controllers/concerns/microsoft_application_actions.rb'
+ - 'ee/app/controllers/ee/admin/application_controller.rb'
+ - 'ee/app/controllers/ee/admin/application_settings_controller.rb'
+ - 'ee/app/controllers/ee/admin/dashboard_controller.rb'
+ - 'ee/app/controllers/ee/admin/groups_controller.rb'
+ - 'ee/app/controllers/ee/admin/users_controller.rb'
+ - 'ee/app/controllers/ee/application_controller.rb'
+ - 'ee/app/controllers/ee/dashboard/projects_controller.rb'
+ - 'ee/app/controllers/ee/groups/group_members_controller.rb'
+ - 'ee/app/controllers/ee/groups/settings/ci_cd_controller.rb'
+ - 'ee/app/controllers/ee/groups/settings/repository_controller.rb'
+ - 'ee/app/controllers/ee/projects/deploy_tokens_controller.rb'
+ - 'ee/app/controllers/ee/projects/merge_requests/application_controller.rb'
+ - 'ee/app/controllers/ee/projects/security/configuration_controller.rb'
+ - 'ee/app/controllers/ee/projects/settings/ci_cd_controller.rb'
+ - 'ee/app/controllers/ee/projects/settings/repository_controller.rb'
+ - 'ee/app/controllers/ee/projects_controller.rb'
+ - 'ee/app/controllers/ee/repositories/git_http_client_controller.rb'
+ - 'ee/app/controllers/ee/repositories/git_http_controller.rb'
+ - 'ee/app/controllers/ee/search_controller.rb'
+ - 'ee/app/controllers/ee/sessions_controller.rb'
+ - 'ee/app/controllers/ee/users_controller.rb'
+ - 'ee/app/controllers/groups/analytics/dashboards_controller.rb'
+ - 'ee/app/controllers/groups/analytics/productivity_analytics_controller.rb'
+ - 'ee/app/controllers/groups/epics/notes_controller.rb'
+ - 'ee/app/controllers/groups/epics_controller.rb'
+ - 'ee/app/controllers/groups/ldap_group_links_controller.rb'
+ - 'ee/app/controllers/groups/ldaps_controller.rb'
+ - 'ee/app/controllers/groups/scim_oauth_controller.rb'
+ - 'ee/app/controllers/groups/todos_controller.rb'
+ - 'ee/app/controllers/oauth/geo_auth_controller.rb'
+ - 'ee/app/controllers/projects/approver_groups_controller.rb'
+ - 'ee/app/controllers/projects/approvers_controller.rb'
+ - 'ee/app/controllers/projects/path_locks_controller.rb'
+ - 'ee/app/controllers/projects/quality/test_cases_controller.rb'
+ - 'ee/app/controllers/registrations/welcome_controller.rb'
+ - 'ee/app/controllers/sitemap_controller.rb'
+ - 'ee/app/finders/approval_rules/group_finder.rb'
+ - 'ee/app/finders/autocomplete/group_subgroups_finder.rb'
+ - 'ee/app/finders/autocomplete/project_invited_groups_finder.rb'
+ - 'ee/app/finders/autocomplete/vulnerabilities_autocomplete_finder.rb'
+ - 'ee/app/finders/boards/milestones_finder.rb'
+ - 'ee/app/finders/boards/users_finder.rb'
+ - 'ee/app/finders/concerns/ee/finder_with_group_hierarchy.rb'
+ - 'ee/app/finders/concerns/epics/findable.rb'
+ - 'ee/app/finders/concerns/epics/with_access_check.rb'
+ - 'ee/app/finders/dast/profiles_finder.rb'
+ - 'ee/app/finders/dast_site_validations_finder.rb'
+ - 'ee/app/finders/ee/fork_targets_finder.rb'
+ - 'ee/app/finders/ee/group_members_finder.rb'
+ - 'ee/app/finders/ee/issuables/label_filter.rb'
+ - 'ee/app/finders/ee/issues_finder.rb'
+ - 'ee/app/finders/ee/merge_requests_finder.rb'
+ - 'ee/app/finders/ee/notes_finder.rb'
+ - 'ee/app/finders/epics/with_issues_finder.rb'
+ - 'ee/app/finders/geo/framework_registry_finder.rb'
+ - 'ee/app/finders/geo/registry_finder.rb'
+ - 'ee/app/finders/gitlab_subscriptions/add_on_eligible_users_finder.rb'
+ - 'ee/app/finders/group_saml_identity_finder.rb'
+ - 'ee/app/finders/groups_with_templates_finder.rb'
+ - 'ee/app/finders/iterations_finder.rb'
+ - 'ee/app/finders/licenses_finder.rb'
+ - 'ee/app/finders/merge_requests/by_approvers_finder.rb'
+ - 'ee/app/finders/namespaces/billed_users_finder.rb'
+ - 'ee/app/finders/namespaces/free_user_cap/users_finder.rb'
+ - 'ee/app/finders/okrs/checkin_reminder_key_result_finder.rb'
+ - 'ee/app/finders/productivity_analytics_finder.rb'
+ - 'ee/app/finders/projects/integrations/jira/by_ids_finder.rb'
+ - 'ee/app/finders/projects/integrations/jira/issues_finder.rb'
+ - 'ee/app/finders/security/approval_groups_finder.rb'
+ - 'ee/app/finders/security/findings_finder.rb'
+ - 'ee/app/finders/security/pure_findings_finder.rb'
+ - 'ee/app/finders/security/scan_policy_base_finder.rb'
+ - 'ee/app/finders/status_page/incident_comments_finder.rb'
+ - 'ee/app/finders/status_page/incidents_finder.rb'
+ - 'ee/app/graphql/ee/types/issue_connection_type.rb'
+ - 'ee/app/graphql/ee/types/merge_request_type.rb'
+ - 'ee/app/graphql/ee/types/repository/code_owner_error_type.rb'
+ - 'ee/app/graphql/ee/types/repository/code_owner_validation_type.rb'
+ - 'ee/app/graphql/mutations/ci/namespace_ci_cd_settings_update.rb'
+ - 'ee/app/graphql/mutations/dast_on_demand_scans/create.rb'
+ - 'ee/app/graphql/mutations/geo/registries/update.rb'
+ - 'ee/app/graphql/mutations/iterations/update.rb'
+ - 'ee/app/graphql/mutations/projects/set_locked.rb'
+ - 'ee/app/graphql/mutations/requirements_management/export_requirements.rb'
+ - 'ee/app/graphql/resolvers/analytics/contribution_analytics/contributions_resolver.rb'
+ - 'ee/app/graphql/resolvers/board_groupings/epics_resolver.rb'
+ - 'ee/app/graphql/resolvers/ci/runners_jobs_statistics_resolver.rb'
+ - 'ee/app/graphql/resolvers/iterations_resolver.rb'
+ - 'ee/app/graphql/resolvers/requirements_management/requirements_resolver.rb'
+ - 'ee/app/graphql/resolvers/vulnerabilities_base_resolver.rb'
+ - 'ee/app/graphql/types/admin/cloud_licenses/current_license_type.rb'
+ - 'ee/app/graphql/types/admin/cloud_licenses/license_history_entry_type.rb'
+ - 'ee/app/graphql/types/admin/cloud_licenses/subscription_future_entry_type.rb'
+ - 'ee/app/graphql/types/ai/message_extras_type.rb'
+ - 'ee/app/graphql/types/ai/message_type.rb'
+ - 'ee/app/graphql/types/ai/project_conversations_type.rb'
+ - 'ee/app/graphql/types/ai/prompt/ai_prompt_type.rb'
+ - 'ee/app/graphql/types/ai/prompt/explain_vulnerability_prompt_type.rb'
+ - 'ee/app/graphql/types/ai/prompt/explain_vulnerability_prompt_type/presubmission_check_results_type.rb'
+ - 'ee/app/graphql/types/analytics/contribution_analytics/contribution_metadata_type.rb'
+ - 'ee/app/graphql/types/analytics/devops_adoption/enabled_namespace_type.rb'
+ - 'ee/app/graphql/types/analytics/devops_adoption/snapshot_type.rb'
+ - 'ee/app/graphql/types/analytics/value_stream_dashboard/count_type.rb'
+ - 'ee/app/graphql/types/app_sec/fuzzing/api/ci_configuration_type.rb'
+ - 'ee/app/graphql/types/app_sec/fuzzing/api/scan_profile_type.rb'
+ - 'ee/app/graphql/types/applied_ml/suggested_reviewers_type.rb'
+ - 'ee/app/graphql/types/boards/board_epic_type.rb'
+ - 'ee/app/graphql/types/boards/epic_list_metadata_type.rb'
+ - 'ee/app/graphql/types/boards/epic_list_type.rb'
+ - 'ee/app/graphql/types/boards/epic_user_preferences_type.rb'
+ - 'ee/app/graphql/types/branch_protections/unprotect_access_level_type.rb'
+ - 'ee/app/graphql/types/burnup_chart_daily_totals_type.rb'
+ - 'ee/app/graphql/types/ci/code_coverage_activity_type.rb'
+ - 'ee/app/graphql/types/ci/code_coverage_summary_type.rb'
+ - 'ee/app/graphql/types/ci/code_quality_degradation_type.rb'
+ - 'ee/app/graphql/types/ci/jobs_duration_statistics_type.rb'
+ - 'ee/app/graphql/types/ci/jobs_statistics_type.rb'
+ - 'ee/app/graphql/types/ci/minutes/namespace_monthly_usage_type.rb'
+ - 'ee/app/graphql/types/ci/minutes/project_monthly_usage_type.rb'
+ - 'ee/app/graphql/types/ci/queueing_history_time_series_type.rb'
+ - 'ee/app/graphql/types/dast/profile_cadence_type.rb'
+ - 'ee/app/graphql/types/deployments/approval_summary_type.rb'
+ - 'ee/app/graphql/types/deployments/approval_type.rb'
+ - 'ee/app/graphql/types/dora/performance_score_connection_type.rb'
+ - 'ee/app/graphql/types/dora/performance_score_count_type.rb'
+ - 'ee/app/graphql/types/dora_metric_type.rb'
+ - 'ee/app/graphql/types/dora_type.rb'
+ - 'ee/app/graphql/types/epic_descendant_count_type.rb'
+ - 'ee/app/graphql/types/epic_descendant_weight_sum_type.rb'
+ - 'ee/app/graphql/types/epic_health_status_type.rb'
+ - 'ee/app/graphql/types/epic_issue_type.rb'
+ - 'ee/app/graphql/types/external_issue_type.rb'
+ - 'ee/app/graphql/types/forecasting/datapoint_type.rb'
+ - 'ee/app/graphql/types/forecasting/forecast_type.rb'
+ - 'ee/app/graphql/types/geo/registry_class_enum.rb'
+ - 'ee/app/graphql/types/gitlab_subscriptions/preview_billable_user_change_type.rb'
+ - 'ee/app/graphql/types/incident_management/escalation_rule_input_type.rb'
+ - 'ee/app/graphql/types/incident_management/escalation_rule_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_participant_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_rotation_active_period_input_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_rotation_active_period_type.rb'
+ - 'ee/app/graphql/types/incident_management/oncall_shift_type.rb'
+ - 'ee/app/graphql/types/member_roles/customizable_permission_type.rb'
+ - 'ee/app/graphql/types/namespaces/namespace_ban_type.rb'
+ - 'ee/app/graphql/types/network_policy_type.rb'
+ - 'ee/app/graphql/types/path_lock_type.rb'
+ - 'ee/app/graphql/types/product_analytics/category_enum.rb'
+ - 'ee/app/graphql/types/product_analytics/panel_type.rb'
+ - 'ee/app/graphql/types/product_analytics/state_enum.rb'
+ - 'ee/app/graphql/types/product_analytics/visualization_type.rb'
+ - 'ee/app/graphql/types/protected_environment_type.rb'
+ - 'ee/app/graphql/types/protected_environments/approval_rule_for_summary_type.rb'
+ - 'ee/app/graphql/types/protected_environments/approval_rule_type.rb'
+ - 'ee/app/graphql/types/protected_environments/authorizable_type.rb'
+ - 'ee/app/graphql/types/protected_environments/deploy_access_level_type.rb'
+ - 'ee/app/graphql/types/requirements_management/requirement_states_count_type.rb'
+ - 'ee/app/graphql/types/sbom/license_type.rb'
+ - 'ee/app/graphql/types/sbom/location_type.rb'
+ - 'ee/app/graphql/types/scan_type.rb'
+ - 'ee/app/graphql/types/scanned_resource_type.rb'
+ - 'ee/app/graphql/types/security/training_type.rb'
+ - 'ee/app/graphql/types/security_orchestration/approval_group_type.rb'
+ - 'ee/app/graphql/types/security_orchestration/group_security_policy_source_type.rb'
+ - 'ee/app/graphql/types/security_orchestration/project_security_policy_source_type.rb'
+ - 'ee/app/graphql/types/security_orchestration/scan_execution_policy_type.rb'
+ - 'ee/app/graphql/types/security_orchestration/scan_result_policy_type.rb'
+ - 'ee/app/graphql/types/security_policy_validation_error.rb'
+ - 'ee/app/graphql/types/security_report_summary_section_type.rb'
+ - 'ee/app/graphql/types/security_report_summary_type.rb'
+ - 'ee/app/graphql/types/security_scanners.rb'
+ - 'ee/app/graphql/types/time_report_stats_type.rb'
+ - 'ee/app/graphql/types/timebox_error_type.rb'
+ - 'ee/app/graphql/types/timebox_metrics_type.rb'
+ - 'ee/app/graphql/types/timebox_report_type.rb'
+ - 'ee/app/graphql/types/vulnerabilities/asset_type.rb'
+ - 'ee/app/graphql/types/vulnerabilities/container_image_type.rb'
+ - 'ee/app/graphql/types/vulnerabilities/link_type.rb'
+ - 'ee/app/graphql/types/vulnerabilities/remediation_type.rb'
+ - 'ee/app/graphql/types/vulnerabilities_count_by_day_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/base_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/boolean_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/code_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/commit_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/diff_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/file_location_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/int_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/list_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/markdown_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/module_location_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/named_list_item_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/named_list_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/row_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/table_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/text_type.rb'
+ - 'ee/app/graphql/types/vulnerability_details/url_type.rb'
+ - 'ee/app/graphql/types/vulnerability_evidence_source_type.rb'
+ - 'ee/app/graphql/types/vulnerability_evidence_supporting_message_type.rb'
+ - 'ee/app/graphql/types/vulnerability_evidence_type.rb'
+ - 'ee/app/graphql/types/vulnerability_identifier_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/cluster_image_scanning_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/container_scanning_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/coverage_fuzzing_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/dast_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/dependency_scanning_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/generic_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/sast_type.rb'
+ - 'ee/app/graphql/types/vulnerability_location/secret_detection_type.rb'
+ - 'ee/app/graphql/types/vulnerability_request_response_header_type.rb'
+ - 'ee/app/graphql/types/vulnerability_request_type.rb'
+ - 'ee/app/graphql/types/vulnerability_response_type.rb'
+ - 'ee/app/graphql/types/vulnerability_severities_count_type.rb'
+ - 'ee/app/graphql/types/vulnerable_dependency_type.rb'
+ - 'ee/app/graphql/types/vulnerable_kubernetes_resource_type.rb'
+ - 'ee/app/graphql/types/vulnerable_package_type.rb'
+ - 'ee/app/graphql/types/work_items/widgets/health_status_type.rb'
+ - 'ee/app/graphql/types/work_items/widgets/iteration_type.rb'
+ - 'ee/app/graphql/types/work_items/widgets/progress_type.rb'
+ - 'ee/app/graphql/types/work_items/widgets/requirement_legacy_type.rb'
+ - 'ee/app/graphql/types/work_items/widgets/status_type.rb'
+ - 'ee/app/graphql/types/work_items/widgets/test_reports_type.rb'
+ - 'ee/app/graphql/types/work_items/widgets/weight_type.rb'
+ - 'ee/app/helpers/admin/application_settings_helper.rb'
+ - 'ee/app/helpers/ee/application_helper.rb'
+ - 'ee/app/helpers/ee/boards_helper.rb'
+ - 'ee/app/helpers/ee/gitlab_routing_helper.rb'
+ - 'ee/app/helpers/ee/kerberos_helper.rb'
+ - 'ee/app/helpers/projects/on_demand_scans_helper.rb'
+ - 'ee/app/helpers/push_rules_helper.rb'
+ - 'ee/app/models/ai/ai_resource/concerns/noteable.rb'
+ - 'ee/app/models/ai/ai_resource/epic.rb'
+ - 'ee/app/models/ai/ai_resource/issue.rb'
+ - 'ee/app/models/ai/job_failure_analysis.rb'
+ - 'ee/app/models/approval_project_rules_user.rb'
+ - 'ee/app/models/approver.rb'
+ - 'ee/app/models/approver_group.rb'
+ - 'ee/app/models/ci/finished_build_ch_sync_event.rb'
+ - 'ee/app/models/ci/minutes/namespace_monthly_usage.rb'
+ - 'ee/app/models/concerns/elastic/application_versioned_search.rb'
+ - 'ee/app/models/concerns/epics/metadata_cache_update.rb'
+ - 'ee/app/models/concerns/geo/blob_replicator_strategy.rb'
+ - 'ee/app/models/dast/branch.rb'
+ - 'ee/app/models/ee/analytics/cycle_analytics/issue_stage_event.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'ee/app/models/ee/group.rb'
+ - 'ee/app/models/ee/member.rb'
+ - 'ee/app/models/ee/merge_request.rb'
+ - 'ee/app/models/ee/namespace.rb'
+ - 'ee/app/models/ee/namespace_setting.rb'
+ - 'ee/app/models/ee/project.rb'
+ - 'ee/app/models/ee/project_group_link.rb'
+ - 'ee/app/models/ee/project_member.rb'
+ - 'ee/app/models/ee/user.rb'
+ - 'ee/app/models/ee/vulnerability.rb'
+ - 'ee/app/models/elastic/migration_record.rb'
+ - 'ee/app/models/elasticsearch_indexed_namespace.rb'
+ - 'ee/app/models/elasticsearch_indexed_project.rb'
+ - 'ee/app/models/geo/container_repository_registry.rb'
+ - 'ee/app/models/geo/event_log.rb'
+ - 'ee/app/models/geo/upload_registry.rb'
+ - 'ee/app/models/geo_node.rb'
+ - 'ee/app/models/geo_node_status.rb'
+ - 'ee/app/models/incident_management/oncall_rotation.rb'
+ - 'ee/app/models/iteration.rb'
+ - 'ee/app/models/license.rb'
+ - 'ee/app/models/members/member_role.rb'
+ - 'ee/app/models/merge_request/diff_llm_summary.rb'
+ - 'ee/app/models/merge_request/predictions.rb'
+ - 'ee/app/models/merge_request/review_llm_summary.rb'
+ - 'ee/app/models/merge_requests/compliance_violation.rb'
+ - 'ee/app/models/merge_trains/car.rb'
+ - 'ee/app/models/package_metadata/package.rb'
+ - 'ee/app/models/project_security_setting.rb'
+ - 'ee/app/models/protected_environments/approval_rules/summarizable.rb'
+ - 'ee/app/models/protected_environments/authorizable.rb'
+ - 'ee/app/models/requirements_management/requirement.rb'
+ - 'ee/app/models/sbom/occurrence.rb'
+ - 'ee/app/models/search/namespace_index_assignment.rb'
+ - 'ee/app/models/security/training.rb'
+ - 'ee/app/models/vulnerabilities/finding.rb'
+ - 'ee/app/policies/merge_request/diff_llm_summary_policy.rb'
+ - 'ee/app/policies/merge_request/review_llm_summary_policy.rb'
+ - 'ee/app/policies/merge_request_diff_policy.rb'
+ - 'ee/app/policies/path_lock_policy.rb'
+ - 'ee/app/replicators/geo/container_repository_replicator.rb'
+ - 'ee/app/serializers/dashboard_environments_serializer.rb'
+ - 'ee/app/serializers/ee/discussion_serializer.rb'
+ - 'ee/app/serializers/epic_ai_entity.rb'
+ - 'ee/app/services/analytics/cycle_analytics/consistency_check_service.rb'
+ - 'ee/app/services/analytics/cycle_analytics/data_loader_service.rb'
+ - 'ee/app/services/analytics/devops_adoption/enabled_namespaces/find_or_create_service.rb'
+ - 'ee/app/services/analytics/value_stream_dashboard/top_level_group_counter_service.rb'
+ - 'ee/app/services/app_sec/dast/pre_scan_verification_steps/find_or_create_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profile_secret_variables/create_or_update_service.rb'
+ - 'ee/app/services/app_sec/dast/site_profiles/update_service.rb'
+ - 'ee/app/services/app_sec/dast/site_tokens/find_or_create_service.rb'
+ - 'ee/app/services/app_sec/dast/sites/find_or_create_service.rb'
+ - 'ee/app/services/approval_rules/params_filtering_service.rb'
+ - 'ee/app/services/billable_members/destroy_service.rb'
+ - 'ee/app/services/ci/minutes/additional_packs/base_service.rb'
+ - 'ee/app/services/ci/minutes/additional_packs/create_service.rb'
+ - 'ee/app/services/ci/minutes/refresh_cached_data_service.rb'
+ - 'ee/app/services/ci/minutes/reset_usage_service.rb'
+ - 'ee/app/services/ci/minutes/update_project_and_namespace_usage_service.rb'
+ - 'ee/app/services/ci/runners/stale_group_runners_prune_service.rb'
+ - 'ee/app/services/click_house/data_ingestion/ci_finished_builds_sync_service.rb'
+ - 'ee/app/services/compliance_management/violations/export_service.rb'
+ - 'ee/app/services/dependencies/export_serializers/group_dependencies_service.rb'
+ - 'ee/app/services/deployments/approval_service.rb'
+ - 'ee/app/services/dora/aggregate_scores_service.rb'
+ - 'ee/app/services/ee/audit_event_service.rb'
+ - 'ee/app/services/ee/audit_events/build_service.rb'
+ - 'ee/app/services/ee/auth/container_registry_authentication_service.rb'
+ - 'ee/app/services/ee/boards/base_service.rb'
+ - 'ee/app/services/ee/boards/issues/list_service.rb'
+ - 'ee/app/services/ee/boards/lists/create_service.rb'
+ - 'ee/app/services/ee/ci/queue/build_queue_service.rb'
+ - 'ee/app/services/ee/groups/autocomplete_service.rb'
+ - 'ee/app/services/ee/groups/destroy_service.rb'
+ - 'ee/app/services/ee/groups/update_service.rb'
+ - 'ee/app/services/ee/issuable_base_service.rb'
+ - 'ee/app/services/ee/keys/create_service.rb'
+ - 'ee/app/services/ee/labels/promote_service.rb'
+ - 'ee/app/services/ee/lfs/unlock_file_service.rb'
+ - 'ee/app/services/ee/members/create_service.rb'
+ - 'ee/app/services/ee/members/creator_service.rb'
+ - 'ee/app/services/ee/merge_requests/merge_base_service.rb'
+ - 'ee/app/services/ee/merge_requests/refresh_service.rb'
+ - 'ee/app/services/ee/milestones/promote_service.rb'
+ - 'ee/app/services/ee/notification_recipients/builder/base.rb'
+ - 'ee/app/services/ee/projects/create_from_template_service.rb'
+ - 'ee/app/services/ee/projects/create_service.rb'
+ - 'ee/app/services/ee/projects/destroy_service.rb'
+ - 'ee/app/services/ee/projects/fork_service.rb'
+ - 'ee/app/services/ee/protected_branches/legacy_api_update_service.rb'
+ - 'ee/app/services/ee/quick_actions/interpret_service.rb'
+ - 'ee/app/services/ee/quick_actions/target_service.rb'
+ - 'ee/app/services/ee/resource_events/synthetic_iteration_notes_builder_service.rb'
+ - 'ee/app/services/ee/resource_events/synthetic_weight_notes_builder_service.rb'
+ - 'ee/app/services/ee/search/global_service.rb'
+ - 'ee/app/services/ee/search_service.rb'
+ - 'ee/app/services/ee/system_note_service.rb'
+ - 'ee/app/services/ee/users/build_service.rb'
+ - 'ee/app/services/ee/users/destroy_service.rb'
+ - 'ee/app/services/ee/users/update_service.rb'
+ - 'ee/app/services/elastic/index_projects_by_range_service.rb'
+ - 'ee/app/services/elastic/indexing_control_service.rb'
+ - 'ee/app/services/elastic/process_bookkeeping_service.rb'
+ - 'ee/app/services/epic_issues/create_service.rb'
+ - 'ee/app/services/epics/strategies/base_dates_strategy.rb'
+ - 'ee/app/services/epics/strategies/due_date_inherited_strategy.rb'
+ - 'ee/app/services/epics/strategies/start_date_inherited_strategy.rb'
+ - 'ee/app/services/epics/transfer_service.rb'
+ - 'ee/app/services/epics/update_dates_service.rb'
+ - 'ee/app/services/epics/update_service.rb'
+ - 'ee/app/services/geo/container_repository_sync_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/add_on_purchases/self_managed/provision_code_suggestions_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/add_on_purchases/update_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/notify_seats_exceeded_batch_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/preview_billable_user_change_service.rb'
+ - 'ee/app/services/gitlab_subscriptions/trials/apply_trial_service.rb'
+ - 'ee/app/services/incident_management/escalation_rules/destroy_service.rb'
+ - 'ee/app/services/incident_management/pending_escalations/create_service.rb'
+ - 'ee/app/services/incident_management/pending_escalations/process_service.rb'
+ - 'ee/app/services/iterations/cadences/create_iterations_in_advance_service.rb'
+ - 'ee/app/services/iterations/roll_over_issues_service.rb'
+ - 'ee/app/services/members/activate_service.rb'
+ - 'ee/app/services/members/await_service.rb'
+ - 'ee/app/services/merge_requests/reset_approvals_service.rb'
+ - 'ee/app/services/package_metadata/advisory_data_object.rb'
+ - 'ee/app/services/protected_environments/base_service.rb'
+ - 'ee/app/services/protected_environments/search_service.rb'
+ - 'ee/app/services/resource_events/change_weight_service.rb'
+ - 'ee/app/services/security/ingestion/schedule_mark_dropped_as_resolved_service.rb'
+ - 'ee/app/services/security/ingestion/tasks/ingest_vulnerabilities/mark_resolved_as_detected.rb'
+ - 'ee/app/services/security/ingestion/tasks/ingest_vulnerability_flags.rb'
+ - 'ee/app/services/security/merge_request_security_report_generation_service.rb'
+ - 'ee/app/services/security/scan_result_policies/sync_any_merge_request_rules_service.rb'
+ - 'ee/app/services/security/scan_result_policies/update_approvals_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/fetch_policy_approvers_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/policy_branches_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/process_scan_result_policy_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/protected_branches_deletion_check_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/protected_branches_force_push_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/rule_schedule_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/update_violations_service.rb'
+ - 'ee/app/services/security/security_orchestration_policies/validate_policy_service.rb'
+ - 'ee/app/services/security/sync_license_scanning_rules_service.rb'
+ - 'ee/app/services/security/token_revocation_service.rb'
+ - 'ee/app/services/security/update_training_service.rb'
+ - 'ee/app/services/status_page/publish_base_service.rb'
+ - 'ee/app/services/timebox/event_aggregation_service.rb'
+ - 'ee/app/services/timebox/rollup_report_service.rb'
+ - 'ee/app/services/timebox_report_service.rb'
+ - 'ee/app/services/vulnerabilities/bulk_dismiss_service.rb'
+ - 'ee/app/services/vulnerabilities/create_service_base.rb'
+ - 'ee/app/services/vulnerabilities/manually_create_service.rb'
+ - 'ee/app/services/vulnerability_exports/export_service.rb'
+ - 'ee/app/services/work_items/widgets/iteration_service/base_service.rb'
+ - 'ee/app/validators/user_existence_validator.rb'
+ - 'ee/app/validators/user_id_existence_validator.rb'
+ - 'ee/app/workers/active_user_count_threshold_worker.rb'
+ - 'ee/app/workers/adjourned_group_deletion_worker.rb'
+ - 'ee/app/workers/adjourned_project_deletion_worker.rb'
+ - 'ee/app/workers/adjourned_projects_deletion_cron_worker.rb'
+ - 'ee/app/workers/admin_emails_worker.rb'
+ - 'ee/app/workers/analytics/cycle_analytics/consistency_worker.rb'
+ - 'ee/app/workers/analytics/cycle_analytics/incremental_worker.rb'
+ - 'ee/app/workers/analytics/cycle_analytics/reaggregation_worker.rb'
+ - 'ee/app/workers/analytics/devops_adoption/create_all_snapshots_worker.rb'
+ - 'ee/app/workers/analytics/devops_adoption/create_snapshot_worker.rb'
+ - 'ee/app/workers/analytics/value_stream_dashboard/count_worker.rb'
+ - 'ee/app/workers/arkose/blocked_users_report_worker.rb'
+ - 'ee/app/workers/audit_events/user_impersonation_event_create_worker.rb'
+ - 'ee/app/workers/ci/minutes/update_project_and_namespace_usage_worker.rb'
+ - 'ee/app/workers/ci/runners/stale_group_runners_prune_cron_worker.rb'
+ - 'ee/app/workers/ci/sync_reports_to_report_approval_rules_worker.rb'
+ - 'ee/app/workers/ci/trigger_downstream_subscriptions_worker.rb'
+ - 'ee/app/workers/ci/upstream_projects_subscriptions_cleanup_worker.rb'
+ - 'ee/app/workers/compliance_management/chain_of_custody_report_worker.rb'
+ - 'ee/app/workers/compliance_management/merge_requests/compliance_violations_consistency_worker.rb'
+ - 'ee/app/workers/compliance_management/timeout_pending_status_check_responses_worker.rb'
+ - 'ee/app/workers/concerns/elastic/bulk_cron_worker.rb'
+ - 'ee/app/workers/concerns/elastic/indexing_control.rb'
+ - 'ee/app/workers/concerns/geo/base_registry_sync_worker.rb'
+ - 'ee/app/workers/create_github_webhook_worker.rb'
+ - 'ee/app/workers/ee/issuable_export_csv_worker.rb'
+ - 'ee/app/workers/ee/post_receive.rb'
+ - 'ee/app/workers/elastic/migration_worker.rb'
+ - 'ee/app/workers/elastic/namespace_update_worker.rb'
+ - 'ee/app/workers/elastic/project_transfer_worker.rb'
+ - 'ee/app/workers/elastic_association_indexer_worker.rb'
+ - 'ee/app/workers/elastic_cluster_reindexing_cron_worker.rb'
+ - 'ee/app/workers/elastic_full_index_worker.rb'
+ - 'ee/app/workers/elastic_index_bulk_cron_worker.rb'
+ - 'ee/app/workers/elastic_index_initial_bulk_cron_worker.rb'
+ - 'ee/app/workers/elastic_namespace_indexer_worker.rb'
+ - 'ee/app/workers/elastic_namespace_rollout_worker.rb'
+ - 'ee/app/workers/emails/abandoned_trial_emails_cron_worker.rb'
+ - 'ee/app/workers/epics/new_epic_issue_worker.rb'
+ - 'ee/app/workers/epics/update_epics_dates_worker.rb'
+ - 'ee/app/workers/geo/batch/project_registry_scheduler_worker.rb'
+ - 'ee/app/workers/geo/batch/project_registry_worker.rb'
+ - 'ee/app/workers/geo/bulk_mark_pending_batch_worker.rb'
+ - 'ee/app/workers/geo/bulk_mark_verification_pending_batch_worker.rb'
+ - 'ee/app/workers/geo/container_repository_sync_worker.rb'
+ - 'ee/app/workers/geo/event_worker.rb'
+ - 'ee/app/workers/geo/file_removal_worker.rb'
+ - 'ee/app/workers/geo/hashed_storage_attachments_migration_worker.rb'
+ - 'ee/app/workers/geo/hashed_storage_migration_worker.rb'
+ - 'ee/app/workers/geo/metrics_update_worker.rb'
+ - 'ee/app/workers/geo/prune_event_log_worker.rb'
+ - 'ee/app/workers/geo/rename_repository_worker.rb'
+ - 'ee/app/workers/geo/repositories_clean_up_worker.rb'
+ - 'ee/app/workers/geo/repository_cleanup_worker.rb'
+ - 'ee/app/workers/geo/repository_shard_sync_worker.rb'
+ - 'ee/app/workers/geo/repository_sync_worker.rb'
+ - 'ee/app/workers/geo/repository_verification/primary/batch_worker.rb'
+ - 'ee/app/workers/geo/repository_verification/primary/shard_worker.rb'
+ - 'ee/app/workers/geo/repository_verification/primary/single_worker.rb'
+ - 'ee/app/workers/geo/repository_verification/secondary/scheduler_worker.rb'
+ - 'ee/app/workers/geo/repository_verification/secondary/shard_worker.rb'
+ - 'ee/app/workers/geo/repository_verification/secondary/single_worker.rb'
+ - 'ee/app/workers/geo/scheduler/per_shard_scheduler_worker.rb'
+ - 'ee/app/workers/geo/scheduler/primary/per_shard_scheduler_worker.rb'
+ - 'ee/app/workers/geo/scheduler/primary/scheduler_worker.rb'
+ - 'ee/app/workers/geo/scheduler/scheduler_worker.rb'
+ - 'ee/app/workers/geo/scheduler/secondary/per_shard_scheduler_worker.rb'
+ - 'ee/app/workers/geo/scheduler/secondary/scheduler_worker.rb'
+ - 'ee/app/workers/geo/secondary/registry_consistency_worker.rb'
+ - 'ee/app/workers/geo/secondary_usage_data_cron_worker.rb'
+ - 'ee/app/workers/geo/sidekiq_cron_config_worker.rb'
+ - 'ee/app/workers/geo/sync_timeout_cron_worker.rb'
+ - 'ee/app/workers/geo/verification_cron_worker.rb'
+ - 'ee/app/workers/geo/verification_state_backfill_worker.rb'
+ - 'ee/app/workers/geo_repository_destroy_worker.rb'
+ - 'ee/app/workers/gitlab_subscriptions/add_on_purchases/schedule_bulk_refresh_user_assignments_worker.rb'
+ - 'ee/app/workers/gitlab_subscriptions/notify_seats_exceeded_batch_worker.rb'
+ - 'ee/app/workers/gitlab_subscriptions/refresh_seats_worker.rb'
+ - 'ee/app/workers/gitlab_subscriptions/schedule_refresh_seats_worker.rb'
+ - 'ee/app/workers/group_wikis/git_garbage_collect_worker.rb'
+ - 'ee/app/workers/groups/enterprise_users/associate_worker.rb'
+ - 'ee/app/workers/groups/enterprise_users/bulk_associate_by_domain_worker.rb'
+ - 'ee/app/workers/groups/enterprise_users/disassociate_worker.rb'
+ - 'ee/app/workers/groups/export_memberships_worker.rb'
+ - 'ee/app/workers/groups/update_repository_storage_worker.rb'
+ - 'ee/app/workers/historical_data_worker.rb'
+ - 'ee/app/workers/import_software_licenses_worker.rb'
+ - 'ee/app/workers/incident_management/incident_sla_exceeded_check_worker.rb'
+ - 'ee/app/workers/incident_management/oncall_rotations/persist_all_rotations_shifts_job.rb'
+ - 'ee/app/workers/incident_management/pending_escalations/schedule_check_cron_worker.rb'
+ - 'ee/app/workers/ldap_all_groups_sync_worker.rb'
+ - 'ee/app/workers/ldap_group_sync_worker.rb'
+ - 'ee/app/workers/ldap_sync_worker.rb'
+ - 'ee/app/workers/licenses/reset_submit_license_usage_data_banner_worker.rb'
+ - 'ee/app/workers/llm/embedding/gitlab_documentation/cleanup_previous_versions_records_worker.rb'
+ - 'ee/app/workers/llm/embedding/gitlab_documentation/create_db_embeddings_per_doc_file_worker.rb'
+ - 'ee/app/workers/llm/embedding/gitlab_documentation/create_empty_embeddings_records_worker.rb'
+ - 'ee/app/workers/llm/embedding/gitlab_documentation/set_embeddings_on_the_record_worker.rb'
+ - 'ee/app/workers/llm/tanuki_bot/recreate_records_worker.rb'
+ - 'ee/app/workers/llm/tanuki_bot/remove_previous_records_worker.rb'
+ - 'ee/app/workers/members_destroyer/clean_up_group_protected_branch_rules_worker.rb'
+ - 'ee/app/workers/merge_request_reset_approvals_worker.rb'
+ - 'ee/app/workers/new_epic_worker.rb'
+ - 'ee/app/workers/okrs/checkin_reminder_emails_cron_worker.rb'
+ - 'ee/app/workers/open_ai/clear_conversations_worker.rb'
+ - 'ee/app/workers/package_metadata/advisories_sync_worker.rb'
+ - 'ee/app/workers/package_metadata/licenses_sync_worker.rb'
+ - 'ee/app/workers/package_metadata/sync_worker.rb'
+ - 'ee/app/workers/personal_access_tokens/instance/policy_worker.rb'
+ - 'ee/app/workers/product_analytics/initialize_snowplow_product_analytics_worker.rb'
+ - 'ee/app/workers/project_template_export_worker.rb'
+ - 'ee/app/workers/projects/disable_legacy_open_source_license_for_inactive_projects_worker.rb'
+ - 'ee/app/workers/pull_mirrors/reenable_configuration_worker.rb'
+ - 'ee/app/workers/refresh_license_compliance_checks_worker.rb'
+ - 'ee/app/workers/scan_security_report_secrets_worker.rb'
+ - 'ee/app/workers/search/index_curation_worker.rb'
+ - 'ee/app/workers/search/zoekt/namespace_indexer_worker.rb'
+ - 'ee/app/workers/security/create_orchestration_policy_worker.rb'
+ - 'ee/app/workers/security/orchestration_policy_rule_schedule_worker.rb'
+ - 'ee/app/workers/security/scan_execution_policies/rule_schedule_worker.rb'
+ - 'ee/app/workers/security/scan_result_policies/sync_any_merge_request_approval_rules_worker.rb'
+ - 'ee/app/workers/security/scan_result_policies/sync_findings_to_approval_rules_worker.rb'
+ - 'ee/app/workers/security/scans/purge_worker.rb'
+ - 'ee/app/workers/security/store_scans_worker.rb'
+ - 'ee/app/workers/security/track_secure_scans_worker.rb'
+ - 'ee/app/workers/set_user_status_based_on_user_cap_setting_worker.rb'
+ - 'ee/app/workers/store_security_reports_worker.rb'
+ - 'ee/app/workers/sync_seat_link_worker.rb'
+ - 'ee/app/workers/system_access/base_global_group_sync_worker.rb'
+ - 'ee/app/workers/system_access/base_saas_group_sync_worker.rb'
+ - 'ee/app/workers/todos_destroyer/confidential_epic_worker.rb'
+ - 'ee/app/workers/update_all_mirrors_worker.rb'
+ - 'ee/app/workers/users/unconfirmed_users_deletion_cron_worker.rb'
+ - 'ee/app/workers/vulnerabilities/historical_statistics/deletion_worker.rb'
+ - 'ee/app/workers/vulnerabilities/mark_dropped_as_resolved_worker.rb'
+ - 'ee/app/workers/vulnerabilities/orphaned_remediations_cleanup_worker.rb'
+ - 'ee/app/workers/vulnerabilities/statistics/adjustment_worker.rb'
+ - 'ee/app/workers/vulnerabilities/statistics/schedule_worker.rb'
+ - 'ee/config/routes/project.rb'
+ - 'ee/db/fixtures/development/31_devops_adoption.rb'
+ - 'ee/db/fixtures/development/92_dora_metrics.rb'
+ - 'ee/db/geo/migrate/20170206203234_create_project_registry.rb'
+ - 'ee/db/geo/migrate/20170223033541_create_file_registry.rb'
+ - 'ee/db/geo/migrate/20170614201943_add_last_wiki_synced_at_to_project_registry.rb'
+ - 'ee/db/geo/migrate/20171101105200_add_retry_count_fields_to_registries.rb'
+ - 'ee/db/geo/migrate/20171115143841_add_last_sync_failure_to_project_registry.rb'
+ - 'ee/db/geo/migrate/20180201154345_add_repository_verification_to_project_registry.rb'
+ - 'ee/db/geo/migrate/20180322062741_migrate_ci_job_artifacts_to_separate_registry.rb'
+ - 'ee/db/geo/migrate/20190612211021_add_container_repository_registry.rb'
+ - 'ee/db/geo/migrate/20190802200655_add_created_at_to_event_log_states.rb'
+ - 'ee/db/geo/migrate/20190923111102_add_design_registry.rb'
+ - 'ee/db/geo/migrate/20191007122326_add_unique_constraint_on_design_registry_project_id.rb'
+ - 'ee/db/geo/migrate/20200121194300_create_package_file_registry.rb'
+ - 'ee/db/geo/migrate/20200407120740_add_verification_fields_to_package_file_on_secondary.rb'
+ - 'ee/db/geo/migrate/20210325150435_create_pipeline_artifact_registry.rb'
+ - 'ee/db/geo/migrate/20210624160455_fix_state_column_in_lfs_object_registry.rb'
+ - 'ee/db/geo/migrate/20210818111211_fix_state_column_in_file_registry.rb'
+ - 'ee/db/geo/migrate/20211101113611_prepare_file_registry_for_verification.rb'
+ - 'ee/db/geo/migrate/20211119152539_add_verification_to_pages_deployment_registry.rb'
+ - 'ee/db/geo/migrate/20211124000000_add_verification_to_lfs_object_registry.rb'
+ - 'ee/db/geo/migrate/20220617125507_create_ci_secure_file_registry.rb'
+ - 'ee/db/geo/migrate/20230201110601_prepare_container_repository_registry_for_verification.rb'
+ - 'ee/db/geo/migrate/20230717195110_prepare_group_wiki_repository_registry_for_verification.rb'
+ - 'ee/db/geo/post_migrate/20210120225014_migrate_lfs_object_registry.rb'
+ - 'ee/db/geo/post_migrate/20231023230850_drop_project_registry.rb'
+ - 'ee/db/seeds/data_seeder/data_seeder.rb'
+ - 'ee/db/seeds/shared/dora_metrics.rb'
+ - 'ee/elastic/migrate/20230325200700_backfill_hashed_root_namespace_id_to_commits.rb'
+ - 'ee/elastic/migrate/20230405500000_backfill_wiki_permissions_in_main_index.rb'
+ - 'ee/elastic/migrate/20230518064300_backfill_project_permissions_in_blobs.rb'
+ - 'ee/elastic/migrate/20230519500012_reindex_wikis_to_fix_permissions_and_traversal_ids.rb'
+ - 'ee/elastic/migrate/20230702000000_backfill_existing_group_wiki.rb'
+ - 'ee/elastic/migrate/20230703112233_reindex_commits_to_fix_permissions.rb'
+ - 'ee/elastic/migrate/20230720000000_reindex_wikis_to_fix_routing.rb'
+ - 'ee/elastic/migrate/20230724070100_backfill_epics.rb'
+ - 'ee/elastic/migrate/20230724151612_backfill_archived_field_in_commits.rb'
+ - 'ee/elastic/migrate/20230724221548_remove_wikis_from_main_index.rb'
+ - 'ee/elastic/migrate/20230821123542_backfill_archived_field_in_blob.rb'
+ - 'ee/elastic/migrate/20230901120542_force_reindex_commits_from_main_index.rb'
+ - 'ee/elastic/migrate/20231019223356_reindex_wikis_to_fix_routing_and_backfill_archived.rb'
+ - 'ee/lib/analytics/devops_adoption/snapshot_calculator.rb'
+ - 'ee/lib/analytics/group_activity_calculator.rb'
+ - 'ee/lib/analytics/merge_request_metrics_calculator.rb'
+ - 'ee/lib/analytics/product_analytics/project_usage_data.rb'
+ - 'ee/lib/analytics/refresh_approvals_data.rb'
+ - 'ee/lib/analytics/refresh_reassign_data.rb'
+ - 'ee/lib/api/admin/search/migrations.rb'
+ - 'ee/lib/api/audit_events.rb'
+ - 'ee/lib/api/dora/metrics.rb'
+ - 'ee/lib/api/elasticsearch_indexed_namespaces.rb'
+ - 'ee/lib/api/entities/search/migration.rb'
+ - 'ee/lib/api/epic_issues.rb'
+ - 'ee/lib/api/helpers/epics_helpers.rb'
+ - 'ee/lib/api/ldap_group_links.rb'
+ - 'ee/lib/api/license.rb'
+ - 'ee/lib/api/saml_group_links.rb'
+ - 'ee/lib/audit/changes.rb'
+ - 'ee/lib/banzai/filter/references/iteration_reference_filter.rb'
+ - 'ee/lib/code_suggestions/instructions_extractor.rb'
+ - 'ee/lib/ee/api/entities/analytics/code_review/merge_request.rb'
+ - 'ee/lib/ee/api/entities/experiment.rb'
+ - 'ee/lib/ee/api/group_boards.rb'
+ - 'ee/lib/ee/api/group_milestones.rb'
+ - 'ee/lib/ee/api/groups.rb'
+ - 'ee/lib/ee/api/helpers.rb'
+ - 'ee/lib/ee/api/helpers/award_emoji.rb'
+ - 'ee/lib/ee/api/helpers/common_helpers.rb'
+ - 'ee/lib/ee/api/helpers/internal_helpers.rb'
+ - 'ee/lib/ee/api/helpers/members_helpers.rb'
+ - 'ee/lib/ee/api/internal/base.rb'
+ - 'ee/lib/ee/api/project_milestones.rb'
+ - 'ee/lib/ee/api/projects.rb'
+ - 'ee/lib/ee/api/settings.rb'
+ - 'ee/lib/ee/backup/repositories.rb'
+ - 'ee/lib/ee/banzai/filter/references/epic_reference_filter.rb'
+ - 'ee/lib/ee/banzai/reference_parser/epic_parser.rb'
+ - 'ee/lib/ee/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb'
+ - 'ee/lib/ee/gitlab/analytics/cycle_analytics/base_query_builder.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/access.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/group.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/group.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/groups.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/proxy.rb'
+ - 'ee/lib/ee/gitlab/auth/ldap/sync/users.rb'
+ - 'ee/lib/ee/gitlab/background_migration/backfill_dismissal_reason_in_vulnerability_reads.rb'
+ - 'ee/lib/ee/gitlab/background_migration/backfill_epic_cache_counts.rb'
+ - 'ee/lib/ee/gitlab/background_migration/backfill_missing_vulnerability_dismissal_details.rb'
+ - 'ee/lib/ee/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb'
+ - 'ee/lib/ee/gitlab/background_migration/backfill_project_statistics_storage_size_without_uploads_size.rb'
+ - 'ee/lib/ee/gitlab/background_migration/create_compliance_standards_adherence.rb'
+ - 'ee/lib/ee/gitlab/background_migration/create_vulnerability_links.rb'
+ - 'ee/lib/ee/gitlab/background_migration/delete_approval_rules_with_vulnerability.rb'
+ - 'ee/lib/ee/gitlab/background_migration/delete_invalid_epic_issues.rb'
+ - 'ee/lib/ee/gitlab/background_migration/fix_security_scan_statuses.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_shared_vulnerability_identifiers.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_shared_vulnerability_scanners.rb'
+ - 'ee/lib/ee/gitlab/background_migration/migrate_vulnerabilities_feedback_to_vulnerabilities_state_transition.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_denormalized_columns_for_sbom_occurrences.rb'
+ - 'ee/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids.rb'
+ - 'ee/lib/ee/gitlab/background_migration/purge_stale_security_scans.rb'
+ - 'ee/lib/ee/gitlab/ci/status/bridge/waiting_for_approval.rb'
+ - 'ee/lib/ee/gitlab/ci/status/build/waiting_for_approval.rb'
+ - 'ee/lib/ee/gitlab/exclusive_lease.rb'
+ - 'ee/lib/ee/gitlab/geo_git_access.rb'
+ - 'ee/lib/ee/gitlab/import_export/after_export_strategies/custom_template_export_import_strategy.rb'
+ - 'ee/lib/ee/gitlab/import_export/project/object_builder.rb'
+ - 'ee/lib/ee/gitlab/object_hierarchy.rb'
+ - 'ee/lib/ee/gitlab/quick_actions/users_extractor.rb'
+ - 'ee/lib/ee/gitlab/saas.rb'
+ - 'ee/lib/ee/gitlab/tracking.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/ee/users/internal.rb'
+ - 'ee/lib/elastic/instance_proxy_util.rb'
+ - 'ee/lib/elastic/latest/git_class_proxy.rb'
+ - 'ee/lib/elastic/latest/issue_class_proxy.rb'
+ - 'ee/lib/elastic/latest/merge_request_class_proxy.rb'
+ - 'ee/lib/elastic/latest/note_class_proxy.rb'
+ - 'ee/lib/elastic/latest/project_class_proxy.rb'
+ - 'ee/lib/elastic/latest/project_instance_proxy.rb'
+ - 'ee/lib/elastic/latest/user_class_proxy.rb'
+ - 'ee/lib/elastic/latest/user_config.rb'
+ - 'ee/lib/elastic/multi_version_util.rb'
+ - 'ee/lib/elastic/v12p1/application_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/application_instance_proxy.rb'
+ - 'ee/lib/elastic/v12p1/config.rb'
+ - 'ee/lib/elastic/v12p1/epic_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/epic_instance_proxy.rb'
+ - 'ee/lib/elastic/v12p1/issue_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/issue_instance_proxy.rb'
+ - 'ee/lib/elastic/v12p1/merge_request_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/merge_request_instance_proxy.rb'
+ - 'ee/lib/elastic/v12p1/milestone_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/milestone_instance_proxy.rb'
+ - 'ee/lib/elastic/v12p1/note_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/note_instance_proxy.rb'
+ - 'ee/lib/elastic/v12p1/project_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/project_instance_proxy.rb'
+ - 'ee/lib/elastic/v12p1/repository_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/repository_instance_proxy.rb'
+ - 'ee/lib/elastic/v12p1/routing.rb'
+ - 'ee/lib/elastic/v12p1/snippet_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/snippet_instance_proxy.rb'
+ - 'ee/lib/elastic/v12p1/user_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/user_instance_proxy.rb'
+ - 'ee/lib/elastic/v12p1/wiki_class_proxy.rb'
+ - 'ee/lib/elastic/v12p1/wiki_instance_proxy.rb'
+ - 'ee/lib/gem_extensions/elasticsearch/api/utils.rb'
+ - 'ee/lib/gem_extensions/elasticsearch/model/adapter/multiple/records.rb'
+ - 'ee/lib/gem_extensions/elasticsearch/model/indexing/instance_methods.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/aggregated/data_for_duration_chart.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/data_for_duration_chart.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/distinct_stage_loader.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/first_assigned_at.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/stage_events/label_based_stage_event.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/summary/base_time.rb'
+ - 'ee/lib/gitlab/analytics/type_of_work/tasks_by_type.rb'
+ - 'ee/lib/gitlab/analytics/value_stream_dashboard/namespace_cursor.rb'
+ - 'ee/lib/gitlab/applied_ml/suggested_reviewers/recommender_pb.rb'
+ - 'ee/lib/gitlab/auth/group_saml/identity_linker.rb'
+ - 'ee/lib/gitlab/auth/group_saml/membership_updater.rb'
+ - 'ee/lib/gitlab/auth/saml/membership_updater.rb'
+ - 'ee/lib/gitlab/ci/minutes/cached_quota.rb'
+ - 'ee/lib/gitlab/ci/minutes/pipeline_consumption.rb'
+ - 'ee/lib/gitlab/ci/reports/security/vulnerability_reports_comparer.rb'
+ - 'ee/lib/gitlab/circuit_breaker/store.rb'
+ - 'ee/lib/gitlab/code_owners/section_parser.rb'
+ - 'ee/lib/gitlab/com.rb'
+ - 'ee/lib/gitlab/compliance_management/violations/approved_by_committer.rb'
+ - 'ee/lib/gitlab/contribution_analytics/data_formatter.rb'
+ - 'ee/lib/gitlab/contribution_analytics/postgresql_data_collector.rb'
+ - 'ee/lib/gitlab/cube_js/data_transformer.rb'
+ - 'ee/lib/gitlab/elastic/bool_expr.rb'
+ - 'ee/lib/gitlab/elastic/elasticsearch_enabled_cache.rb'
+ - 'ee/lib/gitlab/elastic/group_search_results.rb'
+ - 'ee/lib/gitlab/elastic/helper.rb'
+ - 'ee/lib/gitlab/elastic/indexer.rb'
+ - 'ee/lib/gitlab/elastic/search_results.rb'
+ - 'ee/lib/gitlab/geo/event_gap_tracking.rb'
+ - 'ee/lib/gitlab/geo/geo_node_status_check.rb'
+ - 'ee/lib/gitlab/geo/log_cursor/daemon.rb'
+ - 'ee/lib/gitlab/geo/log_cursor/event_logs.rb'
+ - 'ee/lib/gitlab/geo/replication/blob_downloader.rb'
+ - 'ee/lib/gitlab/geo/replicator.rb'
+ - 'ee/lib/gitlab/graphql/loaders/oncall_participant_loader.rb'
+ - 'ee/lib/gitlab/group_plans_preloader.rb'
+ - 'ee/lib/gitlab/insights/executors/dora_executor.rb'
+ - 'ee/lib/gitlab/insights/executors/issuable_executor.rb'
+ - 'ee/lib/gitlab/insights/finders/issuable_finder.rb'
+ - 'ee/lib/gitlab/insights/reducers/count_per_period_reducer.rb'
+ - 'ee/lib/gitlab/llm/ai_message.rb'
+ - 'ee/lib/gitlab/llm/chain/tools/identifier.rb'
+ - 'ee/lib/gitlab/llm/chain/tools/json_reader/executor.rb'
+ - 'ee/lib/gitlab/llm/chain/tools/summarize_comments/executor.rb'
+ - 'ee/lib/gitlab/llm/chat_storage.rb'
+ - 'ee/lib/gitlab/llm/open_ai/client.rb'
+ - 'ee/lib/gitlab/llm/templates/explain_vulnerability.rb'
+ - 'ee/lib/gitlab/llm/vertex_ai/completions/summarize_merge_request.rb'
+ - 'ee/lib/gitlab/llm/vertex_ai/completions/summarize_submitted_review.rb'
+ - 'ee/lib/gitlab/middleware/ip_restrictor.rb'
+ - 'ee/lib/gitlab/path_locks_finder.rb'
+ - 'ee/lib/gitlab/root_excess_size_error_message.rb'
+ - 'ee/lib/gitlab/search/recent_epics.rb'
+ - 'ee/lib/gitlab/search/zoekt/client.rb'
+ - 'ee/lib/gitlab/spdx/license.rb'
+ - 'ee/lib/gitlab/status_page/storage/object.rb'
+ - 'ee/lib/gitlab/status_page/storage/s3_multipart_upload.rb'
+ - 'ee/lib/gitlab/usage/metrics/instrumentations/license_metric.rb'
+ - 'ee/lib/gitlab/vulnerability_scanning/advisory.rb'
+ - 'ee/lib/gitlab/vulnerability_scanning/security_scanner.rb'
+ - 'ee/lib/gitlab/zoekt/search_results.rb'
+ - 'ee/lib/product_analytics/settings.rb'
+ - 'ee/lib/quality/seeders/vulnerabilities.rb'
+ - 'ee/lib/remote_development/agent_config/updater.rb'
+ - 'ee/lib/remote_development/workspaces/reconcile/input/actual_state_calculator.rb'
+ - 'ee/lib/remote_development/workspaces/reconcile/output/desired_config_generator.rb'
+ - 'ee/lib/remote_development/workspaces/reconcile/output/desired_config_generator_prev1.rb'
+ - 'ee/lib/remote_development/workspaces/reconcile/output/devfile_parser.rb'
+ - 'ee/lib/remote_development/workspaces/reconcile/output/devfile_parser_prev1.rb'
+ - 'ee/lib/remote_development/workspaces/reconcile/persistence/workspaces_from_agent_infos_updater.rb'
+ - 'ee/lib/remote_development/workspaces/reconcile/persistence/workspaces_to_be_returned_finder.rb'
+ - 'ee/lib/remote_development/workspaces/reconcile/persistence/workspaces_to_be_returned_updater.rb'
+ - 'ee/lib/system_check/geo/authorized_keys_check.rb'
+ - 'ee/lib/system_check/geo/geo_database_configured_check.rb'
+ - 'ee/lib/tasks/geo.rake'
+ - 'ee/lib/tasks/gitlab/elastic.rake'
+ - 'ee/locale/unfound_translations.rb'
+ - 'ee/spec/controllers/concerns/gitlab_subscriptions/seat_count_alert_spec.rb'
+ - 'ee/spec/controllers/concerns/routable_actions_spec.rb'
+ - 'ee/spec/controllers/projects/settings/merge_requests_controller_spec.rb'
+ - 'ee/spec/elastic/migrate/20230503064300_backfill_project_permissions_in_blobs_using_permutations_spec.rb'
+ - 'ee/spec/factories/package_metadata/pm_licenses.rb'
+ - 'ee/spec/factories/security_scans.rb'
+ - 'ee/spec/features/dashboards/todos_spec.rb'
+ - 'ee/spec/features/dependency_proxy/packages/maven_spec.rb'
+ - 'ee/spec/features/groups/group_settings_spec.rb'
+ - 'ee/spec/features/groups/settings/domain_verification_spec.rb'
+ - 'ee/spec/features/merge_request/draft_comments_spec.rb'
+ - 'ee/spec/features/merge_trains/user_adds_to_merge_train_when_pipeline_succeeds_spec.rb'
+ - 'ee/spec/features/projects/mirror_spec.rb'
+ - 'ee/spec/features/registrations/combined_registration_spec.rb'
+ - 'ee/spec/features/registrations/saas/standard_flow_with_2fa_spec.rb'
+ - 'ee/spec/features/subscriptions/subscription_flow_for_existing_user_with_eligible_group_spec.rb'
+ - 'ee/spec/features/trials/lead_creation_form_validation_spec.rb'
+ - 'ee/spec/features/trials/saas/creation_with_multiple_existing_namespace_flow_spec.rb'
+ - 'ee/spec/features/trials/saas/creation_with_no_existing_namespace_flow_spec.rb'
+ - 'ee/spec/features/trials/saas/creation_with_one_existing_namespace_flow_spec.rb'
+ - 'ee/spec/finders/audit_event_finder_spec.rb'
+ - 'ee/spec/finders/ee/group_members_finder_spec.rb'
+ - 'ee/spec/frontend/fixtures/ci_catalog_resources.rb'
+ - 'ee/spec/helpers/analytics/analytics_dashboards_helper_spec.rb'
+ - 'ee/spec/helpers/ee/dashboard_helper_spec.rb'
+ - 'ee/spec/helpers/ee/releases_helper_spec.rb'
+ - 'ee/spec/helpers/groups/security_features_helper_spec.rb'
+ - 'ee/spec/helpers/projects/security/discover_helper_spec.rb'
+ - 'ee/spec/helpers/web_hooks/web_hooks_helper_spec.rb'
+ - 'ee/spec/initializers/fog_google_https_private_urls_spec.rb'
+ - 'ee/spec/lib/analytics/devops_adoption/snapshot_calculator_spec.rb'
+ - 'ee/spec/lib/audit/push_rules/group_push_rules_changes_auditor_spec.rb'
+ - 'ee/spec/lib/audit/push_rules/project_push_rules_changes_auditor_spec.rb'
+ - 'ee/spec/lib/audit_events/strategies/group_external_destination_strategy_spec.rb'
+ - 'ee/spec/lib/audit_events/strategies/instance_external_destination_strategy_spec.rb'
+ - 'ee/spec/lib/code_suggestions/instructions_extractor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/backfill_dismissal_reason_in_vulnerability_reads_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/backfill_epic_cache_counts_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/backfill_iteration_cadence_id_for_boards_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/backfill_missing_vulnerability_dismissal_details_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/backfill_project_statistics_container_repository_size_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/backfill_project_statistics_storage_size_without_uploads_size_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/delete_invalid_epic_issues_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/delete_orphaned_transferred_project_approval_rules_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/fix_namespace_ids_of_vulnerability_reads_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_in_batch_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_shared_vulnerability_identifiers_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_shared_vulnerability_scanners_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/migrate_vulnerabilities_feedback_to_vulnerabilities_state_transition_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/populate_denormalized_columns_for_sbom_occurrences_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/database/docs/docs_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/import_export/repo_restorer_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/issuable_metadata_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/pages/deployment_update_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/saas_spec.rb'
+ - 'ee/spec/lib/elastic/latest/project_instance_proxy_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/value_stream_dashboard/namespace_cursor_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/oidc/user_spec.rb'
+ - 'ee/spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'ee/spec/lib/gitlab/background_migration/create_vulnerability_links_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dependency_scanning_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/email/handler/create_note_handler_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/cron_manager_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/every_repository_type_replicated_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_helpers_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/group/relation_factory_spec.rb'
+ - 'ee/spec/lib/gitlab/import_export/project/relation_factory_spec.rb'
+ - 'ee/spec/lib/gitlab/llm/chain/agents/zero_shot/executor_real_requests_spec.rb'
+ - 'ee/spec/lib/gitlab/llm/chain/tools/epic_identifier/executor_spec.rb'
+ - 'ee/spec/lib/gitlab/llm/concerns/circuit_breaker_spec.rb'
+ - 'ee/spec/lib/gitlab/mirror_spec.rb'
+ - 'ee/spec/lib/gitlab/patch/database_config_spec.rb'
+ - 'ee/spec/lib/gitlab/sitemaps/sitemap_file_spec.rb'
+ - 'ee/spec/lib/gitlab/timebox/snapshot_builder_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_secure_pipelines_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_security_scans_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/count_user_merge_requests_for_projects_with_applied_scan_result_policies_metric_spec.rb'
+ - 'ee/spec/lib/gitlab/usage/metrics/instrumentations/protected_environment_approval_rules_required_approvals_average_metric_spec.rb'
+ - 'ee/spec/lib/remote_development/workspaces/create/creator_spec.rb'
+ - 'ee/spec/lib/remote_development/workspaces/create/personal_access_token_creator_spec.rb'
+ - 'ee/spec/lib/remote_development/workspaces/create/post_flatten_devfile_validator_spec.rb'
+ - 'ee/spec/lib/remote_development/workspaces/create/pre_flatten_devfile_validator_spec.rb'
+ - 'ee/spec/lib/remote_development/workspaces/create/workspace_creator_spec.rb'
+ - 'ee/spec/lib/remote_development/workspaces/create/workspace_variables_creator_spec.rb'
+ - 'ee/spec/lib/remote_development/workspaces/reconcile/input/factory_spec.rb'
+ - 'ee/spec/lib/remote_development/workspaces/reconcile/main_integration_spec.rb'
+ - 'ee/spec/lib/remote_development/workspaces/reconcile/main_reconcile_scenarios_spec.rb'
+ - 'ee/spec/lib/remote_development/workspaces/reconcile/persistence/workspaces_from_agent_infos_updater_spec.rb'
+ - 'ee/spec/lib/remote_development/workspaces/update/updater_spec.rb'
+ - 'ee/spec/mailers/emails/enterprise_users_spec.rb'
+ - 'ee/spec/mailers/emails/merge_requests_spec.rb'
+ - 'ee/spec/mailers/emails/okr_spec.rb'
+ - 'ee/spec/models/approval_project_rule_spec.rb'
+ - 'ee/spec/models/burndown_spec.rb'
+ - 'ee/spec/models/ci/pipeline_spec.rb'
+ - 'ee/spec/models/concerns/approval_rule_like_spec.rb'
+ - 'ee/spec/models/concerns/elastic/note_spec.rb'
+ - 'ee/spec/models/ee/ci/job_artifact_spec.rb'
+ - 'ee/spec/models/ee/ci/pipeline_artifact_spec.rb'
+ - 'ee/spec/models/ee/ci/secure_file_spec.rb'
+ - 'ee/spec/models/ee/groups/feature_setting_spec.rb'
+ - 'ee/spec/models/elasticsearch_indexed_namespace_spec.rb'
+ - 'ee/spec/models/factories_spec.rb'
+ - 'ee/spec/models/gitlab_subscription_spec.rb'
+ - 'ee/spec/models/license_spec.rb'
+ - 'ee/spec/models/members/member_role_spec.rb'
+ - 'ee/spec/models/package_metadata/affected_package_spec.rb'
+ - 'ee/spec/models/package_metadata/package_spec.rb'
+ - 'ee/spec/models/product_analytics/dashboard_spec.rb'
+ - 'ee/spec/models/security/training_spec.rb'
+ - 'ee/spec/models/upload_spec.rb'
+ - 'ee/spec/models/vulnerabilities/read_spec.rb'
+ - 'ee/spec/policies/group_policy_spec.rb'
+ - 'ee/spec/presenters/approval_rule_presenter_spec.rb'
+ - 'ee/spec/presenters/ee/project_presenter_spec.rb'
+ - 'ee/spec/presenters/ee/projects/import_export/project_export_presenter_spec.rb'
+ - 'ee/spec/presenters/member_presenter_spec.rb'
+ - 'ee/spec/requests/api/conan_project_packages_spec.rb'
+ - 'ee/spec/requests/api/debian_group_packages_spec.rb'
+ - 'ee/spec/requests/api/debian_project_packages_spec.rb'
+ - 'ee/spec/requests/api/geo_sites_spec.rb'
+ - 'ee/spec/requests/api/graphql/boards/board_lists_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/dora/dora_scores_spec.rb'
+ - 'ee/spec/requests/api/graphql/gitlab_subscriptions/user_add_on_assignments/create_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/geo/registries/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/merge_request_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/product_analytics/product_analytics_spec.rb'
+ - 'ee/spec/requests/api/group_service_accounts_spec.rb'
+ - 'ee/spec/requests/api/groups_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/api/pypi_packages_spec.rb'
+ - 'ee/spec/requests/api/vulnerability_findings_spec.rb'
+ - 'ee/spec/requests/git_http_geo_spec.rb'
+ - 'ee/spec/requests/groups/issues_controller_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/issue_link_entity_spec.rb'
+ - 'ee/spec/serializers/vulnerabilities/merge_request_link_entity_spec.rb'
+ - 'ee/spec/services/app_sec/fuzzing/api/ci_configuration_create_service_spec.rb'
+ - 'ee/spec/services/branches/delete_service_spec.rb'
+ - 'ee/spec/services/ee/branches/delete_service_spec.rb'
+ - 'ee/spec/services/ee/resource_events/change_iteration_service_spec.rb'
+ - 'ee/spec/services/geo/file_registry_removal_service_spec.rb'
+ - 'ee/spec/services/geo/framework_repository_sync_service_spec.rb'
+ - 'ee/spec/services/geo/registry_consistency_service_spec.rb'
+ - 'ee/spec/services/geo/registry_update_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/add_on_purchases/self_managed/provision_code_suggestions_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/preview_billable_user_change_service_spec.rb'
+ - 'ee/spec/services/merge_requests/update_blocks_service_spec.rb'
+ - 'ee/spec/services/package_metadata/sync_service_spec.rb'
+ - 'ee/spec/services/security/merge_reports_service_spec.rb'
+ - 'ee/spec/services/security/security_orchestration_policies/policy_branches_service_spec.rb'
+ - 'ee/spec/services/security/token_revocation_service_spec.rb'
+ - 'ee/spec/spec_helper.rb'
+ - 'ee/spec/support/matchers/locked_schema.rb'
+ - 'ee/spec/support/shared_contexts/graphql/geo/registries_shared_context.rb'
+ - 'ee/spec/support/shared_contexts/remote_development/remote_development_shared_contexts.rb'
+ - 'ee/spec/support/shared_contexts/saas_registration_settings_context.rb'
+ - 'ee/spec/support/shared_contexts/saas_trial_settings_context.rb'
+ - 'ee/spec/support/shared_contexts/user_contribution_events_shared_context.rb'
+ - 'ee/spec/support/shared_examples/auth/access_protocol_examples.rb'
+ - 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/finders/geo/framework_registry_finder_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/graphql/geo/geo_registries_resolver_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/linkable_items_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/protected_ref_access_examples.rb'
+ - 'ee/spec/support/shared_examples/models/concerns/replicator_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/elasticsearch_indexed_container_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_framework_registry_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_searchable_registry_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/models/geo_verifiable_registry_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/requests/api/graphql/geo/registries_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/services/boards/base_service_shared_examples.rb'
+ - 'ee/spec/support/shared_examples/workers/geo/framework_registry_sync_worker_shared_examples.rb'
+ - 'ee/spec/uploaders/every_gitlab_uploader_spec.rb'
+ - 'ee/spec/views/groups/group_members/index.html.haml_spec.rb'
+ - 'ee/spec/views/layouts/header/_new_dropdown.haml_spec.rb'
+ - 'ee/spec/views/projects/project_members/index.html.haml_spec.rb'
+ - 'ee/spec/views/shared/_tier_badge.html.haml_spec.rb'
+ - 'ee/spec/workers/audit_events/audit_event_streaming_worker_spec.rb'
+ - 'ee/spec/workers/ee/ci/build_finished_worker_spec.rb'
+ - 'ee/spec/workers/ee/new_issue_worker_spec.rb'
+ - 'ee/spec/workers/elastic_namespace_rollout_worker_spec.rb'
+ - 'ee/spec/workers/geo/repository_registry_sync_worker_spec.rb'
+ - 'ee/spec/workers/historical_data_worker_spec.rb'
+ - 'ee/spec/workers/ldap_all_groups_sync_worker_spec.rb'
+ - 'ee/spec/workers/ldap_group_sync_worker_spec.rb'
+ - 'ee/spec/workers/ldap_sync_worker_spec.rb'
+ - 'ee/spec/workers/new_epic_worker_spec.rb'
+ - 'ee/spec/workers/projects/register_suggested_reviewers_project_worker_spec.rb'
+ - 'ee/spec/workers/update_all_mirrors_worker_spec.rb'
+ - 'lib/api/access_requests.rb'
+ - 'lib/api/admin/plan_limits.rb'
+ - 'lib/api/admin/sidekiq.rb'
+ - 'lib/api/api.rb'
+ - 'lib/api/api_guard.rb'
+ - 'lib/api/appearance.rb'
+ - 'lib/api/base.rb'
+ - 'lib/api/boards.rb'
+ - 'lib/api/branches.rb'
+ - 'lib/api/ci/helpers/runner.rb'
+ - 'lib/api/ci/jobs.rb'
+ - 'lib/api/ci/pipeline_schedules.rb'
+ - 'lib/api/ci/resource_groups.rb'
+ - 'lib/api/ci/runners.rb'
+ - 'lib/api/ci/secure_files.rb'
+ - 'lib/api/ci/triggers.rb'
+ - 'lib/api/ci/variables.rb'
+ - 'lib/api/commit_statuses.rb'
+ - 'lib/api/custom_attributes_endpoints.rb'
+ - 'lib/api/dependency_proxy.rb'
+ - 'lib/api/deploy_keys.rb'
+ - 'lib/api/discussions.rb'
+ - 'lib/api/entities/basic_project_details.rb'
+ - 'lib/api/entities/ci/runner_details.rb'
+ - 'lib/api/entities/feature.rb'
+ - 'lib/api/entities/issuable_time_stats.rb'
+ - 'lib/api/entities/ml/mlflow/search_runs.rb'
+ - 'lib/api/entities/project.rb'
+ - 'lib/api/entities/project_integration.rb'
+ - 'lib/api/entities/project_with_access.rb'
+ - 'lib/api/entities/tag.rb'
+ - 'lib/api/entities/todo.rb'
+ - 'lib/api/features.rb'
+ - 'lib/api/group_boards.rb'
+ - 'lib/api/groups.rb'
+ - 'lib/api/helm_packages.rb'
+ - 'lib/api/helpers.rb'
+ - 'lib/api/helpers/award_emoji.rb'
+ - 'lib/api/helpers/custom_attributes.rb'
+ - 'lib/api/helpers/internal_helpers.rb'
+ - 'lib/api/helpers/members_helpers.rb'
+ - 'lib/api/helpers/notes_helpers.rb'
+ - 'lib/api/helpers/packages/conan/api_helpers.rb'
+ - 'lib/api/helpers/packages/dependency_proxy_helpers.rb'
+ - 'lib/api/helpers/project_snapshots_helpers.rb'
+ - 'lib/api/helpers/snippets_helpers.rb'
+ - 'lib/api/helpers/users_helpers.rb'
+ - 'lib/api/helpers/variables_helpers.rb'
+ - 'lib/api/hooks/test.rb'
+ - 'lib/api/hooks/url_variables.rb'
+ - 'lib/api/internal/base.rb'
+ - 'lib/api/internal/workhorse.rb'
+ - 'lib/api/issue_links.rb'
+ - 'lib/api/issues.rb'
+ - 'lib/api/members.rb'
+ - 'lib/api/merge_requests.rb'
+ - 'lib/api/metadata.rb'
+ - 'lib/api/namespaces.rb'
+ - 'lib/api/notes.rb'
+ - 'lib/api/nuget_project_packages.rb'
+ - 'lib/api/pages_domains.rb'
+ - 'lib/api/project_container_repositories.rb'
+ - 'lib/api/project_packages.rb'
+ - 'lib/api/project_snippets.rb'
+ - 'lib/api/projects.rb'
+ - 'lib/api/projects_relation_builder.rb'
+ - 'lib/api/protected_branches.rb'
+ - 'lib/api/protected_tags.rb'
+ - 'lib/api/resource_access_tokens.rb'
+ - 'lib/api/rubygem_packages.rb'
+ - 'lib/api/settings.rb'
+ - 'lib/api/sidekiq_metrics.rb'
+ - 'lib/api/snippet_repository_storage_moves.rb'
+ - 'lib/api/users.rb'
+ - 'lib/api/v3/github.rb'
+ - 'lib/atlassian/jira_connect/serializers/build_entity.rb'
+ - 'lib/backup/manager.rb'
+ - 'lib/banzai/filter/issuable_reference_expansion_filter.rb'
+ - 'lib/banzai/filter/references/external_issue_reference_filter.rb'
+ - 'lib/banzai/filter/references/label_reference_filter.rb'
+ - 'lib/banzai/filter/task_list_filter.rb'
+ - 'lib/banzai/object_renderer.rb'
+ - 'lib/banzai/pipeline/base_pipeline.rb'
+ - 'lib/banzai/renderer.rb'
+ - 'lib/bulk_imports/clients/http.rb'
+ - 'lib/bulk_imports/common/pipelines/entity_finisher.rb'
+ - 'lib/bulk_imports/common/pipelines/lfs_objects_pipeline.rb'
+ - 'lib/bulk_imports/file_downloads/filename_fetch.rb'
+ - 'lib/bulk_imports/groups/transformers/group_attributes_transformer.rb'
+ - 'lib/bulk_imports/pipeline/runner.rb'
+ - 'lib/bulk_imports/projects/pipelines/references_pipeline.rb'
+ - 'lib/bulk_imports/uniquify.rb'
+ - 'lib/click_house/models/base_model.rb'
+ - 'lib/click_house/query_builder.rb'
+ - 'lib/click_house/redactor.rb'
+ - 'lib/container_registry/path.rb'
+ - 'lib/container_registry/tag.rb'
+ - 'lib/declarative_enum.rb'
+ - 'lib/event_filter.rb'
+ - 'lib/extracts_path.rb'
+ - 'lib/extracts_ref.rb'
+ - 'lib/feature.rb'
+ - 'lib/file_size_validator.rb'
+ - 'lib/gem_extensions/active_record/association.rb'
+ - 'lib/gem_extensions/active_record/configurable_disable_joins.rb'
+ - 'lib/gem_extensions/active_record/delegate_cache.rb'
+ - 'lib/gem_extensions/active_record/disable_joins/associations/association_scope.rb'
+ - 'lib/gem_extensions/active_record/disable_joins/relation.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/aggregated/base_query_builder.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/aggregated/median.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/aggregated/records_fetcher.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/average.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/base_query_builder.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/median.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/records_fetcher.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/sorting.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events/code_stage_start.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events/issue_deployed_to_production.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events/issue_stage_end.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events/merge_request_first_deployed_to_production.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events/metrics_based_stage_event.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events/plan_stage_start.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_events/stage_event.rb'
+ - 'lib/gitlab/analytics/cycle_analytics/stage_query_helpers.rb'
+ - 'lib/gitlab/application_context.rb'
+ - 'lib/gitlab/application_rate_limiter.rb'
+ - 'lib/gitlab/application_rate_limiter/base_strategy.rb'
+ - 'lib/gitlab/audit/null_author.rb'
+ - 'lib/gitlab/audit/type/definition.rb'
+ - 'lib/gitlab/auth.rb'
+ - 'lib/gitlab/auth/activity.rb'
+ - 'lib/gitlab/auth/auth_finders.rb'
+ - 'lib/gitlab/auth/devise/strategies/combined_two_factor_authenticatable.rb'
+ - 'lib/gitlab/auth/ldap/dn.rb'
+ - 'lib/gitlab/auth/ldap/person.rb'
+ - 'lib/gitlab/auth/o_auth/user.rb'
+ - 'lib/gitlab/auth/omniauth_identity_linker_base.rb'
+ - 'lib/gitlab/avatar_cache.rb'
+ - 'lib/gitlab/background_migration.rb'
+ - 'lib/gitlab/background_migration/backfill_compliance_violations.rb'
+ - 'lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex.rb'
+ - 'lib/gitlab/background_migration/backfill_environment_tiers.rb'
+ - 'lib/gitlab/background_migration/backfill_epic_cache_counts.rb'
+ - 'lib/gitlab/background_migration/backfill_finding_id_in_vulnerabilities.rb'
+ - 'lib/gitlab/background_migration/backfill_imported_issue_search_data.rb'
+ - 'lib/gitlab/background_migration/backfill_issue_search_data.rb'
+ - 'lib/gitlab/background_migration/backfill_iteration_cadence_id_for_boards.rb'
+ - 'lib/gitlab/background_migration/backfill_missing_vulnerability_dismissal_details.rb'
+ - 'lib/gitlab/background_migration/backfill_nuget_normalized_version.rb'
+ - 'lib/gitlab/background_migration/backfill_partitioned_table.rb'
+ - 'lib/gitlab/background_migration/backfill_project_import_level.rb'
+ - 'lib/gitlab/background_migration/backfill_project_member_namespace_id.rb'
+ - 'lib/gitlab/background_migration/backfill_project_namespace_on_issues.rb'
+ - 'lib/gitlab/background_migration/backfill_project_repositories.rb'
+ - 'lib/gitlab/background_migration/backfill_project_statistics_container_repository_size.rb'
+ - 'lib/gitlab/background_migration/backfill_project_statistics_storage_size_with_recent_size.rb'
+ - 'lib/gitlab/background_migration/backfill_project_statistics_storage_size_without_pipeline_artifacts_size_job.rb'
+ - 'lib/gitlab/background_migration/backfill_project_statistics_storage_size_without_uploads_size.rb'
+ - 'lib/gitlab/background_migration/backfill_workspace_personal_access_token.rb'
+ - 'lib/gitlab/background_migration/batched_migration_job.rb'
+ - 'lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy.rb'
+ - 'lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy.rb'
+ - 'lib/gitlab/background_migration/batching_strategies/primary_key_batching_strategy.rb'
+ - 'lib/gitlab/background_migration/convert_credit_card_validation_data_to_hashes.rb'
+ - 'lib/gitlab/background_migration/create_compliance_standards_adherence.rb'
+ - 'lib/gitlab/background_migration/create_vulnerability_links.rb'
+ - 'lib/gitlab/background_migration/delete_approval_rules_with_vulnerability.rb'
+ - 'lib/gitlab/background_migration/delete_invalid_epic_issues.rb'
+ - 'lib/gitlab/background_migration/delete_orphans_approval_merge_request_rules2.rb'
+ - 'lib/gitlab/background_migration/delete_orphans_approval_project_rules2.rb'
+ - 'lib/gitlab/background_migration/destroy_invalid_group_members.rb'
+ - 'lib/gitlab/background_migration/destroy_invalid_members.rb'
+ - 'lib/gitlab/background_migration/destroy_invalid_project_members.rb'
+ - 'lib/gitlab/background_migration/fix_approval_project_rules_without_protected_branches.rb'
+ - 'lib/gitlab/background_migration/fix_first_mentioned_in_commit_at.rb'
+ - 'lib/gitlab/background_migration/fix_incoherent_packages_size_on_project_statistics.rb'
+ - 'lib/gitlab/background_migration/fix_namespace_ids_of_vulnerability_reads.rb'
+ - 'lib/gitlab/background_migration/fix_projects_without_prometheus_service.rb'
+ - 'lib/gitlab/background_migration/fix_vulnerability_reads_has_issues.rb'
+ - 'lib/gitlab/background_migration/job_coordinator.rb'
+ - 'lib/gitlab/background_migration/legacy_upload_mover.rb'
+ - 'lib/gitlab/background_migration/mailers/unconfirm_mailer.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress.rb'
+ - 'lib/gitlab/background_migration/migrate_approver_to_approval_rules_in_batch.rb'
+ - 'lib/gitlab/background_migration/migrate_job_artifact_registry_to_ssf.rb'
+ - 'lib/gitlab/background_migration/migrate_shared_vulnerability_identifiers.rb'
+ - 'lib/gitlab/background_migration/migrate_shared_vulnerability_scanners.rb'
+ - 'lib/gitlab/background_migration/migrate_vulnerabilities_feedback_to_vulnerabilities_state_transition.rb'
+ - 'lib/gitlab/background_migration/populate_approval_merge_request_rules_with_security_orchestration.rb'
+ - 'lib/gitlab/background_migration/populate_approval_project_rules_with_security_orchestration.rb'
+ - 'lib/gitlab/background_migration/populate_denormalized_columns_for_sbom_occurrences.rb'
+ - 'lib/gitlab/background_migration/populate_latest_pipeline_ids.rb'
+ - 'lib/gitlab/background_migration/populate_projects_star_count.rb'
+ - 'lib/gitlab/background_migration/populate_resolved_on_default_branch_column.rb'
+ - 'lib/gitlab/background_migration/populate_vulnerability_dismissal_fields.rb'
+ - 'lib/gitlab/background_migration/project_namespaces/backfill_project_namespaces.rb'
+ - 'lib/gitlab/background_migration/purge_stale_security_scans.rb'
+ - 'lib/gitlab/background_migration/re_expire_o_auth_tokens.rb'
+ - 'lib/gitlab/background_migration/recount_epic_cache_counts.rb'
+ - 'lib/gitlab/background_migration/redis/backfill_project_pipeline_status_ttl.rb'
+ - 'lib/gitlab/background_migration/remove_occurrence_pipelines_and_duplicate_vulnerabilities_findings.rb'
+ - 'lib/gitlab/background_migration/reset_status_on_container_repositories.rb'
+ - 'lib/gitlab/background_migration/reset_too_many_tags_skipped_registry_imports.rb'
+ - 'lib/gitlab/background_migration/second_recount_epic_cache_counts.rb'
+ - 'lib/gitlab/background_migration/third_recount_epic_cache_counts.rb'
+ - 'lib/gitlab/background_migration/truncate_overlong_vulnerability_html_titles.rb'
+ - 'lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb'
+ - 'lib/gitlab/background_migration/update_workspaces_config_version.rb'
+ - 'lib/gitlab/background_task.rb'
+ - 'lib/gitlab/base_doorkeeper_controller.rb'
+ - 'lib/gitlab/bitbucket_import/importer.rb'
+ - 'lib/gitlab/bitbucket_import/importers/issue_importer.rb'
+ - 'lib/gitlab/bitbucket_import/importers/issue_notes_importer.rb'
+ - 'lib/gitlab/bitbucket_server_import/importers/pull_request_notes_importer.rb'
+ - 'lib/gitlab/blob_helper.rb'
+ - 'lib/gitlab/buffered_io.rb'
+ - 'lib/gitlab/cache/ci/project_pipeline_status.rb'
+ - 'lib/gitlab/cache/import/caching.rb'
+ - 'lib/gitlab/cache/request_cache.rb'
+ - 'lib/gitlab/checks/branch_check.rb'
+ - 'lib/gitlab/checks/diff_check.rb'
+ - 'lib/gitlab/checks/matching_merge_request.rb'
+ - 'lib/gitlab/checks/tag_check.rb'
+ - 'lib/gitlab/ci/ansi2html.rb'
+ - 'lib/gitlab/ci/ansi2json/parser.rb'
+ - 'lib/gitlab/ci/badge/pipeline/status.rb'
+ - 'lib/gitlab/ci/build/artifacts/metadata/entry.rb'
+ - 'lib/gitlab/ci/charts.rb'
+ - 'lib/gitlab/ci/components/instance_path.rb'
+ - 'lib/gitlab/ci/config.rb'
+ - 'lib/gitlab/ci/config/entry/processable.rb'
+ - 'lib/gitlab/ci/config/entry/product/matrix.rb'
+ - 'lib/gitlab/ci/config/entry/root.rb'
+ - 'lib/gitlab/ci/config/extendable/entry.rb'
+ - 'lib/gitlab/ci/config/external/mapper/verifier.rb'
+ - 'lib/gitlab/ci/config/interpolation/access.rb'
+ - 'lib/gitlab/ci/config/normalizer/matrix_strategy.rb'
+ - 'lib/gitlab/ci/lint.rb'
+ - 'lib/gitlab/ci/pipeline/chain/command.rb'
+ - 'lib/gitlab/ci/pipeline/duration.rb'
+ - 'lib/gitlab/ci/reports/accessibility_reports.rb'
+ - 'lib/gitlab/ci/reports/security/finding.rb'
+ - 'lib/gitlab/ci/reports/security/identifier.rb'
+ - 'lib/gitlab/ci/reports/security/report.rb'
+ - 'lib/gitlab/ci/reports/test_report.rb'
+ - 'lib/gitlab/ci/reports/test_reports_comparer.rb'
+ - 'lib/gitlab/ci/reports/test_suite.rb'
+ - 'lib/gitlab/ci/reports/test_suite_comparer.rb'
+ - 'lib/gitlab/ci/reports/test_suite_summary.rb'
+ - 'lib/gitlab/ci/secure_files/migration_helper.rb'
+ - 'lib/gitlab/ci/status/composite.rb'
+ - 'lib/gitlab/ci/tags/bulk_insert.rb'
+ - 'lib/gitlab/ci/trace.rb'
+ - 'lib/gitlab/ci/trace/chunked_io.rb'
+ - 'lib/gitlab/ci/trace/stream.rb'
+ - 'lib/gitlab/cleanup/personal_access_tokens.rb'
+ - 'lib/gitlab/cleanup/project_uploads.rb'
+ - 'lib/gitlab/cleanup/remote_uploads.rb'
+ - 'lib/gitlab/cluster/lifecycle_events.rb'
+ - 'lib/gitlab/cluster/mixins/puma_cluster.rb'
+ - 'lib/gitlab/composer/cache.rb'
+ - 'lib/gitlab/config/entry/composable_array.rb'
+ - 'lib/gitlab/config/entry/composable_hash.rb'
+ - 'lib/gitlab/config/entry/configurable.rb'
+ - 'lib/gitlab/config/entry/validators.rb'
+ - 'lib/gitlab/config/entry/validators/nested_array_helpers.rb'
+ - 'lib/gitlab/console.rb'
+ - 'lib/gitlab/container_repository/tags/cache.rb'
+ - 'lib/gitlab/content_security_policy/config_loader.rb'
+ - 'lib/gitlab/contributions_calendar.rb'
+ - 'lib/gitlab/current_settings.rb'
+ - 'lib/gitlab/daemon.rb'
+ - 'lib/gitlab/data_builder/pipeline.rb'
+ - 'lib/gitlab/data_builder/push.rb'
+ - 'lib/gitlab/database.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration.rb'
+ - 'lib/gitlab/database/background_migration/batched_migration_wrapper.rb'
+ - 'lib/gitlab/database/background_migration_job.rb'
+ - 'lib/gitlab/database/batch_average_counter.rb'
+ - 'lib/gitlab/database/batch_counter.rb'
+ - 'lib/gitlab/database/consistency_checker.rb'
+ - 'lib/gitlab/database/gitlab_schema.rb'
+ - 'lib/gitlab/database/load_balancing/connection_proxy.rb'
+ - 'lib/gitlab/database/load_balancing/load_balancer.rb'
+ - 'lib/gitlab/database/load_balancing/service_discovery.rb'
+ - 'lib/gitlab/database/load_balancing/setup.rb'
+ - 'lib/gitlab/database/lock_writes_manager.rb'
+ - 'lib/gitlab/database/migration.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/migration_helpers/v2.rb'
+ - 'lib/gitlab/database/migrations/background_migration_helpers.rb'
+ - 'lib/gitlab/database/migrations/batched_background_migration_helpers.rb'
+ - 'lib/gitlab/database/migrations/milestone_mixin.rb'
+ - 'lib/gitlab/database/migrations/observation.rb'
+ - 'lib/gitlab/database/migrations/observers/query_log.rb'
+ - 'lib/gitlab/database/migrations/pg_backend_pid.rb'
+ - 'lib/gitlab/database/migrations/reestablished_connection_stack.rb'
+ - 'lib/gitlab/database/migrations/runner.rb'
+ - 'lib/gitlab/database/migrations/runner_backoff/migration_helpers.rb'
+ - 'lib/gitlab/database/migrations/sidekiq_helpers.rb'
+ - 'lib/gitlab/database/postgres_index.rb'
+ - 'lib/gitlab/database/postgresql_adapter/type_map_cache.rb'
+ - 'lib/gitlab/database/query_analyzers/base.rb'
+ - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
+ - 'lib/gitlab/database/query_analyzers/prevent_set_operator_mismatch/node.rb'
+ - 'lib/gitlab/database/reindexing/reindex_action.rb'
+ - 'lib/gitlab/database/schema_cache_with_renamed_table.rb'
+ - 'lib/gitlab/database/with_lock_retries.rb'
+ - 'lib/gitlab/database_importers/work_items/base_type_importer.rb'
+ - 'lib/gitlab/database_importers/work_items/related_links_restrictions_importer.rb'
+ - 'lib/gitlab/dependency_linker/go_mod_linker.rb'
+ - 'lib/gitlab/dependency_linker/go_sum_linker.rb'
+ - 'lib/gitlab/diff/file.rb'
+ - 'lib/gitlab/diff/file_collection/merge_request_diff_batch.rb'
+ - 'lib/gitlab/diff/file_collection/paginated_diffs.rb'
+ - 'lib/gitlab/diff/highlight_cache.rb'
+ - 'lib/gitlab/diff/line.rb'
+ - 'lib/gitlab/diff/line_mapper.rb'
+ - 'lib/gitlab/diff/pair_selector.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/discussions_diff/highlight_cache.rb'
+ - 'lib/gitlab/doctor/reset_tokens.rb'
+ - 'lib/gitlab/doctor/secrets.rb'
+ - 'lib/gitlab/email/handler/create_issue_handler.rb'
+ - 'lib/gitlab/email/handler/create_merge_request_handler.rb'
+ - 'lib/gitlab/email/handler/create_note_on_issuable_handler.rb'
+ - 'lib/gitlab/email/handler/reply_processing.rb'
+ - 'lib/gitlab/encoding_helper.rb'
+ - 'lib/gitlab/encrypted_command_base.rb'
+ - 'lib/gitlab/encrypted_incoming_email_command.rb'
+ - 'lib/gitlab/encrypted_ldap_command.rb'
+ - 'lib/gitlab/encrypted_service_desk_email_command.rb'
+ - 'lib/gitlab/encrypted_smtp_command.rb'
+ - 'lib/gitlab/error_tracking/processor/context_payload_processor.rb'
+ - 'lib/gitlab/error_tracking/processor/sanitizer_processor.rb'
+ - 'lib/gitlab/etag_caching/store.rb'
+ - 'lib/gitlab/exclusive_lease.rb'
+ - 'lib/gitlab/experiment/rollout/feature.rb'
+ - 'lib/gitlab/external_authorization/cache.rb'
+ - 'lib/gitlab/faraday/error_callback.rb'
+ - 'lib/gitlab/file_hook.rb'
+ - 'lib/gitlab/fips.rb'
+ - 'lib/gitlab/fogbugz_import/importer.rb'
+ - 'lib/gitlab/front_matter.rb'
+ - 'lib/gitlab/git/blob.rb'
+ - 'lib/gitlab/git/commit.rb'
+ - 'lib/gitlab/git/diff.rb'
+ - 'lib/gitlab/git/patches/collection.rb'
+ - 'lib/gitlab/git/repository.rb'
+ - 'lib/gitlab/git/rugged_impl/commit.rb'
+ - 'lib/gitlab/git/rugged_impl/repository.rb'
+ - 'lib/gitlab/git/rugged_impl/use_rugged.rb'
+ - 'lib/gitlab/git/tag.rb'
+ - 'lib/gitlab/git/tree.rb'
+ - 'lib/gitlab/git_audit_event.rb'
+ - 'lib/gitlab/gitaly_client.rb'
+ - 'lib/gitlab/gitaly_client/operation_service.rb'
+ - 'lib/gitlab/gitaly_client/ref_service.rb'
+ - 'lib/gitlab/gitaly_client/repository_service.rb'
+ - 'lib/gitlab/gitaly_client/storage_settings.rb'
+ - 'lib/gitlab/github_gists_import/importer/gists_importer.rb'
+ - 'lib/gitlab/github_import/bulk_importing.rb'
+ - 'lib/gitlab/github_import/client.rb'
+ - 'lib/gitlab/github_import/importer/diff_note_importer.rb'
+ - 'lib/gitlab/github_import/importer/issue_importer.rb'
+ - 'lib/gitlab/github_import/importer/labels_importer.rb'
+ - 'lib/gitlab/github_import/importer/milestones_importer.rb'
+ - 'lib/gitlab/github_import/importer/note_importer.rb'
+ - 'lib/gitlab/github_import/importer/pull_requests/review_importer.rb'
+ - 'lib/gitlab/github_import/importer/pull_requests/review_requests_importer.rb'
+ - 'lib/gitlab/github_import/importer/releases_importer.rb'
+ - 'lib/gitlab/github_import/importer/repository_importer.rb'
+ - 'lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer.rb'
+ - 'lib/gitlab/github_import/importer/single_endpoint_issue_events_importer.rb'
+ - 'lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer.rb'
+ - 'lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer.rb'
+ - 'lib/gitlab/github_import/label_finder.rb'
+ - 'lib/gitlab/github_import/markdown_text.rb'
+ - 'lib/gitlab/github_import/milestone_finder.rb'
+ - 'lib/gitlab/github_import/representation/pull_requests/review_requests.rb'
+ - 'lib/gitlab/github_import/user_finder.rb'
+ - 'lib/gitlab/gon_helper.rb'
+ - 'lib/gitlab/gpg/invalid_gpg_signature_updater.rb'
+ - 'lib/gitlab/graphql/authorize/authorize_resource.rb'
+ - 'lib/gitlab/graphql/batch_key.rb'
+ - 'lib/gitlab/graphql/deprecations/deprecation.rb'
+ - 'lib/gitlab/graphql/loaders/batch_commit_loader.rb'
+ - 'lib/gitlab/graphql/loaders/batch_model_loader.rb'
+ - 'lib/gitlab/graphql/loaders/lazy_relation_loader/registry.rb'
+ - 'lib/gitlab/graphql/loaders/lazy_relation_loader/relation_proxy.rb'
+ - 'lib/gitlab/graphql/loaders/lazy_relation_loader/top_n_loader.rb'
+ - 'lib/gitlab/graphql/pagination/keyset/connection.rb'
+ - 'lib/gitlab/graphql/present.rb'
+ - 'lib/gitlab/graphql/standard_graphql_error.rb'
+ - 'lib/gitlab/group_search_results.rb'
+ - 'lib/gitlab/health_checks/metric.rb'
+ - 'lib/gitlab/health_checks/probes/status.rb'
+ - 'lib/gitlab/health_checks/redis/redis_abstract_check.rb'
+ - 'lib/gitlab/health_checks/result.rb'
+ - 'lib/gitlab/http.rb'
+ - 'lib/gitlab/identifier.rb'
+ - 'lib/gitlab/import/database_helpers.rb'
+ - 'lib/gitlab/import/errors.rb'
+ - 'lib/gitlab/import/merge_request_helpers.rb'
+ - 'lib/gitlab/import_export/after_export_strategies/web_upload_strategy.rb'
+ - 'lib/gitlab/import_export/base/relation_object_saver.rb'
+ - 'lib/gitlab/import_export/command_line_util.rb'
+ - 'lib/gitlab/import_export/fast_hash_serializer.rb'
+ - 'lib/gitlab/import_export/group/relation_tree_restorer.rb'
+ - 'lib/gitlab/import_export/json/streaming_serializer.rb'
+ - 'lib/gitlab/import_export/members_mapper.rb'
+ - 'lib/gitlab/import_export/project/import_task.rb'
+ - 'lib/gitlab/import_export/project/relation_factory.rb'
+ - 'lib/gitlab/import_sources.rb'
+ - 'lib/gitlab/instrumentation/redis_cluster_validator.rb'
+ - 'lib/gitlab/instrumentation/redis_interceptor.rb'
+ - 'lib/gitlab/internal_events.rb'
+ - 'lib/gitlab/issuable/clone/copy_resource_events_service.rb'
+ - 'lib/gitlab/issues/rebalancing/state.rb'
+ - 'lib/gitlab/jira/http_client.rb'
+ - 'lib/gitlab/kas/user_access.rb'
+ - 'lib/gitlab/lazy.rb'
+ - 'lib/gitlab/legacy_github_import/base_formatter.rb'
+ - 'lib/gitlab/legacy_github_import/client.rb'
+ - 'lib/gitlab/legacy_github_import/importer.rb'
+ - 'lib/gitlab/legacy_github_import/issuable_formatter.rb'
+ - 'lib/gitlab/legacy_github_import/user_formatter.rb'
+ - 'lib/gitlab/legacy_http.rb'
+ - 'lib/gitlab/lets_encrypt/client.rb'
+ - 'lib/gitlab/lfs_token.rb'
+ - 'lib/gitlab/local_and_remote_storage_migration/base_migrater.rb'
+ - 'lib/gitlab/marginalia/comment.rb'
+ - 'lib/gitlab/markdown_cache/redis/store.rb'
+ - 'lib/gitlab/memory/diagnostic_reports_logger.rb'
+ - 'lib/gitlab/merge_requests/mergeability/redis_interface.rb'
+ - 'lib/gitlab/metrics/methods.rb'
+ - 'lib/gitlab/metrics/rack_middleware.rb'
+ - 'lib/gitlab/metrics/sli.rb'
+ - 'lib/gitlab/metrics/subscribers/action_cable.rb'
+ - 'lib/gitlab/metrics/subscribers/rack_attack.rb'
+ - 'lib/gitlab/middleware/basic_health_check.rb'
+ - 'lib/gitlab/middleware/release_env.rb'
+ - 'lib/gitlab/monitor/demo_projects.rb'
+ - 'lib/gitlab/nav/top_nav_menu_item.rb'
+ - 'lib/gitlab/object_hierarchy.rb'
+ - 'lib/gitlab/otp_key_rotator.rb'
+ - 'lib/gitlab/pagination/keyset/column_order_definition.rb'
+ - 'lib/gitlab/pagination/keyset/in_operator_optimization/query_builder.rb'
+ - 'lib/gitlab/pagination/keyset/iterator.rb'
+ - 'lib/gitlab/pagination/keyset/order.rb'
+ - 'lib/gitlab/pagination/keyset/pager.rb'
+ - 'lib/gitlab/pagination/keyset/paginator.rb'
+ - 'lib/gitlab/pagination/offset_pagination.rb'
+ - 'lib/gitlab/pagination_delegate.rb'
+ - 'lib/gitlab/patch/action_cable_subscription_adapter_identifier.rb'
+ - 'lib/gitlab/patch/node_loader.rb'
+ - 'lib/gitlab/patch/prependable.rb'
+ - 'lib/gitlab/patch/redis_cache_store.rb'
+ - 'lib/gitlab/patch/sidekiq_cron_poller.rb'
+ - 'lib/gitlab/patch/sidekiq_scheduled_enq.rb'
+ - 'lib/gitlab/performance_bar.rb'
+ - 'lib/gitlab/performance_bar/redis_adapter_when_peek_enabled.rb'
+ - 'lib/gitlab/popen/runner.rb'
+ - 'lib/gitlab/profiler.rb'
+ - 'lib/gitlab/project_search_results.rb'
+ - 'lib/gitlab/project_stats_refresh_conflicts_logger.rb'
+ - 'lib/gitlab/project_template.rb'
+ - 'lib/gitlab/prometheus_client.rb'
+ - 'lib/gitlab/quick_actions/issue_actions.rb'
+ - 'lib/gitlab/quick_actions/work_item_actions.rb'
+ - 'lib/gitlab/rack_attack.rb'
+ - 'lib/gitlab/rack_attack/request.rb'
+ - 'lib/gitlab/rack_attack/store.rb'
+ - 'lib/gitlab/redis/cross_slot.rb'
+ - 'lib/gitlab/redis/hll.rb'
+ - 'lib/gitlab/redis/multi_store.rb'
+ - 'lib/gitlab/redis/sidekiq_status.rb'
+ - 'lib/gitlab/reference_extractor.rb'
+ - 'lib/gitlab/relative_positioning/item_context.rb'
+ - 'lib/gitlab/repository_cache_adapter.rb'
+ - 'lib/gitlab/repository_hash_cache.rb'
+ - 'lib/gitlab/repository_set_cache.rb'
+ - 'lib/gitlab/request_forgery_protection.rb'
+ - 'lib/gitlab/runtime.rb'
+ - 'lib/gitlab/safe_device_detector.rb'
+ - 'lib/gitlab/sanitizers/exif.rb'
+ - 'lib/gitlab/search/params.rb'
+ - 'lib/gitlab/search/recent_items.rb'
+ - 'lib/gitlab/search/sort_options.rb'
+ - 'lib/gitlab/search_context.rb'
+ - 'lib/gitlab/search_results.rb'
+ - 'lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder.rb'
+ - 'lib/gitlab/seeders/ci/runner/runner_fleet_seeder.rb'
+ - 'lib/gitlab/set_cache.rb'
+ - 'lib/gitlab/setup_helper.rb'
+ - 'lib/gitlab/shard_health_cache.rb'
+ - 'lib/gitlab/sidekiq_config/cli_methods.rb'
+ - 'lib/gitlab/sidekiq_daemon/monitor.rb'
+ - 'lib/gitlab/sidekiq_middleware/duplicate_jobs/duplicate_job.rb'
+ - 'lib/gitlab/sidekiq_middleware/pause_control/pause_control_service.rb'
+ - 'lib/gitlab/sidekiq_status.rb'
+ - 'lib/gitlab/slash_commands/base_command.rb'
+ - 'lib/gitlab/slash_commands/deploy.rb'
+ - 'lib/gitlab/slash_commands/global_slack_handler.rb'
+ - 'lib/gitlab/slash_commands/issue_search.rb'
+ - 'lib/gitlab/slash_commands/presenters/run.rb'
+ - 'lib/gitlab/slash_commands/result.rb'
+ - 'lib/gitlab/snippet_search_results.rb'
+ - 'lib/gitlab/source.rb'
+ - 'lib/gitlab/sourcegraph.rb'
+ - 'lib/gitlab/task_helpers.rb'
+ - 'lib/gitlab/template_parser/ast.rb'
+ - 'lib/gitlab/terraform/state_migration_helper.rb'
+ - 'lib/gitlab/testing/action_cable_blocker.rb'
+ - 'lib/gitlab/testing/request_blocker_middleware.rb'
+ - 'lib/gitlab/testing/request_inspector_middleware.rb'
+ - 'lib/gitlab/testing/robots_blocker_middleware.rb'
+ - 'lib/gitlab/throttle.rb'
+ - 'lib/gitlab/tracking.rb'
+ - 'lib/gitlab/uploads/migration_helper.rb'
+ - 'lib/gitlab/url_blocker.rb'
+ - 'lib/gitlab/url_builder.rb'
+ - 'lib/gitlab/usage/metrics/instrumentations/count_imported_projects_metric.rb'
+ - 'lib/gitlab/usage/metrics/instrumentations/database_metric.rb'
+ - 'lib/gitlab/usage/metrics/instrumentations/numbers_metric.rb'
+ - 'lib/gitlab/usage/metrics/query.rb'
+ - 'lib/gitlab/usage_data.rb'
+ - 'lib/gitlab/usage_data_counters/merge_request_activity_unique_counter.rb'
+ - 'lib/gitlab/usage_data_counters/work_item_activity_unique_counter.rb'
+ - 'lib/gitlab/usage_data_queries.rb'
+ - 'lib/gitlab/utils/usage_data.rb'
+ - 'lib/gitlab/verify/batch_verifier.rb'
+ - 'lib/gitlab/verify/ci_secure_files.rb'
+ - 'lib/gitlab/verify/rake_task.rb'
+ - 'lib/gitlab/verify/uploads.rb'
+ - 'lib/gitlab/webpack/file_loader.rb'
+ - 'lib/gitlab/workhorse.rb'
+ - 'lib/gitlab/x509/signature.rb'
+ - 'lib/gitlab_edition.rb'
+ - 'lib/gitlab_settings/options.rb'
+ - 'lib/gitlab_settings/settings.rb'
+ - 'lib/kramdown/parser/atlassian_document_format.rb'
+ - 'lib/object_storage/pending_direct_upload.rb'
+ - 'lib/quality/seeders/issues.rb'
+ - 'lib/result.rb'
+ - 'lib/safe_zip/extract.rb'
+ - 'lib/sidebars/context.rb'
+ - 'lib/sidebars/menu_item.rb'
+ - 'lib/static_model.rb'
+ - 'lib/tasks/dev.rake'
+ - 'lib/tasks/gems.rake'
+ - 'lib/tasks/gitlab/cleanup.rake'
+ - 'lib/tasks/gitlab/db.rake'
+ - 'lib/tasks/gitlab/db/validate_config.rake'
+ - 'lib/tasks/gitlab/external_diffs.rake'
+ - 'lib/tasks/gitlab/graphql.rake'
+ - 'lib/tasks/gitlab/refresh_project_statistics_build_artifacts_size.rake'
+ - 'lib/tasks/gitlab/snippets.rake'
+ - 'lib/tasks/gitlab/usage_data.rake'
+ - 'lib/tasks/tokens.rake'
+ - 'lib/unnested_in_filters/dsl.rb'
+ - 'lib/uploaded_file.rb'
+ - 'lib/users/internal.rb'
+ - 'locale/unfound_translations.rb'
+ - 'metrics_server/dependencies.rb'
+ - 'metrics_server/metrics_server.rb'
+ - 'metrics_server/override_gitlab_current_settings.rb'
+ - 'metrics_server/override_rails_constants.rb'
+ - 'metrics_server/settings_overrides.rb'
+ - 'qa/chemlab-library-gitlab.gemspec'
+ - 'qa/qa/ee/page/admin/subscription.rb'
+ - 'qa/qa/ee/page/component/secure_report.rb'
+ - 'qa/qa/ee/page/file/show.rb'
+ - 'qa/qa/ee/page/main/banner.rb'
+ - 'qa/qa/ee/page/project/monitor/on_call_schedule/index.rb'
+ - 'qa/qa/ee/page/project/settings/merge_request.rb'
+ - 'qa/qa/ee/page/workspace/action.rb'
+ - 'qa/qa/ee/page/workspace/list.rb'
+ - 'qa/qa/page/admin/applications.rb'
+ - 'qa/qa/page/component/access_tokens.rb'
+ - 'qa/qa/page/component/ci_icon.rb'
+ - 'qa/qa/page/component/issuable/sidebar.rb'
+ - 'qa/qa/page/component/new_snippet.rb'
+ - 'qa/qa/page/component/visibility_setting.rb'
+ - 'qa/qa/page/component/web_ide/web_terminal_panel.rb'
+ - 'qa/qa/page/file/show.rb'
+ - 'qa/qa/page/layout/banner.rb'
+ - 'qa/qa/page/merge_request/show.rb'
+ - 'qa/qa/page/project/activity.rb'
+ - 'qa/qa/page/project/issue/index.rb'
+ - 'qa/qa/page/project/secure/configuration_form.rb'
+ - 'qa/qa/page/project/settings/branch_rules_details.rb'
+ - 'qa/qa/page/project/settings/integrations.rb'
+ - 'qa/qa/page/project/settings/mirroring_repositories.rb'
+ - 'qa/qa/page/project/settings/runners.rb'
+ - 'qa/qa/page/project/settings/services/jenkins.rb'
+ - 'qa/qa/page/project/settings/services/jira.rb'
+ - 'qa/qa/page/project/settings/services/pipeline_status_emails.rb'
+ - 'qa/qa/page/search/results.rb'
+ - 'qa/qa/page/sub_menus/super_sidebar/global_search_modal.rb'
+ - 'qa/qa/resource/api_fabricator.rb'
+ - 'qa/qa/resource/base.rb'
+ - 'qa/qa/resource/ci_cd_settings.rb'
+ - 'qa/qa/resource/graphql.rb'
+ - 'qa/qa/resource/registry_repository.rb'
+ - 'qa/qa/resource/runner_base.rb'
+ - 'qa/qa/runtime/api/client.rb'
+ - 'qa/qa/runtime/browser.rb'
+ - 'qa/qa/runtime/env.rb'
+ - 'qa/qa/runtime/ip_address.rb'
+ - 'qa/qa/runtime/namespace.rb'
+ - 'qa/qa/scenario/bootable.rb'
+ - 'qa/qa/scenario/test/integration/ldap_no_tls.rb'
+ - 'qa/qa/scenario/test/integration/ldap_tls.rb'
+ - 'qa/qa/scenario/test/integration/registry_with_cdn.rb'
+ - 'qa/qa/service/docker_run/gitlab_runner.rb'
+ - 'qa/qa/service/shellout.rb'
+ - 'qa/qa/specs/features/api/1_manage/import/import_large_github_repo_spec.rb'
+ - 'qa/qa/specs/features/api/1_manage/migration/gitlab_migration_large_project_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/10_govern/user/user_access_termination_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/1_manage/integrations/jira/jira_basic_integration_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb'
+ - 'qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb'
+ - 'qa/qa/specs/features/ee/api/10_govern/instance_audit_event_streaming_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/10_govern/create_merge_request_with_secure_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/10_govern/group/group_audit_event_streaming_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/10_govern/group/group_audit_logs_1_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/10_govern/instance/instance_audit_logs_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/10_govern/project/project_audit_logs_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/integrations/jira_issues_list_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb'
+ - 'qa/qa/specs/features/shared_contexts/import/gitlab_group_migration_common.rb'
+ - 'qa/qa/specs/qa_deprecation_toolkit_env.rb'
+ - 'qa/qa/support/fips.rb'
+ - 'qa/qa/support/formatters/test_metrics_formatter.rb'
+ - 'qa/qa/support/matchers/have_text.rb'
+ - 'qa/qa/support/page_error_checker.rb'
+ - 'qa/qa/support/run.rb'
+ - 'qa/qa/support/wait_for_requests.rb'
+ - 'qa/qa/tools/reliable_report.rb'
+ - 'qa/qa/vendor/one_password/cli.rb'
+ - 'qa/spec/ee/resource/mixins/group_base_spec.rb'
+ - 'qa/spec/page/base_spec.rb'
+ - 'qa/spec/resource/project_web_hook_spec.rb'
+ - 'qa/spec/scenario/template_spec.rb'
+ - 'qa/spec/support/formatters/allure_metadata_formatter_spec.rb'
+ - 'qa/spec/support/formatters/test_metrics_formatter_spec.rb'
+ - 'rubocop/cop/experiments_test_coverage.rb'
+ - 'rubocop/cop/gettext/static_identifier.rb'
+ - 'rubocop/cop/gitlab/feature_available_usage.rb'
+ - 'rubocop/cop/graphql/id_type.rb'
+ - 'rubocop/cop/migration/add_reference.rb'
+ - 'rubocop/cop/rspec/factory_bot/inline_association.rb'
+ - 'rubocop/cop/static_translation_definition.rb'
+ - 'rubocop/feature_categories.rb'
+ - 'rubocop/migration_helpers.rb'
+ - 'rubocop/rubocop.rb'
+ - 'scripts/api/get_job_id.rb'
+ - 'scripts/failed_tests.rb'
+ - 'scripts/feature_flags/used-feature-flags'
+ - 'scripts/generate-message-to-run-e2e-pipeline.rb'
+ - 'scripts/generate_rspec_pipeline.rb'
+ - 'scripts/insert-rspec-profiling-data'
+ - 'scripts/internal_events/monitor.rb'
+ - 'scripts/lib/gitlab.rb'
+ - 'scripts/lib/glfm/parse_examples.rb'
+ - 'scripts/lib/glfm/update_example_snapshots.rb'
+ - 'scripts/perf/gc/print_gc_stats.rb'
+ - 'scripts/rubocop-parse'
+ - 'scripts/security-harness'
+ - 'scripts/trigger-build.rb'
+ - 'scripts/verify-tff-mapping'
+ - 'sidekiq_cluster/cli.rb'
+ - 'sidekiq_cluster/sidekiq_cluster.rb'
+ - 'spec/benchmarks/banzai_benchmark.rb'
+ - 'spec/commands/diagnostic_reports/uploader_smoke_spec.rb'
+ - 'spec/commands/sidekiq_cluster/cli_spec.rb'
+ - 'spec/components/previews/pajamas/banner_component_preview.rb'
+ - 'spec/components/previews/pajamas/button_component_preview.rb'
+ - 'spec/config/application_spec.rb'
+ - 'spec/controllers/concerns/content_security_policy_patch_spec.rb'
+ - 'spec/controllers/concerns/continue_params_spec.rb'
+ - 'spec/controllers/concerns/preferred_language_switcher_spec.rb'
+ - 'spec/controllers/groups/milestones_controller_spec.rb'
+ - 'spec/controllers/omniauth_callbacks_controller_spec.rb'
+ - 'spec/controllers/profiles/two_factor_auths_controller_spec.rb'
+ - 'spec/controllers/projects/milestones_controller_spec.rb'
+ - 'spec/controllers/projects/releases_controller_spec.rb'
+ - 'spec/controllers/projects/runners_controller_spec.rb'
+ - 'spec/db/docs_spec.rb'
+ - 'spec/deprecation_warnings.rb'
+ - 'spec/experiments/application_experiment_spec.rb'
+ - 'spec/factories/design_management/designs.rb'
+ - 'spec/factories/events.rb'
+ - 'spec/factories/go_module_commits.rb'
+ - 'spec/factories/ml/experiments.rb'
+ - 'spec/factories/packages/packages.rb'
+ - 'spec/factories/packages/rpm/rpm_repository_files.rb'
+ - 'spec/factories/projects.rb'
+ - 'spec/factories/projects/ci_feature_usages.rb'
+ - 'spec/factories/wiki_pages.rb'
+ - 'spec/features/issues/user_edits_issue_spec.rb'
+ - 'spec/features/markdown/math_spec.rb'
+ - 'spec/features/merge_request/user_edits_mr_spec.rb'
+ - 'spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb'
+ - 'spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb'
+ - 'spec/features/projects/members/import_project_members_spec.rb'
+ - 'spec/features/projects/navbar_spec.rb'
+ - 'spec/finders/concerns/finder_methods_spec.rb'
+ - 'spec/finders/groups/projects_requiring_authorizations_refresh/on_direct_membership_finder_spec.rb'
+ - 'spec/finders/groups/projects_requiring_authorizations_refresh/on_transfer_finder_spec.rb'
+ - 'spec/finders/packages/build_infos_finder_spec.rb'
+ - 'spec/finders/packages/group_packages_finder_spec.rb'
+ - 'spec/fixtures/packages/rubygems/package.gemspec'
+ - 'spec/frontend/fixtures/merge_requests.rb'
+ - 'spec/graphql/mutations/clusters/agent_tokens/create_spec.rb'
+ - 'spec/graphql/mutations/clusters/agents/create_spec.rb'
+ - 'spec/graphql/mutations/clusters/agents/delete_spec.rb'
+ - 'spec/graphql/mutations/commits/create_spec.rb'
+ - 'spec/graphql/mutations/design_management/delete_spec.rb'
+ - 'spec/graphql/resolvers/board_resolver_spec.rb'
+ - 'spec/graphql/resolvers/boards_resolver_spec.rb'
+ - 'spec/graphql/resolvers/ci/catalog/versions_resolver_spec.rb'
+ - 'spec/haml_lint/linter/inline_javascript_spec.rb'
+ - 'spec/haml_lint/linter/no_plain_nodes_spec.rb'
+ - 'spec/helpers/admin/abuse_reports_helper_spec.rb'
+ - 'spec/helpers/events_helper_spec.rb'
+ - 'spec/helpers/groups_helper_spec.rb'
+ - 'spec/helpers/keyset_helper_spec.rb'
+ - 'spec/helpers/releases_helper_spec.rb'
+ - 'spec/helpers/sidebars_helper_spec.rb'
+ - 'spec/initializers/active_record_transaction_observer_spec.rb'
+ - 'spec/initializers/carrierwave_s3_encryption_headers_patch_spec.rb'
+ - 'spec/initializers/fog_google_https_private_urls_spec.rb'
+ - 'spec/initializers/google_api_client_spec.rb'
+ - 'spec/initializers/mail_encoding_patch_spec.rb'
+ - 'spec/initializers/mail_starttls_patch_spec.rb'
+ - 'spec/initializers/rack_multipart_patch_spec.rb'
+ - 'spec/initializers/validate_database_config_spec.rb'
+ - 'spec/lib/api/base_spec.rb'
+ - 'spec/lib/api/entities/wiki_page_spec.rb'
+ - 'spec/lib/api/helpers/packages/npm_spec.rb'
+ - 'spec/lib/backup/database_model_spec.rb'
+ - 'spec/lib/backup/database_spec.rb'
+ - 'spec/lib/backup/manager_spec.rb'
+ - 'spec/lib/banzai/filter/footnote_filter_spec.rb'
+ - 'spec/lib/banzai/filter/image_link_filter_spec.rb'
+ - 'spec/lib/banzai/pipeline/incident_management/timeline_event_pipeline_spec.rb'
+ - 'spec/lib/container_registry/gitlab_api_client_spec.rb'
+ - 'spec/lib/generators/batched_background_migration/batched_background_migration_generator_spec.rb'
+ - 'spec/lib/gitlab/alert_management/payload/base_spec.rb'
+ - 'spec/lib/gitlab/audit/target_spec.rb'
+ - 'spec/lib/gitlab/audit/type/definition_spec.rb'
+ - 'spec/lib/gitlab/auth/atlassian/user_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/user_spec.rb'
+ - 'spec/lib/gitlab/auth/o_auth/user_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/user_spec.rb'
+ - 'spec/lib/gitlab/authorized_keys_spec.rb'
+ - 'spec/lib/gitlab/avatar_cache_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_cluster_agents_has_vulnerabilities_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_code_suggestions_namespace_settings_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_finding_id_in_vulnerabilities_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_has_merge_request_of_vulnerability_reads_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_missing_ci_cd_settings_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_namespace_id_for_project_route_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_project_import_level_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_project_member_namespace_id_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_project_namespace_on_issues_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_project_repositories_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_resource_link_events_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_root_storage_statistics_fork_storage_sizes_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_uuid_conversion_column_in_vulnerability_occurrences_spec.rb'
+ - 'spec/lib/gitlab/background_migration/backfill_vulnerability_reads_cluster_agent_spec.rb'
+ - 'spec/lib/gitlab/background_migration/batched_migration_job_spec.rb'
+ - 'spec/lib/gitlab/background_migration/batching_strategies/backfill_project_statistics_with_container_registry_size_batching_strategy_spec.rb'
+ - 'spec/lib/gitlab/background_migration/batching_strategies/loose_index_scan_batching_strategy_spec.rb'
+ - 'spec/lib/gitlab/background_migration/batching_strategies/remove_backfilled_job_artifacts_expire_at_batching_strategy_spec.rb'
+ - 'spec/lib/gitlab/background_migration/cleanup_orphaned_routes_spec.rb'
+ - 'spec/lib/gitlab/background_migration/cleanup_personal_access_tokens_with_nil_expires_at_spec.rb'
+ - 'spec/lib/gitlab/background_migration/convert_credit_card_validation_data_to_hashes_spec.rb'
+ - 'spec/lib/gitlab/background_migration/delete_orphans_approval_merge_request_rules2_spec.rb'
+ - 'spec/lib/gitlab/background_migration/delete_orphans_approval_project_rules2_spec.rb'
+ - 'spec/lib/gitlab/background_migration/destroy_invalid_group_members_spec.rb'
+ - 'spec/lib/gitlab/background_migration/destroy_invalid_members_spec.rb'
+ - 'spec/lib/gitlab/background_migration/destroy_invalid_project_members_spec.rb'
+ - 'spec/lib/gitlab/background_migration/fix_allow_descendants_override_disabled_shared_runners_spec.rb'
+ - 'spec/lib/gitlab/background_migration/fix_incoherent_packages_size_on_project_statistics_spec.rb'
+ - 'spec/lib/gitlab/background_migration/fix_vulnerability_reads_has_issues_spec.rb'
+ - 'spec/lib/gitlab/background_migration/issues_internal_id_scope_updater_spec.rb'
+ - 'spec/lib/gitlab/background_migration/legacy_upload_mover_spec.rb'
+ - 'spec/lib/gitlab/background_migration/legacy_uploads_migrator_spec.rb'
+ - 'spec/lib/gitlab/background_migration/mark_duplicate_npm_packages_for_destruction_spec.rb'
+ - 'spec/lib/gitlab/background_migration/migrate_human_user_type_spec.rb'
+ - 'spec/lib/gitlab/background_migration/nullify_last_error_from_project_mirror_data_spec.rb'
+ - 'spec/lib/gitlab/background_migration/populate_vulnerability_dismissal_fields_spec.rb'
+ - 'spec/lib/gitlab/background_migration/truncate_overlong_vulnerability_html_titles_spec.rb'
+ - 'spec/lib/gitlab/background_migration/update_ci_pipeline_artifacts_unknown_locked_status_spec.rb'
+ - 'spec/lib/gitlab/background_task_spec.rb'
+ - 'spec/lib/gitlab/cache/client_spec.rb'
+ - 'spec/lib/gitlab/ci/ansi2json/style_spec.rb'
+ - 'spec/lib/gitlab/ci/build/rules/rule/clause/changes_spec.rb'
+ - 'spec/lib/gitlab/ci/config/normalizer/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/parsers/security/sast_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/duration_spec.rb'
+ - 'spec/lib/gitlab/config/entry/validators_spec.rb'
+ - 'spec/lib/gitlab/config/loader/multi_doc_yaml_spec.rb'
+ - 'spec/lib/gitlab/content_security_policy/config_loader_spec.rb'
+ - 'spec/lib/gitlab/daemon_spec.rb'
+ - 'spec/lib/gitlab/database/bulk_update_spec.rb'
+ - 'spec/lib/gitlab/database/health_status/indicators/patroni_apdex_spec.rb'
+ - 'spec/lib/gitlab/database/health_status/indicators/prometheus_alert_indicator_spec.rb'
+ - 'spec/lib/gitlab/database/health_status/indicators/wal_rate_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/transaction_leaking_spec.rb'
+ - 'spec/lib/gitlab/database/migration_helpers/restrict_gitlab_schema_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/instrumentation_spec.rb'
+ - 'spec/lib/gitlab/database_spec.rb'
+ - 'spec/lib/gitlab/doorkeeper_secret_storing/secret/pbkdf2_sha512_spec.rb'
+ - 'spec/lib/gitlab/doorkeeper_secret_storing/token/pbkdf2_sha512_spec.rb'
+ - 'spec/lib/gitlab/encoding_helper_spec.rb'
+ - 'spec/lib/gitlab/experiment/rollout/feature_spec.rb'
+ - 'spec/lib/gitlab/gfm/uploads_rewriter_spec.rb'
+ - 'spec/lib/gitlab/git/object_pool_spec.rb'
+ - 'spec/lib/gitlab/git/remote_mirror_spec.rb'
+ - 'spec/lib/gitlab/git/repository_spec.rb'
+ - 'spec/lib/gitlab/git/tree_spec.rb'
+ - 'spec/lib/gitlab/gitaly_client/object_pool_service_spec.rb'
+ - 'spec/lib/gitlab/github_import/importer/issue_event_importer_spec.rb'
+ - 'spec/lib/gitlab/grape_logging/loggers/urgency_logger_spec.rb'
+ - 'spec/lib/gitlab/health_checks/master_check_spec.rb'
+ - 'spec/lib/gitlab/i18n/po_linter_spec.rb'
+ - 'spec/lib/gitlab/import/merge_request_creator_spec.rb'
+ - 'spec/lib/gitlab/import_export/avatar_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/base/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/design_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/lfs_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/lfs_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/relation_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/sample/relation_factory_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/repo_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippet_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippet_repo_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippets_repo_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/snippets_repo_saver_spec.rb'
+ - 'spec/lib/gitlab/import_export/uploads_manager_spec.rb'
+ - 'spec/lib/gitlab/import_export/uploads_saver_spec.rb'
+ - 'spec/lib/gitlab/instrumentation_helper_spec.rb'
+ - 'spec/lib/gitlab/json_spec.rb'
+ - 'spec/lib/gitlab/markdown_cache/redis/store_spec.rb'
+ - 'spec/lib/gitlab/memory/diagnostic_reports_logger_spec.rb'
+ - 'spec/lib/gitlab/memory/reports_daemon_spec.rb'
+ - 'spec/lib/gitlab/memory/reports_uploader_spec.rb'
+ - 'spec/lib/gitlab/memory/watchdog/configurator_spec.rb'
+ - 'spec/lib/gitlab/memory/watchdog/handlers/puma_handler_spec.rb'
+ - 'spec/lib/gitlab/merge_requests/message_generator_spec.rb'
+ - 'spec/lib/gitlab/pages/deployment_update_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/iterator_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/order_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb'
+ - 'spec/lib/gitlab/patch/database_config_spec.rb'
+ - 'spec/lib/gitlab/patch/node_loader_spec.rb'
+ - 'spec/lib/gitlab/quick_actions/dsl_spec.rb'
+ - 'spec/lib/gitlab/redis/cross_slot_spec.rb'
+ - 'spec/lib/gitlab/redis/multi_store_spec.rb'
+ - 'spec/lib/gitlab/shard_health_cache_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/server_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/count_deployments_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/metrics/instrumentations/gitaly_apdex_metric_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping/legacy_metric_metadata_decorator_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/gitlab_cli_activity_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/jetbrains_bundled_plugin_activity_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/jetbrains_plugin_activity_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/usage_data_counters/vscode_extension_activity_unique_counter_spec.rb'
+ - 'spec/lib/gitlab/utils/batch_loader_spec.rb'
+ - 'spec/lib/gitlab_settings/options_spec.rb'
+ - 'spec/lib/mattermost/command_spec.rb'
+ - 'spec/lib/mattermost/team_spec.rb'
+ - 'spec/lib/object_storage/pending_direct_upload_spec.rb'
+ - 'spec/lib/omni_auth/strategies/jwt_spec.rb'
+ - 'spec/lib/result_spec.rb'
+ - 'spec/mailers/notify_spec.rb'
+ - 'spec/metrics_server/metrics_server_spec.rb'
+ - 'spec/migrations/20230403085957_add_tmp_partial_index_on_vulnerability_report_types2_spec.rb'
+ - 'spec/migrations/20230426085615_queue_backfill_resource_link_events_spec.rb'
+ - 'spec/migrations/20230613192703_swap_ci_build_needs_to_big_int_for_self_hosts_spec.rb'
+ - 'spec/migrations/20230726144458_swap_notes_id_to_bigint_for_self_managed_spec.rb'
+ - 'spec/migrations/20230803125434_add_has_merge_request_on_vulnerability_reads_trigger_spec.rb'
+ - 'spec/migrations/20230809104753_swap_epic_user_mentions_note_id_to_bigint_for_self_hosts_spec.rb'
+ - 'spec/migrations/20230809174702_swap_system_note_metadata_note_id_to_bigint_for_self_managed_spec.rb'
+ - 'spec/migrations/20230809210550_swap_issue_user_mentions_note_id_to_bigint_for_self_managed_spec.rb'
+ - 'spec/migrations/20230810103534_swap_suggestions_note_id_to_bigint_for_self_hosts_spec.rb'
+ - 'spec/migrations/20230810113227_swap_note_diff_files_note_id_to_bigint_for_self_hosts_spec.rb'
+ - 'spec/migrations/20230810123044_swap_snippet_user_mentions_note_id_to_bigint_for_self_hosts_spec.rb'
+ - 'spec/migrations/20230811103941_swap_vulnerability_user_mentions_note_id_to_bigint_for_self_hosts_spec.rb'
+ - 'spec/migrations/20230814144045_swap_timelogs_note_id_to_bigint_for_self_hosts_spec.rb'
+ - 'spec/migrations/20230816152639_swap_design_user_mentions_note_id_to_big_int_for_self_managed_spec.rb'
+ - 'spec/migrations/20230817111938_swap_events_target_id_to_bigint_for_self_hosts_spec.rb'
+ - 'spec/migrations/20230817143637_swap_award_emoji_note_id_to_bigint_for_self_hosts_spec.rb'
+ - 'spec/migrations/20230906204934_restart_self_hosted_sent_notifications_bigint_conversion_spec.rb'
+ - 'spec/migrations/20230906204935_restart_self_hosted_sent_notifications_backfill_spec.rb'
+ - 'spec/migrations/add_namespaces_emails_enabled_column_data_spec.rb'
+ - 'spec/migrations/add_projects_emails_enabled_column_data_spec.rb'
+ - 'spec/migrations/cleanup_bigint_conversion_for_merge_request_metrics_for_self_hosts_spec.rb'
+ - 'spec/migrations/cleanup_conversion_big_int_ci_build_needs_self_managed_spec.rb'
+ - 'spec/migrations/swap_award_emoji_note_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_commit_user_mentions_note_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_commit_user_mentions_note_id_to_bigint_for_self_managed_spec.rb'
+ - 'spec/migrations/swap_design_user_mentions_note_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_epic_user_mentions_note_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_events_target_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_issue_user_mentions_note_id_to_bigint_for_gitlab_dot_com_2_spec.rb'
+ - 'spec/migrations/swap_merge_request_metrics_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_merge_request_metrics_id_to_bigint_for_self_hosts_spec.rb'
+ - 'spec/migrations/swap_merge_request_user_mentions_note_id_to_bigint_2_spec.rb'
+ - 'spec/migrations/swap_merge_request_user_mentions_note_id_to_bigint_for_self_managed_spec.rb'
+ - 'spec/migrations/swap_note_diff_files_note_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_notes_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_sent_notifications_id_columns_spec.rb'
+ - 'spec/migrations/swap_snippet_user_mentions_note_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_suggestions_note_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_system_note_metadata_note_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_timelogs_note_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_todos_note_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/migrations/swap_todos_note_id_to_bigint_for_self_managed_spec.rb'
+ - 'spec/migrations/swap_vulnerability_user_mentions_note_id_to_bigint_for_gitlab_dot_com_spec.rb'
+ - 'spec/models/board_spec.rb'
+ - 'spec/models/ci/build_trace_chunk_spec.rb'
+ - 'spec/models/ci/job_token/project_scope_link_spec.rb'
+ - 'spec/models/ci/persistent_ref_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/ci/runner_manager_build_spec.rb'
+ - 'spec/models/concerns/bulk_insertable_associations_spec.rb'
+ - 'spec/models/concerns/database_event_tracking_spec.rb'
+ - 'spec/models/concerns/encrypted_user_password_spec.rb'
+ - 'spec/models/concerns/has_user_type_spec.rb'
+ - 'spec/models/concerns/legacy_bulk_insert_spec.rb'
+ - 'spec/models/concerns/manual_inverse_association_spec.rb'
+ - 'spec/models/concerns/noteable_spec.rb'
+ - 'spec/models/concerns/triggerable_hooks_spec.rb'
+ - 'spec/models/deployment_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/fork_network_member_spec.rb'
+ - 'spec/models/hooks/system_hook_spec.rb'
+ - 'spec/models/incident_management/timeline_event_spec.rb'
+ - 'spec/models/key_spec.rb'
+ - 'spec/models/label_spec.rb'
+ - 'spec/models/member_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/namespace/package_setting_spec.rb'
+ - 'spec/models/operations/feature_flags/user_list_spec.rb'
+ - 'spec/models/packages/protection/rule_spec.rb'
+ - 'spec/models/project_feature_spec.rb'
+ - 'spec/models/project_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/policies/group_policy_spec.rb'
+ - 'spec/presenters/ci/build_runner_presenter_spec.rb'
+ - 'spec/presenters/member_presenter_spec.rb'
+ - 'spec/presenters/ml/candidate_details_presenter_spec.rb'
+ - 'spec/presenters/ml/candidates_csv_presenter_spec.rb'
+ - 'spec/presenters/packages/nuget/search_results_presenter_spec.rb'
+ - 'spec/presenters/packages/pypi/simple_index_presenter_spec.rb'
+ - 'spec/presenters/packages/pypi/simple_package_versions_presenter_spec.rb'
+ - 'spec/requests/api/alert_management_alerts_spec.rb'
+ - 'spec/requests/api/ci/runner/jobs_artifacts_spec.rb'
+ - 'spec/requests/api/graphql/ci/config_spec.rb'
+ - 'spec/requests/api/graphql/groups_query_spec.rb'
+ - 'spec/requests/api/graphql/issues_spec.rb'
+ - 'spec/requests/api/graphql/mutations/issues/bulk_update_spec.rb'
+ - 'spec/requests/api/graphql/project/environments_spec.rb'
+ - 'spec/requests/api/group_import_spec.rb'
+ - 'spec/requests/api/internal/base_spec.rb'
+ - 'spec/requests/api/ml_model_packages_spec.rb'
+ - 'spec/requests/api/project_import_spec.rb'
+ - 'spec/requests/lfs_http_spec.rb'
+ - 'spec/requests/projects/merge_requests_discussions_spec.rb'
+ - 'spec/rubocop/cop/gitlab/httparty_spec.rb'
+ - 'spec/rubocop/cop/rake/require_spec.rb'
+ - 'spec/rubocop/cop_todo_spec.rb'
+ - 'spec/rubocop/formatter/graceful_formatter_spec.rb'
+ - 'spec/rubocop/formatter/todo_formatter_spec.rb'
+ - 'spec/rubocop/migration_helpers_spec.rb'
+ - 'spec/rubocop/todo_dir_spec.rb'
+ - 'spec/scripts/api/commit_merge_requests_spec.rb'
+ - 'spec/scripts/api/create_merge_request_discussion_spec.rb'
+ - 'spec/scripts/api/create_merge_request_note_spec.rb'
+ - 'spec/scripts/api/get_package_and_test_job_spec.rb'
+ - 'spec/scripts/generate_message_to_run_e2e_pipeline_spec.rb'
+ - 'spec/scripts/lib/glfm/update_example_snapshots_spec.rb'
+ - 'spec/scripts/lib/glfm/update_specification_spec.rb'
+ - 'spec/scripts/pipeline/average_reports_spec.rb'
+ - 'spec/scripts/review_apps/automated_cleanup_spec.rb'
+ - 'spec/scripts/trigger-build_spec.rb'
+ - 'spec/serializers/admin/abuse_report_details_entity_spec.rb'
+ - 'spec/serializers/admin/abuse_report_serializer_spec.rb'
+ - 'spec/serializers/profile/event_entity_spec.rb'
+ - 'spec/services/admin/set_feature_flag_service_spec.rb'
+ - 'spec/services/alert_management/metric_images/upload_service_spec.rb'
+ - 'spec/services/auto_merge/base_service_spec.rb'
+ - 'spec/services/auto_merge_service_spec.rb'
+ - 'spec/services/batched_git_ref_updates/cleanup_scheduler_service_spec.rb'
+ - 'spec/services/boards/lists/list_service_spec.rb'
+ - 'spec/services/bulk_imports/create_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/environment_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/logger_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/generate_coverage_reports_service_spec.rb'
+ - 'spec/services/ci/job_artifacts/create_service_spec.rb'
+ - 'spec/services/ci/pipeline_schedules/calculate_next_run_service_spec.rb'
+ - 'spec/services/draft_notes/destroy_service_spec.rb'
+ - 'spec/services/event_create_service_spec.rb'
+ - 'spec/services/google_cloud/enable_cloudsql_service_spec.rb'
+ - 'spec/services/import/gitlab_projects/file_acquisition_strategies/remote_file_spec.rb'
+ - 'spec/services/merge_requests/create_service_spec.rb'
+ - 'spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb'
+ - 'spec/services/object_storage/delete_stale_direct_uploads_service_spec.rb'
+ - 'spec/services/packages/conan/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/create_distribution_service_spec.rb'
+ - 'spec/services/packages/debian/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/update_distribution_service_spec.rb'
+ - 'spec/services/packages/npm/generate_metadata_service_spec.rb'
+ - 'spec/services/packages/rpm/repository_metadata/build_filelist_xml_service_spec.rb'
+ - 'spec/services/projects/hashed_storage/base_attachment_service_spec.rb'
+ - 'spec/services/protected_branches/cache_service_spec.rb'
+ - 'spec/services/resource_events/change_milestone_service_spec.rb'
+ - 'spec/services/security/merge_reports_service_spec.rb'
+ - 'spec/services/system_notes/issuables_service_spec.rb'
+ - 'spec/services/todos/destroy/destroyed_issuable_service_spec.rb'
+ - 'spec/services/user_agent_detail_service_spec.rb'
+ - 'spec/services/users/migrate_records_to_ghost_user_service_spec.rb'
+ - 'spec/services/users/set_namespace_commit_email_service_spec.rb'
+ - 'spec/services/webauthn/authenticate_service_spec.rb'
+ - 'spec/services/webauthn/register_service_spec.rb'
+ - 'spec/sidekiq/cron/job_gem_dependency_spec.rb'
+ - 'spec/sidekiq_cluster/sidekiq_cluster_spec.rb'
+ - 'spec/spec_helper.rb'
+ - 'spec/support/before_all_adapter.rb'
+ - 'spec/support/capybara.rb'
+ - 'spec/support/database/click_house/hooks.rb'
+ - 'spec/support/db_cleaner.rb'
+ - 'spec/support/fips.rb'
+ - 'spec/support/forgery_protection.rb'
+ - 'spec/support/frontend_fixtures.rb'
+ - 'spec/support/helpers/batch_destroy_dependent_associations_helper.rb'
+ - 'spec/support/helpers/cycle_analytics_helpers/test_generation.rb'
+ - 'spec/support/helpers/database/multiple_databases_helpers.rb'
+ - 'spec/support/helpers/database/table_schema_helpers.rb'
+ - 'spec/support/helpers/drag_to_helper.rb'
+ - 'spec/support/helpers/fake_webauthn_device.rb'
+ - 'spec/support/helpers/features/two_factor_helpers.rb'
+ - 'spec/support/helpers/gitaly_setup.rb'
+ - 'spec/support/helpers/google_api/cloud_platform_helpers.rb'
+ - 'spec/support/helpers/graphql/subscriptions/action_cable/mock_action_cable.rb'
+ - 'spec/support/helpers/graphql_helpers.rb'
+ - 'spec/support/helpers/javascript_fixtures_helpers.rb'
+ - 'spec/support/helpers/jira_integration_helpers.rb'
+ - 'spec/support/helpers/login_helpers.rb'
+ - 'spec/support/helpers/migrations_helpers/vulnerabilities_findings_helper.rb'
+ - 'spec/support/helpers/migrations_helpers/vulnerabilities_helper.rb'
+ - 'spec/support/helpers/rendered_helpers.rb'
+ - 'spec/support/helpers/snowplow_helpers.rb'
+ - 'spec/support/helpers/stub_feature_flags.rb'
+ - 'spec/support/helpers/stub_object_storage.rb'
+ - 'spec/support/helpers/stub_snowplow.rb'
+ - 'spec/support/helpers/wait_for_requests.rb'
+ - 'spec/support/matchers/event_store.rb'
+ - 'spec/support/rspec_order.rb'
+ - 'spec/support/shared_contexts/controllers/ambiguous_ref_controller_shared_context.rb'
+ - 'spec/support/shared_contexts/disable_user_tracking.rb'
+ - 'spec/support/shared_contexts/policies/project_policy_table_shared_context.rb'
+ - 'spec/support/shared_contexts/requests/api/npm_packages_metadata_shared_examples.rb'
+ - 'spec/support/shared_contexts/user_contribution_events_shared_context.rb'
+ - 'spec/support/shared_examples/ci/deployable_shared_examples.rb'
+ - 'spec/support/shared_examples/db/seeds/data_seeder_shared_examples.rb'
+ - 'spec/support/shared_examples/deployments/create_for_job_shared_examples.rb'
+ - 'spec/support/shared_examples/environments/create_for_job_shared_examples.rb'
+ - 'spec/support/shared_examples/features/editable_merge_request_shared_examples.rb'
+ - 'spec/support/shared_examples/features/milestone_editing_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_previews_wiki_changes_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_updates_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_asciidoc_page_with_includes_shared_examples.rb'
+ - 'spec/support/shared_examples/features/wiki/user_views_wiki_page_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/cache/json_cache_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/cycle_analytics/event_shared_examples.rb'
+ - 'spec/support/shared_examples/lib/gitlab/database/reestablished_connection_stack_shared_examples.rb'
+ - 'spec/support/shared_examples/loose_foreign_keys/have_loose_foreign_key.rb'
+ - 'spec/support/shared_examples/models/boards/listable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/boards/user_preferences_shared_examples.rb'
+ - 'spec/support/shared_examples/models/cluster_application_helm_cert_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/analytics/cycle_analytics/stage_event_model_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/protected_ref_access_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/protected_ref_deploy_key_access_examples.rb'
+ - 'spec/support/shared_examples/models/concerns/ttl_expirable_shared_examples.rb'
+ - 'spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb'
+ - 'spec/support/shared_examples/models/issuable_link_shared_examples.rb'
+ - 'spec/support/shared_examples/models/member_shared_examples.rb'
+ - 'spec/support/shared_examples/models/packages/debian/component_file_shared_example.rb'
+ - 'spec/support/shared_examples/models/packages/debian/distribution_key_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/award_emoji_todo_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/graphql/group_and_project_boards_query_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/ml_model_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/pypi_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb'
+ - 'spec/support/shared_examples/requests/api/terraform/modules/v1/packages_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/boards_list_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/boards/items_list_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wiki_pages/destroy_service_shared_examples.rb'
+ - 'spec/support/shared_examples/services/wikis/create_attachment_service_shared_examples.rb'
+ - 'spec/support/sidekiq_middleware.rb'
+ - 'spec/support_specs/ability_check_spec.rb'
+ - 'spec/support_specs/capybara_slow_finder_spec.rb'
+ - 'spec/support_specs/capybara_wait_for_all_requests_spec.rb'
+ - 'spec/support_specs/database/multiple_databases_helpers_spec.rb'
+ - 'spec/support_specs/helpers/stub_feature_flags_spec.rb'
+ - 'spec/support_specs/matchers/event_store_spec.rb'
+ - 'spec/tasks/dev_rake_spec.rb'
+ - 'spec/tasks/gitlab/db/validate_config_rake_spec.rb'
+ - 'spec/tasks/rubocop_rake_spec.rb'
+ - 'spec/tooling/danger/saas_feature_spec.rb'
+ - 'spec/tooling/danger/stable_branch_spec.rb'
+ - 'spec/tooling/lib/tooling/find_changes_spec.rb'
+ - 'spec/tooling/lib/tooling/helpers/file_handler_spec.rb'
+ - 'spec/tooling/lib/tooling/helpers/predictive_tests_helper_spec.rb'
+ - 'spec/tooling/lib/tooling/job_metrics_spec.rb'
+ - 'spec/tooling/lib/tooling/parallel_rspec_runner_spec.rb'
+ - 'spec/tooling/lib/tooling/predictive_tests_spec.rb'
+ - 'spec/uploaders/file_uploader_spec.rb'
+ - 'spec/uploaders/object_storage_spec.rb'
+ - 'spec/uploaders/packages/composer/cache_uploader_spec.rb'
+ - 'spec/uploaders/packages/debian/component_file_uploader_spec.rb'
+ - 'spec/views/groups/group_members/index.html.haml_spec.rb'
+ - 'spec/views/layouts/group.html.haml_spec.rb'
+ - 'spec/views/layouts/header/_new_dropdown.haml_spec.rb'
+ - 'spec/views/notify/import_work_items_csv_email.html.haml_spec.rb'
+ - 'spec/views/projects/project_members/index.html.haml_spec.rb'
+ - 'spec/workers/concerns/cronjob_queue_spec.rb'
+ - 'spec/workers/concerns/worker_attributes_spec.rb'
+ - 'spec/workers/container_registry/migration/observer_worker_spec.rb'
+ - 'spec/workers/object_storage/delete_stale_direct_uploads_worker_spec.rb'
+ - 'spec/workers/projects/delete_branch_worker_spec.rb'
+ - 'spec/workers/redis_migration_worker_spec.rb'
+ - 'spec/workers/repository_check/single_repository_worker_spec.rb'
+ - 'tooling/danger/database_dictionary.rb'
+ - 'tooling/danger/feature_flag.rb'
+ - 'tooling/danger/ignored_model_columns.rb'
+ - 'tooling/danger/saas_feature.rb'
+ - 'tooling/danger/sidekiq_queues.rb'
+ - 'tooling/danger/stable_branch.rb'
+ - 'tooling/danger/suggestor.rb'
+ - 'tooling/lib/tooling/fast_quarantine.rb'
+ - 'tooling/lib/tooling/find_changes.rb'
+ - 'tooling/lib/tooling/gettext_extractor.rb'
+ - 'tooling/lib/tooling/helm3_client.rb'
+ - 'tooling/lib/tooling/job_metrics.rb'
+ - 'tooling/lib/tooling/kubernetes_client.rb'
+ - 'tooling/quality/test_level.rb'
diff --git a/app/assets/javascripts/ci/pipeline_details/graph/components/job_item.vue b/app/assets/javascripts/ci/pipeline_details/graph/components/job_item.vue
index ab12e4c05e3..c6340e6787a 100644
--- a/app/assets/javascripts/ci/pipeline_details/graph/components/job_item.vue
+++ b/app/assets/javascripts/ci/pipeline_details/graph/components/job_item.vue
@@ -329,7 +329,7 @@ export default {
@mouseout="hideTooltips"
>
<div class="gl-display-flex gl-align-items-center gl-flex-grow-1">
- <ci-icon :status="job.status" size="md" :use-link="false" />
+ <ci-icon :status="job.status" :use-link="false" />
<div class="gl-pl-3 gl-pr-3 gl-display-flex gl-flex-direction-column gl-pipeline-job-width">
<div class="gl-text-truncate gl-pr-9 gl-line-height-normal">{{ job.name }}</div>
<div
diff --git a/app/assets/javascripts/ci/pipeline_mini_graph/linked_pipelines_mini_list.vue b/app/assets/javascripts/ci/pipeline_mini_graph/linked_pipelines_mini_list.vue
index 4dace6b501a..f6a375ab94c 100644
--- a/app/assets/javascripts/ci/pipeline_mini_graph/linked_pipelines_mini_list.vue
+++ b/app/assets/javascripts/ci/pipeline_mini_graph/linked_pipelines_mini_list.vue
@@ -81,11 +81,6 @@ export default {
// detailedStatus is graphQL, details.status is REST
return pipeline?.detailedStatus || pipeline?.details?.status;
},
- triggerButtonClass(pipeline) {
- const { group } = accessValue(pipeline, this.dataMethod, 'detailedStatus');
-
- return `ci-status-icon-${group}`;
- },
},
};
</script>
@@ -105,7 +100,6 @@ export default {
v-gl-tooltip="{ title: pipelineTooltipText(pipeline) }"
:status="pipelineStatus(pipeline)"
:show-tooltip="false"
- :class="triggerButtonClass(pipeline)"
class="linked-pipeline-mini-item gl-mb-0!"
data-testid="linked-pipeline-mini-item"
/>
diff --git a/app/assets/javascripts/vue_shared/components/ci_icon.vue b/app/assets/javascripts/vue_shared/components/ci_icon.vue
index 9f4cfa6f690..a2b6b4642c9 100644
--- a/app/assets/javascripts/vue_shared/components/ci_icon.vue
+++ b/app/assets/javascripts/vue_shared/components/ci_icon.vue
@@ -6,20 +6,11 @@ import { GlBadge, GlTooltipDirective, GlIcon } from '@gitlab/ui';
*
* Receives status object containing:
* status: {
- * group:"running" // used for CSS class
- * icon: "icon_status_running" // used to render the icon
+ * icon: "status_running" // used to render the icon and CSS class
+ * text: "Running",
+ * detailsPath: '/project1/jobs/1' // can also be details_path
* }
*
- * Used in:
- * - Extended MR Popover
- * - Jobs show view header
- * - Jobs show view sidebar
- * - Jobs table
- * - Linked pipelines
- * - Pipeline graph
- * - Pipeline mini graph
- * - Pipeline show view badge
- * - Pipelines table Badge
*/
export default {
@@ -35,13 +26,8 @@ export default {
type: Object,
required: true,
validator(status) {
- const { group, icon } = status;
- return (
- typeof group === 'string' &&
- group.length &&
- typeof icon === 'string' &&
- icon.startsWith('status_')
- );
+ const { icon } = status;
+ return typeof icon === 'string' && icon.startsWith('status_');
},
},
showStatusText: {
@@ -62,66 +48,47 @@ export default {
},
computed: {
title() {
- return this.showTooltip && !this.showStatusText ? this.status?.text : '';
+ if (this.showTooltip) {
+ // show tooltip only when not showing text already
+ return !this.showStatusText ? this.status?.text : null;
+ }
+ return null;
},
- detailsPath() {
- // For now, this can either come from graphQL with camelCase or REST API in snake_case
- if (!this.useLink) {
- return null;
+ ariaLabel() {
+ // show aria-label only when text is not rendered
+ if (!this.showStatusText) {
+ return this.status?.text;
}
- return this.status.detailsPath || this.status.details_path;
+ return null;
},
- wrapperStyleClasses() {
- const status = this.status.group;
- return `ci-status-icon ci-status-icon-${status} gl-rounded-full gl-justify-content-center gl-line-height-0`;
+ href() {
+ // href can come from GraphQL (camelCase) or REST API (snake_case)
+ if (this.useLink) {
+ return this.status.detailsPath || this.status.details_path;
+ }
+ return null;
},
icon() {
- return this.status.icon;
+ if (this.status.icon) {
+ return `${this.status.icon}_borderless`;
+ }
+ return null;
},
- badgeStyles() {
+ variant() {
switch (this.status.icon) {
case 'status_success':
- return {
- textColor: 'gl-text-green-700',
- variant: 'success',
- };
+ return 'success';
case 'status_warning':
- return {
- textColor: 'gl-text-orange-700',
- variant: 'warning',
- };
+ case 'status_pending':
+ return 'warning';
case 'status_failed':
- return {
- textColor: 'gl-text-red-700',
- variant: 'danger',
- };
+ return 'danger';
case 'status_running':
- return {
- textColor: 'gl-text-blue-700',
- variant: 'info',
- };
- case 'status_pending':
- return {
- textColor: 'gl-text-orange-700',
- variant: 'warning',
- };
- case 'status_canceled':
- return {
- textColor: 'gl-text-gray-700',
- variant: 'neutral',
- };
- case 'status_manual':
- return {
- textColor: 'gl-text-gray-700',
- variant: 'neutral',
- };
+ return 'info';
// default covers the styles for the remainder of CI
// statuses that are not explicitly stated here
default:
- return {
- textColor: 'gl-text-gray-600',
- variant: 'muted',
- };
+ return 'neutral';
}
},
},
@@ -131,30 +98,18 @@ export default {
<gl-badge
v-gl-tooltip
class="ci-icon gl-p-2"
+ :class="`ci-icon-variant-${variant}`"
+ :variant="variant"
:title="title"
- :aria-label="title"
- :href="detailsPath"
+ :aria-label="ariaLabel"
+ :href="href"
size="md"
- :variant="badgeStyles.variant"
data-testid="ci-icon"
@click="$emit('ciStatusBadgeClick')"
>
- <span
- class="ci-icon-wrapper"
- :class="[
- wrapperStyleClasses,
- {
- 'gl-display-inline-block gl-vertical-align-top': showStatusText,
- },
- ]"
- >
- <gl-icon :name="icon" :aria-label="status.icon" /> </span
- ><span
- v-if="showStatusText"
- class="gl-mx-2 gl-white-space-nowrap"
- :class="badgeStyles.textColor"
- data-testid="ci-icon-text"
- >{{ status.text }}</span
- >
+ <span class="ci-icon-gl-icon-wrapper"><gl-icon :name="icon" /></span
+ ><span v-if="showStatusText" class="gl-mx-2 gl-white-space-nowrap" data-testid="ci-icon-text">{{
+ status.text
+ }}</span>
</gl-badge>
</template>
diff --git a/app/assets/stylesheets/framework/icons.scss b/app/assets/stylesheets/framework/icons.scss
index 9d09c160551..bfd55fbb53d 100644
--- a/app/assets/stylesheets/framework/icons.scss
+++ b/app/assets/stylesheets/framework/icons.scss
@@ -1,37 +1,18 @@
-@mixin icon-styles($primary-color, $svg-color) {
+@mixin icon-styles($color) {
svg,
.gl-icon {
- fill: $primary-color;
- }
-
- // For the pipeline mini graph, we pass a custom 'gl-border' so that we can enforce
- // a border of 1px instead of the thicker svg borders to adhere to design standards.
- // If we implement the component with 'isBorderless' and also pass that border,
- // this css is to dynamically apply the correct border color for those specific icons.
- &.borderless {
- border-color: $primary-color;
- }
-
- &.interactive {
- &:hover {
- background: $svg-color;
- }
-
- &:hover,
- &.active {
- box-shadow: 0 0 0 1px $primary-color;
- }
+ fill: $color;
}
}
.ci-status-icon-success,
.ci-status-icon-passed {
- @include icon-styles($green-500, $green-100);
+ @include icon-styles($green-500);
}
.ci-status-icon-error,
.ci-status-icon-failed {
- @include icon-styles($red-500, $red-100);
+ @include icon-styles($red-500);
}
.ci-status-icon-pending,
@@ -39,18 +20,18 @@
.ci-status-icon-waiting-for-callback,
.ci-status-icon-failed-with-warnings,
.ci-status-icon-success-with-warnings {
- @include icon-styles($orange-500, $orange-100);
+ @include icon-styles($orange-500);
}
.ci-status-icon-running {
- @include icon-styles($blue-500, $blue-100);
+ @include icon-styles($blue-500);
}
.ci-status-icon-canceled,
.ci-status-icon-disabled,
.ci-status-icon-scheduled,
.ci-status-icon-manual {
- @include icon-styles($gray-900, $gray-100);
+ @include icon-styles($gray-900);
}
.ci-status-icon-notification,
@@ -58,7 +39,58 @@
.ci-status-icon-created,
.ci-status-icon-skipped,
.ci-status-icon-notfound {
- @include icon-styles($gray-500, $gray-100);
+ @include icon-styles($gray-500);
+}
+
+.ci-icon {
+ // .ci-icon class is used at
+ // - app/assets/javascripts/vue_shared/components/ci_icon.vue
+ // - app/helpers/ci/status_helper.rb
+ .ci-icon-gl-icon-wrapper {
+ @include gl-rounded-full;
+ @include gl-line-height-0;
+ }
+
+ // Makes the borderless CI icons appear slightly bigger than the default 16px.
+ // Could be fixed by making the SVG fill up the canvas in a follow up issue.
+ .gl-icon {
+ // fill: currentColor;
+ width: 20px;
+ height: 20px;
+ margin: -2px;
+ }
+
+ @mixin ci-icon-style($bg-color, $color, $gl-dark-bg-color: null, $gl-dark-color: null) {
+ .ci-icon-gl-icon-wrapper {
+ background-color: $bg-color;
+ color: $color;
+
+ .gl-dark & {
+ background-color: $gl-dark-bg-color;
+ color: $gl-dark-color;
+ }
+ }
+ }
+
+ &.ci-icon-variant-success {
+ @include ci-icon-style($green-500, $white, $green-600, $green-50)
+ }
+
+ &.ci-icon-variant-warning {
+ @include ci-icon-style($orange-500, $white, $orange-600, $orange-50)
+ }
+
+ &.ci-icon-variant-danger {
+ @include ci-icon-style($red-500, $white, $red-600, $red-50)
+ }
+
+ &.ci-icon-variant-info {
+ @include ci-icon-style($white, $blue-500, $blue-600, $blue-50)
+ }
+
+ &.ci-icon-variant-neutral {
+ @include ci-icon-style($white, $gray-500)
+ }
}
.password-status-icon-success {
diff --git a/app/graphql/types/security/codequality_reports_comparer/degradation_type.rb b/app/graphql/types/security/codequality_reports_comparer/degradation_type.rb
index e5fcd846190..7dd47611a2e 100644
--- a/app/graphql/types/security/codequality_reports_comparer/degradation_type.rb
+++ b/app/graphql/types/security/codequality_reports_comparer/degradation_type.rb
@@ -6,7 +6,6 @@ module Types
# rubocop: disable Graphql/AuthorizeTypes -- The resolver authorizes the request
class DegradationType < BaseObject
graphql_name 'CodequalityReportsComparerReportDegradation'
-
description 'Represents a degradation on the compared codequality report.'
field :description, GraphQL::Types::String,
diff --git a/app/graphql/types/security/codequality_reports_comparer/report_generation_status_enum.rb b/app/graphql/types/security/codequality_reports_comparer/report_generation_status_enum.rb
new file mode 100644
index 00000000000..dace3aec97c
--- /dev/null
+++ b/app/graphql/types/security/codequality_reports_comparer/report_generation_status_enum.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+module Types
+ module Security
+ module CodequalityReportsComparer
+ class ReportGenerationStatusEnum < BaseEnum
+ graphql_name 'CodequalityReportsComparerReportGenerationStatus'
+ description 'Represents the generation status of the compared codequality report.'
+
+ value 'PARSED', value: :parsed, description: 'Report was generated.'
+ value 'PARSING', value: :parsing, description: 'Report is being generated.'
+ value 'ERROR', value: :error, description: 'An error happened while generating the report.'
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/security/codequality_reports_comparer/status_enum.rb b/app/graphql/types/security/codequality_reports_comparer/status_enum.rb
index 9cab2664db8..fdccfdc7e44 100644
--- a/app/graphql/types/security/codequality_reports_comparer/status_enum.rb
+++ b/app/graphql/types/security/codequality_reports_comparer/status_enum.rb
@@ -4,11 +4,11 @@ module Types
module Security
module CodequalityReportsComparer
class StatusEnum < BaseEnum
- graphql_name 'CodequalityReportsComparerReportStatus'
- description 'Report comparison status'
+ graphql_name 'CodequalityReportsComparerStatus'
+ description 'Represents the state of the code quality report.'
- value 'SUCCESS', value: 'success', description: 'Report successfully generated.'
- value 'FAILED', value: 'failed', description: 'Report failed to generate.'
+ value 'SUCCESS', value: 'success', description: 'No degradations found in the head pipeline report.'
+ value 'FAILED', value: 'failed', description: 'Report generated and there are new code quality degradations.'
value 'NOT_FOUND', value: 'not_found', description: 'Head report or base report not found.'
end
end
diff --git a/app/graphql/types/security/codequality_reports_comparer_type.rb b/app/graphql/types/security/codequality_reports_comparer_type.rb
index c8c5a482830..32fe8c12330 100644
--- a/app/graphql/types/security/codequality_reports_comparer_type.rb
+++ b/app/graphql/types/security/codequality_reports_comparer_type.rb
@@ -8,6 +8,11 @@ module Types
description 'Represents reports comparison for code quality.'
+ field :status,
+ type: CodequalityReportsComparer::ReportGenerationStatusEnum,
+ null: true,
+ description: 'Compared codequality report generation status.'
+
field :report,
type: CodequalityReportsComparer::ReportType,
null: true,
diff --git a/app/helpers/ci/status_helper.rb b/app/helpers/ci/status_helper.rb
index 8bce1ccd778..21d982d42bc 100644
--- a/app/helpers/ci/status_helper.rb
+++ b/app/helpers/ci/status_helper.rb
@@ -15,7 +15,7 @@ module Ci
end
# rubocop:disable Metrics/CyclomaticComplexity
- def ci_icon_for_status(status, size: 16)
+ def ci_icon_for_status(status, size: 24)
icon_name =
if detailed_status?(status)
status.icon
@@ -50,16 +50,12 @@ module Ci
end
end
+ icon_name = icon_name == 'play' ? icon_name : "#{icon_name}_borderless"
+
sprite_icon(icon_name, size: size, css_class: 'gl-icon')
end
# rubocop:enable Metrics/CyclomaticComplexity
- def ci_icon_class_for_status(status)
- group = detailed_status?(status) ? status.group : status.dasherize
-
- "ci-status-icon-#{group}"
- end
-
def pipeline_status_cache_key(pipeline_status)
"pipeline-status/#{pipeline_status.sha}-#{pipeline_status.status}"
end
@@ -85,16 +81,17 @@ module Ci
show_status_text: false
)
variant = badge_variant(status)
- klass = "js-ci-status-badge-legacy ci-status-icon #{ci_icon_class_for_status(status)} gl-rounded-full gl-justify-content-center gl-line-height-0"
+ badge_classes = "ci-icon ci-icon-variant-#{variant} gl-p-2 #{option_css_classes}"
title = "#{_('Pipeline')}: #{ci_label_for_status(status)}"
data = { toggle: 'tooltip', placement: tooltip_placement, container: container, testid: 'ci-icon' }
- badge_classes = "ci-icon gl-p-2 #{option_css_classes}"
+
+ icon_wrapper_class = "js-ci-status-badge-legacy ci-icon-gl-icon-wrapper"
gl_badge_tag(variant: variant, size: :md, href: path, class: badge_classes, title: title, data: data) do
if show_status_text
- content_tag(:span, ci_icon_for_status(status), { class: klass }) + content_tag(:span, status.label, { class: 'gl-mx-2 gl-white-space-nowrap' })
+ content_tag(:span, ci_icon_for_status(status), { class: icon_wrapper_class }) + content_tag(:span, status.label, { class: 'gl-mx-2 gl-white-space-nowrap', data: { testid: 'ci-icon-text' } })
else
- content_tag(:span, ci_icon_for_status(status), { class: klass })
+ content_tag(:span, ci_icon_for_status(status), { class: icon_wrapper_class })
end
end
end
@@ -135,16 +132,18 @@ module Ci
case variant
when 'success'
:success
- when 'success-with-warnings', 'pending'
+ when 'success-with-warnings'
+ :warning
+ when 'pending'
+ :warning
+ when 'waiting-for-resource'
:warning
when 'failed'
:danger
when 'running'
:info
- when 'canceled', 'manual'
- :neutral
else
- :muted
+ :neutral
end
end
end
diff --git a/app/helpers/nav/new_dropdown_helper.rb b/app/helpers/nav/new_dropdown_helper.rb
index 5274ace3d8a..88e834b537a 100644
--- a/app/helpers/nav/new_dropdown_helper.rb
+++ b/app/helpers/nav/new_dropdown_helper.rb
@@ -132,6 +132,17 @@ module Nav
)
end
+ if Feature.enabled?(:ui_for_organizations, current_user) && current_user.can?(:create_organization)
+ menu_items.push(
+ ::Gitlab::Nav::TopNavMenuItem.build(
+ id: 'general_new_organization',
+ title: s_('Organization|New organization'),
+ href: new_organization_path,
+ data: { track_action: 'click_link_new_organization_parent', track_label: 'plus_menu_dropdown', track_property: 'navigation_top', testid: 'global_new_organization_link' }
+ )
+ )
+ end
+
if current_user.can?(:create_snippet)
menu_items.push(
::Gitlab::Nav::TopNavMenuItem.build(
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index 16541adf370..c4af5aad94e 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -34,6 +34,7 @@ module Ci
DEFAULT_CONFIG_PATH = '.gitlab-ci.yml'
CANCELABLE_STATUSES = (Ci::HasStatus::CANCELABLE_STATUSES + ['manual']).freeze
+ UNLOCKABLE_STATUSES = (Ci::Pipeline.completed_statuses + [:manual]).freeze
paginates_per 15
@@ -272,6 +273,32 @@ module Ci
pipeline.run_after_commit { PipelineMetricsWorker.perform_async(pipeline.id) }
end
+ after_transition any => UNLOCKABLE_STATUSES do |pipeline|
+ # This is a temporary flag that we added just in case we need to totally
+ # stop unlocking pipelines due to unexpected issues during rollout.
+ next if Feature.enabled?(:ci_stop_unlock_pipelines, pipeline.project)
+
+ next unless Feature.enabled?(:ci_unlock_non_successful_pipelines, pipeline.project)
+
+ pipeline.run_after_commit do
+ Ci::Refs::UnlockPreviousPipelinesWorker.perform_async(pipeline.ci_ref_id)
+ end
+ end
+
+ # TODO: Remove this block once we've completed roll-out of ci_unlock_non_successful_pipelines
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/428408
+ after_transition any => :success do |pipeline|
+ # This is a temporary flag that we added just in case we need to totally
+ # stop unlocking pipelines due to unexpected issues during rollout.
+ next if Feature.enabled?(:ci_stop_unlock_pipelines, pipeline.project)
+
+ next unless Feature.disabled?(:ci_unlock_non_successful_pipelines, pipeline.project)
+
+ pipeline.run_after_commit do
+ Ci::Refs::UnlockPreviousPipelinesWorker.perform_async(pipeline.ci_ref_id)
+ end
+ end
+
after_transition [:created, :waiting_for_resource, :preparing, :pending, :running] => :success do |pipeline|
# We wait a little bit to ensure that all Ci::BuildFinishedWorkers finish first
# because this is where some metrics like code coverage is parsed and stored
@@ -395,6 +422,7 @@ module Ci
end
end
+ scope :with_unlockable_status, -> { with_status(*UNLOCKABLE_STATUSES) }
scope :internal, -> { where(source: internal_sources) }
scope :no_child, -> { where.not(source: :parent_pipeline) }
scope :ci_sources, -> { where(source: Enums::Ci::Pipeline.ci_sources.values) }
diff --git a/app/models/ci/ref.rb b/app/models/ci/ref.rb
index 8655e8eb9b8..e8ce58f2de5 100644
--- a/app/models/ci/ref.rb
+++ b/app/models/ci/ref.rb
@@ -30,15 +30,6 @@ module Ci
state :fixed, value: 3
state :broken, value: 4
state :still_failing, value: 5
-
- after_transition any => [:fixed, :success] do |ci_ref|
- # Do not try to unlock if no artifacts are locked
- next unless ci_ref.artifacts_locked?
-
- ci_ref.run_after_commit do
- Ci::Refs::UnlockPreviousPipelinesWorker.perform_async(ci_ref.id)
- end
- end
end
class << self
@@ -75,5 +66,13 @@ module Ci
self.status_name
end
end
+
+ def last_successful_ci_source_pipeline
+ pipelines.ci_sources.success.order(id: :desc).first
+ end
+
+ def last_unlockable_ci_source_pipeline
+ pipelines.ci_sources.with_unlockable_status.order(id: :desc).first
+ end
end
end
diff --git a/app/models/packages/protection/rule.rb b/app/models/packages/protection/rule.rb
index 64ec56b989b..f13bcc6e32e 100644
--- a/app/models/packages/protection/rule.rb
+++ b/app/models/packages/protection/rule.rb
@@ -12,6 +12,12 @@ module Packages
validates :package_name_pattern, presence: true, uniqueness: { scope: [:project_id, :package_type] },
length: { maximum: 255 }
+ validates :package_name_pattern,
+ format: {
+ with: Gitlab::Regex.protection_rules_npm_package_name_pattern_regex,
+ message: ->(_object, _data) { _('should be a valid NPM package name with optional wildcard characters.') }
+ },
+ if: :npm?
validates :package_type, presence: true
validates :push_protected_up_to_access_level, presence: true
diff --git a/app/services/ci/refs/enqueue_pipelines_to_unlock_service.rb b/app/services/ci/refs/enqueue_pipelines_to_unlock_service.rb
index 319186ce030..4e9e9a2effe 100644
--- a/app/services/ci/refs/enqueue_pipelines_to_unlock_service.rb
+++ b/app/services/ci/refs/enqueue_pipelines_to_unlock_service.rb
@@ -7,13 +7,12 @@ module Ci
BATCH_SIZE = 50
ENQUEUE_INTERVAL_SECONDS = 0.1
+ EXCLUDED_IDS_LIMIT = 1000
def execute(ci_ref, before_pipeline: nil)
- pipelines_scope = ci_ref.pipelines.artifacts_locked
- pipelines_scope = pipelines_scope.before_pipeline(before_pipeline) if before_pipeline
total_new_entries = 0
- pipelines_scope.each_batch(of: BATCH_SIZE) do |batch|
+ pipelines_scope(ci_ref, before_pipeline).each_batch(of: BATCH_SIZE) do |batch|
pipeline_ids = batch.pluck(:id) # rubocop: disable CodeReuse/ActiveRecord
total_added = Ci::UnlockPipelineRequest.enqueue(pipeline_ids)
total_new_entries += total_added
@@ -27,6 +26,34 @@ module Ci
total_new_entries: total_new_entries
)
end
+
+ private
+
+ def pipelines_scope(ci_ref, before_pipeline)
+ scope = ci_ref.pipelines.artifacts_locked
+
+ if before_pipeline
+ # We use `same_family_pipeline_ids.map(&:id)` to force run the query and
+ # specifically pass the array of IDs to the NOT IN condition. If not, we would
+ # end up running the subquery for same_family_pipeline_ids on each batch instead.
+ excluded_ids = before_pipeline.same_family_pipeline_ids.map(&:id)
+ scope = scope.created_before_id(before_pipeline.id)
+
+ # When unlocking previous pipelines, we still want to keep the
+ # last successful CI source pipeline locked.
+ # If before_pipeline is not provided, like in the case of deleting a ref,
+ # we want to unlock all pipelines instead.
+ ci_ref.last_successful_ci_source_pipeline.try do |pipeline|
+ excluded_ids.concat(pipeline.same_family_pipeline_ids.map(&:id))
+ end
+
+ # We add a limit to the excluded IDs just to be safe and avoid any
+ # arity issues with the NOT IN query.
+ scope = scope.where.not(id: excluded_ids.take(EXCLUDED_IDS_LIMIT)) # rubocop: disable CodeReuse/ActiveRecord
+ end
+
+ scope
+ end
end
end
end
diff --git a/app/workers/ci/refs/unlock_previous_pipelines_worker.rb b/app/workers/ci/refs/unlock_previous_pipelines_worker.rb
index bf595590cb1..588ec4ce1f0 100644
--- a/app/workers/ci/refs/unlock_previous_pipelines_worker.rb
+++ b/app/workers/ci/refs/unlock_previous_pipelines_worker.rb
@@ -14,7 +14,9 @@ module Ci
def perform(ref_id)
::Ci::Ref.find_by_id(ref_id).try do |ref|
- pipeline = ref.last_finished_pipeline
+ next unless ref.artifacts_locked?
+
+ pipeline = ref.last_unlockable_ci_source_pipeline
result = ::Ci::Refs::EnqueuePipelinesToUnlockService.new.execute(ref, before_pipeline: pipeline)
log_extra_metadata_on_done(:total_pending_entries, result[:total_pending_entries])
diff --git a/config/feature_flags/development/ci_stop_unlock_pipelines.yml b/config/feature_flags/development/ci_stop_unlock_pipelines.yml
new file mode 100644
index 00000000000..a7ca6b73b4e
--- /dev/null
+++ b/config/feature_flags/development/ci_stop_unlock_pipelines.yml
@@ -0,0 +1,8 @@
+---
+name: ci_stop_unlock_pipelines
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/134967
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/428408
+milestone: '16.6'
+type: development
+group: group::pipeline security
+default_enabled: false
diff --git a/config/feature_flags/development/ci_unlock_non_successful_pipelines.yml b/config/feature_flags/development/ci_unlock_non_successful_pipelines.yml
new file mode 100644
index 00000000000..4cba44f5de4
--- /dev/null
+++ b/config/feature_flags/development/ci_unlock_non_successful_pipelines.yml
@@ -0,0 +1,8 @@
+---
+name: ci_unlock_non_successful_pipelines
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/134967
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/428408
+milestone: '16.5'
+type: development
+group: group::pipeline security
+default_enabled: false
diff --git a/config/feature_flags/ops/automatic_lock_writes_on_partition_tables.yml b/config/feature_flags/ops/automatic_lock_writes_on_partition_tables.yml
index a3fb9020d5d..dcaa0c9b4cb 100644
--- a/config/feature_flags/ops/automatic_lock_writes_on_partition_tables.yml
+++ b/config/feature_flags/ops/automatic_lock_writes_on_partition_tables.yml
@@ -5,4 +5,4 @@ rollout_issue_url:
milestone: '16.5'
type: ops
group: group::tenant scale
-default_enabled: false
+default_enabled: true
diff --git a/danger/gitlab_schema_validation/Dangerfile b/danger/gitlab_schema_validation/Dangerfile
new file mode 100644
index 00000000000..3d44ad592ae
--- /dev/null
+++ b/danger/gitlab_schema_validation/Dangerfile
@@ -0,0 +1,3 @@
+# frozen_string_literal: true
+
+gitlab_schema_validation.add_suggestions_on_using_clusterwide_schema
diff --git a/danger/plugins/gitlab_schema_validation.rb b/danger/plugins/gitlab_schema_validation.rb
new file mode 100644
index 00000000000..ca4bc1a12be
--- /dev/null
+++ b/danger/plugins/gitlab_schema_validation.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require_relative '../../tooling/danger/gitlab_schema_validation_suggestion'
+
+module Danger
+ class GitlabSchemaValidation < ::Danger::Plugin
+ include Tooling::Danger::GitlabSchemaValidationSuggestion
+ end
+end
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 7a37881d208..3a0825fc5dd 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -15393,6 +15393,7 @@ Represents reports comparison for code quality.
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="codequalityreportscomparerreport"></a>`report` | [`CodequalityReportsComparerReport`](#codequalityreportscomparerreport) | Compared codequality report. |
+| <a id="codequalityreportscomparerstatus"></a>`status` | [`CodequalityReportsComparerReportGenerationStatus`](#codequalityreportscomparerreportgenerationstatus) | Compared codequality report generation status. |
### `CodequalityReportsComparerReport`
@@ -15405,7 +15406,7 @@ Represents compared code quality report.
| <a id="codequalityreportscomparerreportexistingerrors"></a>`existingErrors` | [`[CodequalityReportsComparerReportDegradation!]`](#codequalityreportscomparerreportdegradation) | All code quality degradations. |
| <a id="codequalityreportscomparerreportnewerrors"></a>`newErrors` | [`[CodequalityReportsComparerReportDegradation!]!`](#codequalityreportscomparerreportdegradation) | New code quality degradations. |
| <a id="codequalityreportscomparerreportresolvederrors"></a>`resolvedErrors` | [`[CodequalityReportsComparerReportDegradation!]`](#codequalityreportscomparerreportdegradation) | Resolved code quality degradations. |
-| <a id="codequalityreportscomparerreportstatus"></a>`status` | [`CodequalityReportsComparerReportStatus!`](#codequalityreportscomparerreportstatus) | Status of report. |
+| <a id="codequalityreportscomparerreportstatus"></a>`status` | [`CodequalityReportsComparerStatus!`](#codequalityreportscomparerstatus) | Status of report. |
| <a id="codequalityreportscomparerreportsummary"></a>`summary` | [`CodequalityReportsComparerReportSummary!`](#codequalityreportscomparerreportsummary) | Codequality report summary. |
### `CodequalityReportsComparerReportDegradation`
@@ -28124,15 +28125,25 @@ Values for sorting variables.
| <a id="codequalitydegradationseverityminor"></a>`MINOR` | Code Quality degradation has a status of minor. |
| <a id="codequalitydegradationseverityunknown"></a>`UNKNOWN` | Code Quality degradation has a status of unknown. |
-### `CodequalityReportsComparerReportStatus`
+### `CodequalityReportsComparerReportGenerationStatus`
-Report comparison status.
+Represents the generation status of the compared codequality report.
+
+| Value | Description |
+| ----- | ----------- |
+| <a id="codequalityreportscomparerreportgenerationstatuserror"></a>`ERROR` | An error happened while generating the report. |
+| <a id="codequalityreportscomparerreportgenerationstatusparsed"></a>`PARSED` | Report was generated. |
+| <a id="codequalityreportscomparerreportgenerationstatusparsing"></a>`PARSING` | Report is being generated. |
+
+### `CodequalityReportsComparerStatus`
+
+Represents the state of the code quality report.
| Value | Description |
| ----- | ----------- |
-| <a id="codequalityreportscomparerreportstatusfailed"></a>`FAILED` | Report failed to generate. |
-| <a id="codequalityreportscomparerreportstatusnot_found"></a>`NOT_FOUND` | Head report or base report not found. |
-| <a id="codequalityreportscomparerreportstatussuccess"></a>`SUCCESS` | Report successfully generated. |
+| <a id="codequalityreportscomparerstatusfailed"></a>`FAILED` | Report generated and there are new code quality degradations. |
+| <a id="codequalityreportscomparerstatusnot_found"></a>`NOT_FOUND` | Head report or base report not found. |
+| <a id="codequalityreportscomparerstatussuccess"></a>`SUCCESS` | No degradations found in the head pipeline report. |
### `CommitActionMode`
diff --git a/doc/development/experiment_guide/implementing_experiments.md b/doc/development/experiment_guide/implementing_experiments.md
index 83369ad8e34..15b8f8fc192 100644
--- a/doc/development/experiment_guide/implementing_experiments.md
+++ b/doc/development/experiment_guide/implementing_experiments.md
@@ -8,7 +8,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
## Implementing an experiment
-[Examples](https://gitlab.com/gitlab-org/growth/growth/-/wikis/GLEX-Framework-code-examples)
+[Examples](https://gitlab.com/groups/gitlab-org/growth/-/wikis/GLEX-How-Tos)
Start by generating a feature flag using the `bin/feature-flag` command as you
usually would for a development feature flag, making sure to use `experiment` for
diff --git a/gems/config/rubocop.yml b/gems/config/rubocop.yml
index d6139bef1b5..ca46e30e2cd 100644
--- a/gems/config/rubocop.yml
+++ b/gems/config/rubocop.yml
@@ -100,6 +100,9 @@ RSpec/FeatureCategory:
Style/HashSyntax:
Enabled: false
+Style/InlineDisableAnnotation:
+ Enabled: false
+
Style/Lambda:
EnforcedStyle: literal
diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb
index 2fd9dc9fa09..6ac37986d5c 100644
--- a/lib/gitlab/regex.rb
+++ b/lib/gitlab/regex.rb
@@ -5,6 +5,7 @@ module Gitlab
extend self
extend MergeRequests
extend Packages
+ extend Packages::Protection::Rules
def project_name_regex
# The character range \p{Alnum} overlaps with \u{00A9}-\u{1f9ff}
diff --git a/lib/gitlab/regex/packages.rb b/lib/gitlab/regex/packages.rb
index 6b178933a25..a0038d39318 100644
--- a/lib/gitlab/regex/packages.rb
+++ b/lib/gitlab/regex/packages.rb
@@ -3,6 +3,8 @@
module Gitlab
module Regex
module Packages
+ include ::Gitlab::Utils::StrongMemoize
+
CONAN_RECIPE_FILES = %w[conanfile.py conanmanifest.txt conan_sources.tgz conan_export.tgz].freeze
CONAN_PACKAGE_FILES = %w[conaninfo.txt conanmanifest.txt conan_package.tgz].freeze
@@ -74,8 +76,10 @@ module Gitlab
maven_app_name_regex
end
- def npm_package_name_regex
- @npm_package_name_regex ||= %r{\A(?:@(#{Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX})/)?[-+\.\_a-zA-Z0-9]+\z}o
+ def npm_package_name_regex(other_accepted_chars = nil)
+ strong_memoize_with(:npm_package_name_regex, other_accepted_chars) do
+ %r{\A(?:@(#{Gitlab::PathRegex::NAMESPACE_FORMAT_REGEX})/)?[-+\.\_a-zA-Z0-9#{other_accepted_chars}]+\z}
+ end
end
def npm_package_name_regex_message
diff --git a/lib/gitlab/regex/packages/protection/rules.rb b/lib/gitlab/regex/packages/protection/rules.rb
new file mode 100644
index 00000000000..383f26fe92d
--- /dev/null
+++ b/lib/gitlab/regex/packages/protection/rules.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Regex
+ module Packages
+ module Protection
+ module Rules
+ def protection_rules_npm_package_name_pattern_regex
+ @protection_rules_npm_package_name_pattern_regex ||= npm_package_name_regex('*')
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 3626a09e83a..58d123638b1 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -44313,6 +44313,9 @@ msgstr ""
msgid "Session duration (minutes)"
msgstr ""
+msgid "Session|There was a error loading the user verification challenge. Refresh to try again."
+msgstr ""
+
msgid "Set %{epic_ref} as the parent epic."
msgstr ""
@@ -57830,6 +57833,9 @@ msgstr ""
msgid "severity|Unknown"
msgstr ""
+msgid "should be a valid NPM package name with optional wildcard characters."
+msgstr ""
+
msgid "should be an array of %{object_name} objects"
msgstr ""
diff --git a/qa/qa/page/project/pipeline/show.rb b/qa/qa/page/project/pipeline/show.rb
index 16b931c1a56..151df85af3d 100644
--- a/qa/qa/page/project/pipeline/show.rb
+++ b/qa/qa/page/project/pipeline/show.rb
@@ -43,7 +43,7 @@ module QA
def has_build?(name, status: :success, wait: nil)
if status
within_element('job-item-container', text: name) do
- has_selector?(".ci-status-icon-#{status}", **{ wait: wait }.compact)
+ has_selector?("[data-testid='status_#{status}_borderless-icon']", **{ wait: wait }.compact)
end
else
has_element?('job-item-container', text: name)
diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb
index f9b8f7dcd1b..642e941adc8 100644
--- a/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb
+++ b/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb
@@ -2,7 +2,8 @@
module QA
RSpec.describe 'Verify', :runner, product_group: :pipeline_security do
- describe "Unlocking job artifacts across pipelines" do
+ describe "Unlocking job artifacts across pipelines", feature_flag: { name: 'ci_unlock_non_successful_pipelines,
+ scope: :project' } do
let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" }
let(:project) { create(:project, name: 'unlock-job-artifacts-project') }
@@ -15,11 +16,13 @@ module QA
end
before do
+ Runtime::Feature.enable(:ci_unlock_non_successful_pipelines, project: project)
Flow::Login.sign_in
project.visit!
end
after do
+ Runtime::Feature.disable(:ci_unlock_non_successful_pipelines, project: project)
runner.remove_via_api!
end
@@ -59,11 +62,7 @@ module QA
end
it 'keeps job artifacts from latest failed pipelines and from latest successful pipeline',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/394808',
- quarantine: {
- issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/266958',
- type: :bug
- } do
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/394808' do
update_ci_file(job_name: 'failed_job_1', script: 'exit 1')
Flow::Pipeline.wait_for_latest_pipeline(status: 'Failed')
@@ -94,11 +93,7 @@ module QA
end
it 'keeps job artifacts from the latest blocked pipeline and from latest successful pipeline',
- testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/395511',
- quarantine: {
- issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/387087',
- type: :bug
- } do
+ testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/395511' do
update_ci_with_manual_job(job_name: 'successful_job_with_manual_1', script: 'echo test')
Flow::Pipeline.wait_for_latest_pipeline(status: 'Blocked')
diff --git a/rubocop/cop/style/inline_disable_annotation.rb b/rubocop/cop/style/inline_disable_annotation.rb
new file mode 100644
index 00000000000..c3db541fe82
--- /dev/null
+++ b/rubocop/cop/style/inline_disable_annotation.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+module RuboCop
+ module Cop
+ module Style
+ # rubocop:disable Lint/RedundantCopDisableDirective -- For examples
+ # Checks that rubocop inline disabling is formatted according
+ # to guidelines.
+ # See: https://docs.gitlab.com/ee/development/rubocop_development_guide.html#disabling-rules-inline,
+ # https://gitlab.com/gitlab-org/gitlab/-/issues/428762
+ #
+ # # bad
+ # # rubocop:disable Some/Cop, Another/Cop
+ #
+ # # good
+ # # rubocop:disable Some/Cop, Another/Cop -- Some reason
+ #
+ # rubocop:enable Lint/RedundantCopDisableDirective
+ class InlineDisableAnnotation < RuboCop::Cop::Base
+ include RangeHelp
+
+ COP_DISABLE = '#\s*rubocop\s*:\s*(?:disable|todo)\s+'
+ BAD_DISABLE = %r{\A(?<line>(?<disabling>#{COP_DISABLE}(?:[\w/]+(?:\s*,\s*[\w/]+)*))\s*)(?!.*\s*--\s\S).*}
+ COP_DISABLE_LINE = /\A(?<line>#{COP_DISABLE}.*)\Z/
+ MSG = <<~MESSAGE
+ Inline disabling a cop needs to follow the format of `%{disable} -- Some reason`.
+ See https://docs.gitlab.com/ee/development/rubocop_development_guide.html#disabling-rules-inline.
+ MESSAGE
+
+ def on_new_investigation
+ processed_source.comments.each do |comment|
+ candidate_match = COP_DISABLE_LINE.match(comment.text)
+ # Pre-filter to ensure we are on a comment that is for a rubocop disabling
+ next unless candidate_match
+
+ bad_match = BAD_DISABLE.match(comment.text)
+ # Only the badly formatted lines make it past this.
+ next unless bad_match
+
+ add_offense(
+ source_range(
+ processed_source.buffer, comment.loc.line, comment.loc.column, candidate_match[:line].length
+ ),
+ message: format(MSG, disable: bad_match[:disabling])
+ )
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/commits_spec.rb b/spec/features/commits_spec.rb
index 71af021eded..8f6c1c28872 100644
--- a/spec/features/commits_spec.rb
+++ b/spec/features/commits_spec.rb
@@ -82,7 +82,7 @@ RSpec.describe 'Commits', feature_category: :source_code_management do
it 'shows correct build status from default branch' do
page.within("//li[@id='commit-#{pipeline.short_sha}']") do
expect(page).to have_css("[data-testid='ci-icon']")
- expect(page).to have_css('.ci-status-icon-success')
+ expect(page).to have_css('[data-testid="status_success_borderless-icon"]')
end
end
end
diff --git a/spec/features/dashboard/projects_spec.rb b/spec/features/dashboard/projects_spec.rb
index 42ed3a1959e..5379dabc713 100644
--- a/spec/features/dashboard/projects_spec.rb
+++ b/spec/features/dashboard/projects_spec.rb
@@ -154,7 +154,7 @@ RSpec.describe 'Dashboard Projects', :js, feature_category: :groups_and_projects
page.within('[data-testid="project_controls"]') do
expect(page).to have_xpath("//a[@href='#{pipelines_project_commit_path(project, project.commit, ref: pipeline.ref)}']")
expect(page).to have_css("[data-testid='ci-icon']")
- expect(page).to have_css('.ci-status-icon-success')
+ expect(page).to have_css('[data-testid="status_success_borderless-icon"]')
expect(page).to have_link('Pipeline: passed')
end
end
@@ -166,7 +166,7 @@ RSpec.describe 'Dashboard Projects', :js, feature_category: :groups_and_projects
page.within('[data-testid="project_controls"]') do
expect(page).not_to have_xpath("//a[@href='#{pipelines_project_commit_path(project, project.commit, ref: pipeline.ref)}']")
expect(page).not_to have_css("[data-testid='ci-icon']")
- expect(page).not_to have_css('.ci-status-icon-success')
+ expect(page).not_to have_css('[data-testid="status_success_borderless-icon"]')
expect(page).not_to have_link('Pipeline: passed')
end
end
diff --git a/spec/features/merge_request/user_sees_merge_widget_spec.rb b/spec/features/merge_request/user_sees_merge_widget_spec.rb
index 18537d1cddb..c18b2c97f96 100644
--- a/spec/features/merge_request/user_sees_merge_widget_spec.rb
+++ b/spec/features/merge_request/user_sees_merge_widget_spec.rb
@@ -176,7 +176,7 @@ RSpec.describe 'Merge request > User sees merge widget', :js, feature_category:
expect(page).to have_content("Merge blocked")
expect(page).to have_content(
"pipeline must succeed. It's waiting for a manual action to continue.")
- expect(page).to have_css('.ci-status-icon-manual')
+ expect(page).to have_css('[data-testid="status_manual_borderless-icon"]')
end
end
diff --git a/spec/features/projects/blobs/blob_show_spec.rb b/spec/features/projects/blobs/blob_show_spec.rb
index 30a81ccc071..36665f2b77d 100644
--- a/spec/features/projects/blobs/blob_show_spec.rb
+++ b/spec/features/projects/blobs/blob_show_spec.rb
@@ -941,9 +941,7 @@ RSpec.describe 'File blob', :js, feature_category: :groups_and_projects do
it 'shows the realtime pipeline status' do
page.within('.commit-actions') do
- expect(page).to have_css('.ci-status-icon')
- expect(page).to have_css('.ci-status-icon-running')
- expect(page).to have_selector('[data-testid="status_running-icon"]')
+ expect(page).to have_selector('[data-testid="status_running_borderless-icon"]')
end
end
end
diff --git a/spec/features/projects/branches_spec.rb b/spec/features/projects/branches_spec.rb
index 79e9ca7998e..7915f446ee0 100644
--- a/spec/features/projects/branches_spec.rb
+++ b/spec/features/projects/branches_spec.rb
@@ -299,13 +299,13 @@ RSpec.describe 'Branches', feature_category: :groups_and_projects do
it 'shows pipeline status when available' do
page.within first('.all-branches li') do
- expect(page).to have_css 'a.gl-badge .ci-status-icon-success'
+ expect(page).to have_css '[data-testid="status_success_borderless-icon"]'
end
end
it 'displays a placeholder when not available' do
page.all('.all-branches li') do |li|
- expect(li).to have_css '.pipeline-status svg.s16'
+ expect(li).to have_css '.pipeline-status svg.s24'
end
end
end
@@ -317,7 +317,7 @@ RSpec.describe 'Branches', feature_category: :groups_and_projects do
it 'does not show placeholder or pipeline status' do
page.all('.all-branches') do |branches|
- expect(branches).not_to have_css '.pipeline-status svg.s16'
+ expect(branches).not_to have_css '.pipeline-status svg.s24'
end
end
end
diff --git a/spec/features/projects/commit/mini_pipeline_graph_spec.rb b/spec/features/projects/commit/mini_pipeline_graph_spec.rb
index 5bb3d1af924..c0a8dabf648 100644
--- a/spec/features/projects/commit/mini_pipeline_graph_spec.rb
+++ b/spec/features/projects/commit/mini_pipeline_graph_spec.rb
@@ -52,7 +52,7 @@ RSpec.describe 'Mini Pipeline Graph in Commit View', :js, feature_category: :sou
end
it 'display icon with status' do
- expect(page).to have_selector('.ci-status-icon-running')
+ expect(page).to have_selector('[data-testid="status_running_borderless-icon"]')
end
it 'displays a mini pipeline graph' do
@@ -63,7 +63,7 @@ RSpec.describe 'Mini Pipeline Graph in Commit View', :js, feature_category: :sou
wait_for_requests
page.within '.js-builds-dropdown-list' do
- expect(page).to have_selector('.ci-status-icon-running')
+ expect(page).to have_selector('[data-testid="status_running_borderless-icon"]')
expect(page).to have_content(build.stage_name)
end
diff --git a/spec/features/projects/files/user_reads_pipeline_status_spec.rb b/spec/features/projects/files/user_reads_pipeline_status_spec.rb
index ce3f0541139..24dd673501c 100644
--- a/spec/features/projects/files/user_reads_pipeline_status_spec.rb
+++ b/spec/features/projects/files/user_reads_pipeline_status_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe 'user reads pipeline status', :js, feature_category: :groups_and_
page.within('.commit-detail') do
expect(page).to have_link('', href: project_pipeline_path(project, expected_pipeline))
- expect(page).to have_selector(".ci-status-icon-#{expected_pipeline.status}")
+ expect(page).to have_selector("[data-testid='status_#{expected_pipeline.status}_borderless-icon']")
end
end
end
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index ae0b02dac07..fccfe00f593 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -165,7 +165,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
it 'shows a running icon and a cancel action for the running build' do
page.within('#ci-badge-deploy') do
- expect(page).to have_selector('[data-testid="status_running-icon"]')
+ expect(page).to have_selector('[data-testid="status_running_borderless-icon"]')
expect(page).to have_selector('.js-icon-cancel')
expect(page).to have_content('deploy')
end
@@ -187,7 +187,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
it 'shows a preparing icon and a cancel action' do
page.within('#ci-badge-prepare') do
- expect(page).to have_selector('[data-testid="status_preparing-icon"]')
+ expect(page).to have_selector('[data-testid="status_preparing_borderless-icon"]')
expect(page).to have_selector('.js-icon-cancel')
expect(page).to have_content('prepare')
end
@@ -209,7 +209,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
it 'shows the success icon and a retry action for the successful build' do
page.within('#ci-badge-build') do
- expect(page).to have_selector('[data-testid="status_success-icon"]')
+ expect(page).to have_selector('[data-testid="status_success_borderless-icon"]')
expect(page).to have_content('build')
end
@@ -238,7 +238,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
it 'shows the scheduled icon and an unschedule action for the delayed job' do
page.within('#ci-badge-delayed-job') do
- expect(page).to have_selector('[data-testid="status_scheduled-icon"]')
+ expect(page).to have_selector('[data-testid="status_scheduled_borderless-icon"]')
expect(page).to have_content('delayed-job')
end
@@ -263,7 +263,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
it 'shows the failed icon and a retry action for the failed build' do
page.within('#ci-badge-test') do
- expect(page).to have_selector('[data-testid="status_failed-icon"]')
+ expect(page).to have_selector('[data-testid="status_failed_borderless-icon"]')
expect(page).to have_content('test')
end
@@ -297,7 +297,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
it 'shows the skipped icon and a play action for the manual build' do
page.within('#ci-badge-manual-build') do
- expect(page).to have_selector('[data-testid="status_manual-icon"]')
+ expect(page).to have_selector('[data-testid="status_manual_borderless-icon"]')
expect(page).to have_content('manual')
end
@@ -323,7 +323,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
end
it 'shows the success icon and the generic comit status build' do
- expect(page).to have_selector('[data-testid="status_success-icon"]')
+ expect(page).to have_selector('[data-testid="status_success_borderless-icon"]')
expect(page).to have_content('jenkins')
expect(page).to have_link('jenkins', href: 'http://gitlab.com/status')
end
@@ -358,7 +358,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
let(:status) { :success }
it 'does not show the cancel or retry action' do
- expect(page).to have_selector('.ci-status-icon-success')
+ expect(page).to have_selector('[data-testid="status_success_borderless-icon"]')
expect(page).not_to have_selector('button[aria-label="Retry downstream pipeline"]')
expect(page).not_to have_selector('button[aria-label="Cancel downstream pipeline"]')
end
@@ -379,7 +379,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
it 'shows the pipeline as canceled with the retry action' do
expect(page).to have_selector('button[aria-label="Retry downstream pipeline"]')
- expect(page).to have_selector('.ci-status-icon-canceled')
+ expect(page).to have_selector('[data-testid="status_canceled_borderless-icon"]')
end
end
end
@@ -398,7 +398,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
end
it 'shows running pipeline with the cancel action' do
- expect(page).to have_selector('.ci-status-icon-running')
+ expect(page).to have_selector('[data-testid="status_running_borderless-icon"]')
expect(page).to have_selector('button[aria-label="Cancel downstream pipeline"]')
end
end
@@ -418,7 +418,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
end
it 'shows running pipeline with the cancel action' do
- expect(page).to have_selector('.ci-status-icon-running')
+ expect(page).to have_selector('[data-testid="status_running_borderless-icon"]')
expect(page).to have_selector('button[aria-label="Cancel downstream pipeline"]')
end
end
@@ -438,7 +438,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
end
it 'does not show the retry button' do
- expect(page).to have_selector('.ci-status-icon-failed')
+ expect(page).to have_selector('[data-testid="status_failed_borderless-icon"]')
expect(page).not_to have_selector('button[aria-label="Retry downstream pipeline"]')
end
end
@@ -782,8 +782,8 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
expect(page).to have_content('Cancel pipeline')
end
- it 'does not link to job', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/408215' do
- expect(page).not_to have_selector('.js-pipeline-graph-job-link')
+ it 'does link to job' do
+ expect(page).to have_selector('.js-pipeline-graph-job-link')
end
end
end
@@ -906,12 +906,12 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
within('.js-pipeline-graph') do
within(all('[data-testid="stage-column"]')[0]) do
expect(page).to have_content('test')
- expect(page).to have_css('.ci-status-icon-pending')
+ expect(page).to have_css('[data-testid="status_pending_borderless-icon"]')
end
within(all('[data-testid="stage-column"]')[1]) do
expect(page).to have_content('deploy')
- expect(page).to have_css('.ci-status-icon-created')
+ expect(page).to have_css('[data-testid="status_created_borderless-icon"]')
end
end
end
@@ -931,12 +931,12 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
within('.js-pipeline-graph') do
within(all('[data-testid="stage-column"]')[0]) do
expect(page).to have_content('test')
- expect(page).to have_css('.ci-status-icon-success')
+ expect(page).to have_css('[data-testid="status_success_borderless-icon"]')
end
within(all('[data-testid="stage-column"]')[1]) do
expect(page).to have_content('deploy')
- expect(page).to have_css('.ci-status-icon-pending')
+ expect(page).to have_css('[data-testid="status_pending_borderless-icon"]')
end
end
end
@@ -960,7 +960,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
within('.js-pipeline-graph') do
within(all('[data-testid="stage-column"]')[1]) do
expect(page).to have_content('deploy')
- expect(page).to have_css('.ci-status-icon-waiting-for-resource')
+ expect(page).to have_css('[data-testid="status_pending_borderless-icon"]')
end
end
end
@@ -980,7 +980,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
within('.js-pipeline-graph') do
within(all('[data-testid="stage-column"]')[1]) do
expect(page).to have_content('deploy')
- expect(page).to have_css('.ci-status-icon-pending')
+ expect(page).to have_css('[data-testid="status_pending_borderless-icon"]')
end
end
end
@@ -1008,7 +1008,7 @@ RSpec.describe 'Pipeline', :js, feature_category: :continuous_integration do
within('.js-pipeline-graph') do
within(all('[data-testid="stage-column"]')[1]) do
expect(page).to have_content('deploy')
- expect(page).to have_css('.ci-status-icon-waiting-for-resource')
+ expect(page).to have_css('[data-testid="status_pending_borderless-icon"]')
end
end
end
diff --git a/spec/frontend/ci/pipeline_details/graph/components/job_item_spec.js b/spec/frontend/ci/pipeline_details/graph/components/job_item_spec.js
index cda84a9e4d3..10db7f398fe 100644
--- a/spec/frontend/ci/pipeline_details/graph/components/job_item_spec.js
+++ b/spec/frontend/ci/pipeline_details/graph/components/job_item_spec.js
@@ -87,7 +87,9 @@ describe('pipeline graph job item', () => {
expect(link.attributes('title')).toBe(`${mockJob.name} - ${mockJob.status.label}`);
expect(findJobCiIcon().exists()).toBe(true);
- expect(findJobCiIcon().find('.ci-status-icon-success').exists()).toBe(true);
+ expect(findJobCiIcon().find('[data-testid="status_success_borderless-icon"]').exists()).toBe(
+ true,
+ );
expect(wrapper.text()).toBe(mockJob.name);
});
@@ -106,7 +108,9 @@ describe('pipeline graph job item', () => {
it('should render status and name', () => {
expect(findJobCiIcon().exists()).toBe(true);
- expect(findJobCiIcon().find('.ci-status-icon-success').exists()).toBe(true);
+ expect(findJobCiIcon().find('[data-testid="status_success_borderless-icon"]').exists()).toBe(
+ true,
+ );
expect(findJobLink().exists()).toBe(false);
expect(wrapper.text()).toBe(mockJobWithoutDetails.name);
diff --git a/spec/frontend/ci/pipeline_details/graph/components/job_name_component_spec.js b/spec/frontend/ci/pipeline_details/graph/components/job_name_component_spec.js
index ca201aee648..1da85ad9f78 100644
--- a/spec/frontend/ci/pipeline_details/graph/components/job_name_component_spec.js
+++ b/spec/frontend/ci/pipeline_details/graph/components/job_name_component_spec.js
@@ -25,6 +25,6 @@ describe('job name component', () => {
it('should render an icon with the provided status', () => {
expect(wrapper.findComponent(CiIcon).exists()).toBe(true);
- expect(wrapper.find('.ci-status-icon-success').exists()).toBe(true);
+ expect(wrapper.find('[data-testid="status_success_borderless-icon"]').exists()).toBe(true);
});
});
diff --git a/spec/frontend/ci/pipeline_details/graph/components/linked_pipeline_spec.js b/spec/frontend/ci/pipeline_details/graph/components/linked_pipeline_spec.js
index 5fe8581e81b..72be51575d7 100644
--- a/spec/frontend/ci/pipeline_details/graph/components/linked_pipeline_spec.js
+++ b/spec/frontend/ci/pipeline_details/graph/components/linked_pipeline_spec.js
@@ -93,7 +93,7 @@ describe('Linked pipeline', () => {
});
it('should render the pipeline status icon svg', () => {
- expect(wrapper.find('.ci-status-icon-success svg').exists()).toBe(true);
+ expect(wrapper.findByTestId('status_success_borderless-icon').exists()).toBe(true);
});
it('should have a ci-status child component', () => {
diff --git a/spec/frontend/ci/pipeline_mini_graph/linked_pipelines_mini_list_spec.js b/spec/frontend/ci/pipeline_mini_graph/linked_pipelines_mini_list_spec.js
index 3c9d235bfcc..55ce3c79039 100644
--- a/spec/frontend/ci/pipeline_mini_graph/linked_pipelines_mini_list_spec.js
+++ b/spec/frontend/ci/pipeline_mini_graph/linked_pipelines_mini_list_spec.js
@@ -51,7 +51,7 @@ describe('Linked pipeline mini list', () => {
});
it('should render the correct ci status icon', () => {
- expect(findCiIcon().classes('ci-status-icon-running')).toBe(true);
+ expect(wrapper.find('[data-testid="status_running_borderless-icon"]').exists()).toBe(true);
});
it('should have an activated tooltip', () => {
@@ -95,7 +95,7 @@ describe('Linked pipeline mini list', () => {
});
it('should render the correct ci status icon', () => {
- expect(findCiIcon().classes('ci-status-icon-running')).toBe(true);
+ expect(wrapper.find('[data-testid="status_running_borderless-icon"]').exists()).toBe(true);
});
it('should have an activated tooltip', () => {
diff --git a/spec/frontend/ide/components/jobs/detail/description_spec.js b/spec/frontend/ide/components/jobs/detail/description_spec.js
index 5465615bf38..909bd1f7c90 100644
--- a/spec/frontend/ide/components/jobs/detail/description_spec.js
+++ b/spec/frontend/ide/components/jobs/detail/description_spec.js
@@ -20,7 +20,8 @@ describe('IDE job description', () => {
});
it('renders CI icon', () => {
- expect(wrapper.find('.ci-status-icon').findComponent(GlIcon).exists()).toBe(true);
+ expect(wrapper.find('[data-testid="ci-icon"]').findComponent(GlIcon).exists()).toBe(true);
+ expect(wrapper.find('[data-testid="status_success_borderless-icon"]').exists()).toBe(true);
});
it('renders bridge job details without the job link', () => {
diff --git a/spec/frontend/ide/components/jobs/item_spec.js b/spec/frontend/ide/components/jobs/item_spec.js
index dc0f732d11e..aa6fc5531dd 100644
--- a/spec/frontend/ide/components/jobs/item_spec.js
+++ b/spec/frontend/ide/components/jobs/item_spec.js
@@ -18,7 +18,7 @@ describe('IDE jobs item', () => {
});
it('renders CI icon', () => {
- expect(wrapper.find('[data-testid="status_success-icon"]').exists()).toBe(true);
+ expect(wrapper.find('[data-testid="ci-icon"]').exists()).toBe(true);
});
it('does not render view logs button if not started', async () => {
diff --git a/spec/frontend/vue_shared/components/ci_icon_spec.js b/spec/frontend/vue_shared/components/ci_icon_spec.js
index 1dc46538ec4..cbb725bf9e6 100644
--- a/spec/frontend/vue_shared/components/ci_icon_spec.js
+++ b/spec/frontend/vue_shared/components/ci_icon_spec.js
@@ -2,52 +2,135 @@ import { GlIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import CiIcon from '~/vue_shared/components/ci_icon.vue';
+const mockStatus = {
+ group: 'success',
+ icon: 'status_success',
+ text: 'Success',
+};
+
describe('CI Icon component', () => {
let wrapper;
- const createComponent = (props) => {
+ const createComponent = ({ props = {} } = {}) => {
wrapper = shallowMount(CiIcon, {
propsData: {
+ status: mockStatus,
...props,
},
});
};
- it('should render a span element with an svg', () => {
- createComponent({
- status: {
- group: 'success',
- icon: 'status_success',
- },
+ const findIcon = () => wrapper.findComponent(GlIcon);
+
+ it('should render a span element and an icon', () => {
+ createComponent();
+
+ expect(wrapper.attributes('size')).toBe('md');
+ expect(findIcon().exists()).toBe(true);
+ });
+
+ describe.each`
+ showStatusText | showTooltip | expectedText | expectedTooltip | expectedAriaLabel
+ ${true} | ${true} | ${'Success'} | ${undefined} | ${undefined}
+ ${true} | ${false} | ${'Success'} | ${undefined} | ${undefined}
+ ${false} | ${true} | ${''} | ${'Success'} | ${'Success'}
+ ${false} | ${false} | ${''} | ${undefined} | ${'Success'}
+ `(
+ 'when showStatusText is %{showStatusText} and showTooltip is %{showTooltip}',
+ ({ showStatusText, showTooltip, expectedText, expectedTooltip, expectedAriaLabel }) => {
+ beforeEach(() => {
+ createComponent({
+ props: {
+ showStatusText,
+ showTooltip,
+ },
+ });
+ });
+
+ it(`aria-label is ${expectedAriaLabel}`, () => {
+ expect(wrapper.attributes('aria-label')).toBe(expectedAriaLabel);
+ });
+
+ it(`text shown is ${expectedAriaLabel}`, () => {
+ expect(wrapper.text()).toBe(expectedText);
+ });
+
+ it(`tooltip shown is ${expectedAriaLabel}`, () => {
+ expect(wrapper.attributes('title')).toBe(expectedTooltip);
+ });
+ },
+ );
+
+ describe('when appearing as a link', () => {
+ it('shows a GraphQL path', () => {
+ createComponent({
+ props: {
+ status: {
+ ...mockStatus,
+ detailsPath: '/path',
+ },
+ useLink: true,
+ },
+ });
+
+ expect(wrapper.attributes('href')).toBe('/path');
+ });
+
+ it('shows a REST API path', () => {
+ createComponent({
+ props: {
+ status: {
+ ...mockStatus,
+ details_path: '/path',
+ },
+ useLink: true,
+ },
+ });
+
+ expect(wrapper.attributes('href')).toBe('/path');
});
- expect(wrapper.find('span').exists()).toBe(true);
- expect(wrapper.findComponent(GlIcon).exists()).toBe(true);
+ it('shows no path', () => {
+ createComponent({
+ status: {
+ detailsPath: '/path',
+ details_path: '/path',
+ },
+ props: {
+ useLink: false,
+ },
+ });
+
+ expect(wrapper.attributes('href')).toBe(undefined);
+ });
});
- describe('rendering a status', () => {
+ describe('rendering a status icon and class', () => {
it.each`
- icon | group | cssClass
- ${'status_success'} | ${'success'} | ${'ci-status-icon-success'}
- ${'status_failed'} | ${'failed'} | ${'ci-status-icon-failed'}
- ${'status_warning'} | ${'warning'} | ${'ci-status-icon-warning'}
- ${'status_pending'} | ${'pending'} | ${'ci-status-icon-pending'}
- ${'status_running'} | ${'running'} | ${'ci-status-icon-running'}
- ${'status_created'} | ${'created'} | ${'ci-status-icon-created'}
- ${'status_skipped'} | ${'skipped'} | ${'ci-status-icon-skipped'}
- ${'status_canceled'} | ${'canceled'} | ${'ci-status-icon-canceled'}
- ${'status_manual'} | ${'manual'} | ${'ci-status-icon-manual'}
- `('should render a $group status', ({ icon, group, cssClass }) => {
- wrapper = shallowMount(CiIcon, {
- propsData: {
+ icon | variant
+ ${'status_success'} | ${'success'}
+ ${'status_warning'} | ${'warning'}
+ ${'status_pending'} | ${'warning'}
+ ${'status_failed'} | ${'danger'}
+ ${'status_running'} | ${'info'}
+ ${'status_created'} | ${'neutral'}
+ ${'status_skipped'} | ${'neutral'}
+ ${'status_canceled'} | ${'neutral'}
+ ${'status_manual'} | ${'neutral'}
+ `('should render a $group status', ({ icon, variant }) => {
+ createComponent({
+ props: {
status: {
+ ...mockStatus,
icon,
- group,
},
+ showStatusText: true,
},
});
+ expect(wrapper.attributes('variant')).toBe(variant);
+ expect(wrapper.classes(`ci-icon-variant-${variant}`)).toBe(true);
- expect(wrapper.find('.ci-icon-wrapper').classes()).toContain(cssClass);
+ expect(findIcon().props('name')).toBe(`${icon}_borderless`);
});
});
});
diff --git a/spec/graphql/types/security/codequality_reports_comparer/report_generation_status_enum_spec.rb b/spec/graphql/types/security/codequality_reports_comparer/report_generation_status_enum_spec.rb
new file mode 100644
index 00000000000..16a115c37e0
--- /dev/null
+++ b/spec/graphql/types/security/codequality_reports_comparer/report_generation_status_enum_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe GitlabSchema.types['CodequalityReportsComparerReportGenerationStatus'], feature_category: :code_quality do
+ specify { expect(described_class.graphql_name).to eq('CodequalityReportsComparerReportGenerationStatus') }
+
+ it 'exposes all codequality report status values' do
+ expect(described_class.values.keys).to contain_exactly('PARSED', 'PARSING', 'ERROR')
+ end
+end
diff --git a/spec/graphql/types/security/codequality_reports_comparer/status_enum_spec.rb b/spec/graphql/types/security/codequality_reports_comparer/status_enum_spec.rb
index 6e5bdd1e91d..626873deffe 100644
--- a/spec/graphql/types/security/codequality_reports_comparer/status_enum_spec.rb
+++ b/spec/graphql/types/security/codequality_reports_comparer/status_enum_spec.rb
@@ -2,8 +2,8 @@
require 'spec_helper'
-RSpec.describe GitlabSchema.types['CodequalityReportsComparerReportStatus'], feature_category: :code_quality do
- specify { expect(described_class.graphql_name).to eq('CodequalityReportsComparerReportStatus') }
+RSpec.describe GitlabSchema.types['CodequalityReportsComparerStatus'], feature_category: :code_quality do
+ specify { expect(described_class.graphql_name).to eq('CodequalityReportsComparerStatus') }
it 'exposes all codequality report status values' do
expect(described_class.values.keys).to contain_exactly('SUCCESS', 'FAILED', 'NOT_FOUND')
diff --git a/spec/graphql/types/security/codequality_reports_comparer_type_spec.rb b/spec/graphql/types/security/codequality_reports_comparer_type_spec.rb
index 02f7a9d6925..fad43845b58 100644
--- a/spec/graphql/types/security/codequality_reports_comparer_type_spec.rb
+++ b/spec/graphql/types/security/codequality_reports_comparer_type_spec.rb
@@ -6,6 +6,6 @@ RSpec.describe GitlabSchema.types['CodequalityReportsComparer'], feature_categor
specify { expect(described_class.graphql_name).to eq('CodequalityReportsComparer') }
it 'has expected fields' do
- expect(described_class).to have_graphql_fields(:report)
+ expect(described_class).to have_graphql_fields(:status, :report)
end
end
diff --git a/spec/helpers/ci/status_helper_spec.rb b/spec/helpers/ci/status_helper_spec.rb
index 18983c83262..502a535e102 100644
--- a/spec/helpers/ci/status_helper_spec.rb
+++ b/spec/helpers/ci/status_helper_spec.rb
@@ -29,7 +29,7 @@ RSpec.describe Ci::StatusHelper do
end
it "has the success status icon" do
- is_expected.to include("ci-status-icon-success")
+ is_expected.to include("ci-icon-variant-success")
end
context "when pipeline has commit path" do
@@ -44,7 +44,19 @@ RSpec.describe Ci::StatusHelper do
end
it "has the correct status icon" do
- is_expected.to include("ci-status-icon-success")
+ is_expected.to include("ci-icon-variant-success")
+ end
+ end
+
+ context "when showing status text" do
+ subject do
+ detailed_status = Gitlab::Ci::Status::Success.new(build(:ci_build, :success), build(:user))
+ helper.render_ci_icon(detailed_status, show_status_text: true)
+ end
+
+ it "contains status text" do
+ is_expected.to include("data-testid=\"ci-icon-text\"")
+ is_expected.to include("passed")
end
end
@@ -79,56 +91,35 @@ RSpec.describe Ci::StatusHelper do
is_expected.to include('gl-badge badge badge-pill badge-neutral')
end
end
- end
- describe '#badge_variant' do
- using RSpec::Parameterized::TableSyntax
-
- where(:status, :expected_badge_variant_class) do
- 'success' | 'badge-success'
- 'success-with-warnings' | 'badge-warning'
- 'pending' | 'badge-warning'
- 'failed' | 'badge-danger'
- 'running' | 'badge-info'
- 'canceled' | 'badge-neutral'
- 'manual' | 'badge-neutral'
- 'other-status' | 'badge-muted'
- end
-
- with_them do
- subject { helper.render_ci_icon(status) }
-
- it 'uses the correct badge variant classes for gl-badge' do
- is_expected.to include("gl-badge badge badge-pill #{expected_badge_variant_class}")
+ describe 'badge and icon appearance' do
+ using RSpec::Parameterized::TableSyntax
+
+ where(:status, :icon, :badge_variant) do
+ 'success' | 'status_success_borderless' | 'success'
+ 'success-with-warnings' | 'status_warning_borderless' | 'warning'
+ 'pending' | 'status_pending_borderless' | 'warning'
+ 'waiting-for-resource' | 'status_pending_borderless' | 'warning'
+ 'failed' | 'status_failed_borderless' | 'danger'
+ 'running' | 'status_running_borderless' | 'info'
+ 'preparing' | 'status_preparing_borderless' | 'neutral'
+ 'canceled' | 'status_canceled_borderless' | 'neutral'
+ 'created' | 'status_created_borderless' | 'neutral'
+ 'scheduled' | 'status_scheduled_borderless' | 'neutral'
+ 'play' | 'play' | 'neutral'
+ 'skipped' | 'status_skipped_borderless' | 'neutral'
+ 'manual' | 'status_manual_borderless' | 'neutral'
+ 'other-status' | 'status_canceled_borderless' | 'neutral'
end
- end
- end
-
- describe '#ci_icon_for_status' do
- using RSpec::Parameterized::TableSyntax
-
- where(:status, :icon_variant) do
- 'success' | 'status_success'
- 'success-with-warnings' | 'status_warning'
- 'preparing' | 'status_preparing'
- 'pending' | 'status_pending'
- 'waiting-for-resource' | 'status_pending'
- 'failed' | 'status_failed'
- 'running' | 'status_running'
- 'canceled' | 'status_canceled'
- 'created' | 'status_created'
- 'scheduled' | 'status_scheduled'
- 'play' | 'play'
- 'skipped' | 'status_skipped'
- 'manual' | 'status_manual'
- end
- with_them do
- subject { helper.render_ci_icon(status).to_s }
+ with_them do
+ subject { helper.render_ci_icon(status) }
- it 'uses the correct icon variant for status' do
- is_expected.to include("ci-status-icon-#{status}")
- is_expected.to include(icon_variant)
+ it 'uses the correct variant and icon for status' do
+ is_expected.to include("gl-badge badge badge-pill badge-#{badge_variant}")
+ is_expected.to include("ci-icon-variant-#{badge_variant}")
+ is_expected.to include("data-testid=\"#{icon}-icon\"")
+ end
end
end
end
diff --git a/spec/helpers/nav/new_dropdown_helper_spec.rb b/spec/helpers/nav/new_dropdown_helper_spec.rb
index 47f23c4fa21..4252e10c922 100644
--- a/spec/helpers/nav/new_dropdown_helper_spec.rb
+++ b/spec/helpers/nav/new_dropdown_helper_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe Nav::NewDropdownHelper, feature_category: :navigation do
let(:with_can_create_project) { false }
let(:with_can_create_group) { false }
let(:with_can_create_snippet) { false }
+ let(:with_can_create_organization) { false }
let(:title) { 'Create new...' }
subject(:view_model) do
@@ -24,6 +25,7 @@ RSpec.describe Nav::NewDropdownHelper, feature_category: :navigation do
allow(user).to receive(:can_create_group?) { with_can_create_group }
allow(user).to receive(:can?).and_call_original
allow(user).to receive(:can?).with(:create_snippet) { with_can_create_snippet }
+ allow(user).to receive(:can?).with(:create_organization) { with_can_create_organization }
end
shared_examples 'invite member item' do |partial|
@@ -135,6 +137,39 @@ RSpec.describe Nav::NewDropdownHelper, feature_category: :navigation do
)
end
end
+
+ context 'when can create organization' do
+ let(:with_can_create_organization) { true }
+
+ it 'has new organization menu item' do
+ expect(view_model[:menu_sections]).to eq(
+ expected_menu_section(
+ title: _('In GitLab'),
+ menu_item: ::Gitlab::Nav::TopNavMenuItem.build(
+ id: 'general_new_organization',
+ title: s_('Organization|New organization'),
+ href: '/-/organizations/new',
+ data: {
+ track_action: 'click_link_new_organization_parent',
+ track_label: 'plus_menu_dropdown',
+ track_property: 'navigation_top',
+ testid: 'global_new_organization_link'
+ }
+ )
+ )
+ )
+ end
+
+ context 'when ui_for_organizations feature flag is disabled' do
+ before do
+ stub_feature_flags(ui_for_organizations: false)
+ end
+
+ it 'does not have new organization menu item' do
+ expect(view_model[:menu_sections]).to match_array([])
+ end
+ end
+ end
end
context 'with persisted group' do
diff --git a/spec/helpers/sidebars_helper_spec.rb b/spec/helpers/sidebars_helper_spec.rb
index d24e09e81ac..c9131ca518f 100644
--- a/spec/helpers/sidebars_helper_spec.rb
+++ b/spec/helpers/sidebars_helper_spec.rb
@@ -287,6 +287,9 @@ RSpec.describe SidebarsHelper, feature_category: :navigation do
{ href: "/groups/new", text: "New group",
component: nil,
extraAttrs: extra_attrs.call("general_new_group") },
+ { href: "/-/organizations/new", text: s_('Organization|New organization'),
+ component: nil,
+ extraAttrs: extra_attrs.call("general_new_organization") },
{ href: "/-/snippets/new", text: "New snippet",
component: nil,
extraAttrs: extra_attrs.call("general_new_snippet") }
diff --git a/spec/lib/gitlab/regex_requires_app_spec.rb b/spec/lib/gitlab/regex_requires_app_spec.rb
index bea5d25dbc8..7a247e5e8cf 100644
--- a/spec/lib/gitlab/regex_requires_app_spec.rb
+++ b/spec/lib/gitlab/regex_requires_app_spec.rb
@@ -5,6 +5,18 @@ require 'spec_helper'
# Only specs that *cannot* be run with fast_spec_helper only
# See regex_spec for tests that do not require the full spec_helper
RSpec.describe Gitlab::Regex, feature_category: :tooling do
+ shared_examples_for 'npm package name regex' do
+ it { is_expected.to match('@scope/package') }
+ it { is_expected.to match('unscoped-package') }
+ it { is_expected.not_to match('@first-scope@second-scope/package') }
+ it { is_expected.not_to match('scope-without-at-symbol/package') }
+ it { is_expected.not_to match('@not-a-scoped-package') }
+ it { is_expected.not_to match('@scope/sub/package') }
+ it { is_expected.not_to match('@scope/../../package') }
+ it { is_expected.not_to match('@scope%2e%2e%2fpackage') }
+ it { is_expected.not_to match('@%2e%2e%2f/package') }
+ end
+
describe '.debian_architecture_regex' do
subject { described_class.debian_architecture_regex }
@@ -37,15 +49,7 @@ RSpec.describe Gitlab::Regex, feature_category: :tooling do
describe '.npm_package_name_regex' do
subject { described_class.npm_package_name_regex }
- it { is_expected.to match('@scope/package') }
- it { is_expected.to match('unscoped-package') }
- it { is_expected.not_to match('@first-scope@second-scope/package') }
- it { is_expected.not_to match('scope-without-at-symbol/package') }
- it { is_expected.not_to match('@not-a-scoped-package') }
- it { is_expected.not_to match('@scope/sub/package') }
- it { is_expected.not_to match('@scope/../../package') }
- it { is_expected.not_to match('@scope%2e%2e%2fpackage') }
- it { is_expected.not_to match('@%2e%2e%2f/package') }
+ it_behaves_like 'npm package name regex'
context 'capturing group' do
[
@@ -63,6 +67,24 @@ RSpec.describe Gitlab::Regex, feature_category: :tooling do
end
end
+ describe '.protection_rules_npm_package_name_pattern_regex' do
+ subject { described_class.protection_rules_npm_package_name_pattern_regex }
+
+ it_behaves_like 'npm package name regex'
+
+ it { is_expected.to match('@scope/package-*') }
+ it { is_expected.to match('@my-scope/*my-package-with-wildcard-inbetween') }
+ it { is_expected.to match('@my-scope/*my-package-with-wildcard-start') }
+ it { is_expected.to match('@my-scope/my-*package-*with-wildcard-multiple-*') }
+ it { is_expected.to match('@my-scope/my-package-with_____underscore') }
+ it { is_expected.to match('@my-scope/my-package-with-wildcard-end*') }
+ it { is_expected.to match('@my-scope/my-package-with-regex-characters.+') }
+
+ it { is_expected.not_to match('@my-scope/my-package-with-percent-sign-%') }
+ it { is_expected.not_to match('*@my-scope/my-package-with-wildcard-start') }
+ it { is_expected.not_to match('@my-scope/my-package-with-backslash-\*') }
+ end
+
describe '.debian_distribution_regex' do
subject { described_class.debian_distribution_regex }
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index 9d2c7e876c3..c3d3ccfea44 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -157,6 +157,106 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep, feature_category:
end
end
+ describe 'unlocking pipelines based on state transition' do
+ let(:ci_ref) { create(:ci_ref) }
+ let(:unlock_previous_pipelines_worker_spy) { class_spy(::Ci::Refs::UnlockPreviousPipelinesWorker) }
+
+ before do
+ stub_const('Ci::Refs::UnlockPreviousPipelinesWorker', unlock_previous_pipelines_worker_spy)
+ stub_feature_flags(ci_stop_unlock_pipelines: false)
+ end
+
+ shared_examples 'not unlocking pipelines' do |event:|
+ context "on #{event}" do
+ let(:pipeline) { create(:ci_pipeline, ci_ref_id: ci_ref.id, locked: :artifacts_locked) }
+
+ it 'does not unlock previous pipelines' do
+ pipeline.fire_events!(event)
+
+ expect(unlock_previous_pipelines_worker_spy).not_to have_received(:perform_async)
+ end
+ end
+ end
+
+ shared_examples 'unlocking pipelines' do |event:|
+ context "on #{event}" do
+ before do
+ pipeline.fire_events!(event)
+ end
+
+ let(:pipeline) { create(:ci_pipeline, ci_ref_id: ci_ref.id, locked: :artifacts_locked) }
+
+ it 'unlocks previous pipelines' do
+ expect(unlock_previous_pipelines_worker_spy).to have_received(:perform_async).with(ci_ref.id)
+ end
+ end
+ end
+
+ context 'when transitioning to unlockable states' do
+ before do
+ pipeline.run
+ end
+
+ it_behaves_like 'unlocking pipelines', event: :succeed
+ it_behaves_like 'unlocking pipelines', event: :drop
+ it_behaves_like 'unlocking pipelines', event: :skip
+ it_behaves_like 'unlocking pipelines', event: :cancel
+ it_behaves_like 'unlocking pipelines', event: :block
+
+ context 'and ci_stop_unlock_pipelines is enabled' do
+ before do
+ stub_feature_flags(ci_stop_unlock_pipelines: true)
+ end
+
+ it_behaves_like 'not unlocking pipelines', event: :succeed
+ it_behaves_like 'not unlocking pipelines', event: :drop
+ it_behaves_like 'not unlocking pipelines', event: :skip
+ it_behaves_like 'not unlocking pipelines', event: :cancel
+ it_behaves_like 'not unlocking pipelines', event: :block
+ end
+
+ context 'and ci_unlock_non_successful_pipelines is disabled' do
+ before do
+ stub_feature_flags(ci_unlock_non_successful_pipelines: false)
+ end
+
+ it_behaves_like 'unlocking pipelines', event: :succeed
+ it_behaves_like 'not unlocking pipelines', event: :drop
+ it_behaves_like 'not unlocking pipelines', event: :skip
+ it_behaves_like 'not unlocking pipelines', event: :cancel
+ it_behaves_like 'not unlocking pipelines', event: :block
+
+ context 'and ci_stop_unlock_pipelines is enabled' do
+ before do
+ stub_feature_flags(ci_stop_unlock_pipelines: true)
+ end
+
+ it_behaves_like 'not unlocking pipelines', event: :succeed
+ it_behaves_like 'not unlocking pipelines', event: :drop
+ it_behaves_like 'not unlocking pipelines', event: :skip
+ it_behaves_like 'not unlocking pipelines', event: :cancel
+ it_behaves_like 'not unlocking pipelines', event: :block
+ end
+ end
+ end
+
+ context 'when transitioning to a non-unlockable state' do
+ before do
+ pipeline.enqueue
+ end
+
+ it_behaves_like 'not unlocking pipelines', event: :run
+
+ context 'and ci_unlock_non_successful_pipelines is disabled' do
+ before do
+ stub_feature_flags(ci_unlock_non_successful_pipelines: false)
+ end
+
+ it_behaves_like 'not unlocking pipelines', event: :run
+ end
+ end
+ end
+
describe 'pipeline age metric' do
let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
@@ -220,6 +320,34 @@ RSpec.describe Ci::Pipeline, :mailer, factory_default: :keep, feature_category:
end
end
+ describe '.with_unlockable_status' do
+ let_it_be(:project) { create(:project) }
+
+ let!(:pipeline) { create(:ci_pipeline, project: project, status: status) }
+
+ subject(:result) { described_class.with_unlockable_status }
+
+ described_class::UNLOCKABLE_STATUSES.map(&:to_s).each do |s|
+ context "when pipeline status is #{s}" do
+ let(:status) { s }
+
+ it 'includes the pipeline in the result' do
+ expect(result).to include(pipeline)
+ end
+ end
+ end
+
+ (Ci::HasStatus::AVAILABLE_STATUSES - described_class::UNLOCKABLE_STATUSES.map(&:to_s)).each do |s|
+ context "when pipeline status is #{s}" do
+ let(:status) { s }
+
+ it 'does excludes the pipeline in the result' do
+ expect(result).not_to include(pipeline)
+ end
+ end
+ end
+ end
+
describe '.processables' do
let_it_be(:pipeline) { create(:ci_empty_pipeline, :created) }
diff --git a/spec/models/ci/ref_spec.rb b/spec/models/ci/ref_spec.rb
index 75071a17fa9..2727c7701b8 100644
--- a/spec/models/ci/ref_spec.rb
+++ b/spec/models/ci/ref_spec.rb
@@ -7,61 +7,6 @@ RSpec.describe Ci::Ref, feature_category: :continuous_integration do
it { is_expected.to belong_to(:project) }
- describe 'state machine transitions' do
- context 'unlock artifacts transition' do
- let(:ci_ref) { create(:ci_ref) }
- let(:unlock_previous_pipelines_worker_spy) { class_spy(::Ci::Refs::UnlockPreviousPipelinesWorker) }
-
- before do
- stub_const('Ci::Refs::UnlockPreviousPipelinesWorker', unlock_previous_pipelines_worker_spy)
- end
-
- context 'pipeline is locked' do
- let!(:pipeline) { create(:ci_pipeline, ci_ref_id: ci_ref.id, locked: :artifacts_locked) }
-
- where(:initial_state, :action, :count) do
- :unknown | :succeed! | 1
- :unknown | :do_fail! | 0
- :success | :succeed! | 1
- :success | :do_fail! | 0
- :failed | :succeed! | 1
- :failed | :do_fail! | 0
- :fixed | :succeed! | 1
- :fixed | :do_fail! | 0
- :broken | :succeed! | 1
- :broken | :do_fail! | 0
- :still_failing | :succeed | 1
- :still_failing | :do_fail | 0
- end
-
- with_them do
- context "when transitioning states" do
- before do
- status_value = Ci::Ref.state_machines[:status].states[initial_state].value
- ci_ref.update!(status: status_value)
- end
-
- it 'calls pipeline complete unlock artifacts service' do
- ci_ref.send(action)
-
- expect(unlock_previous_pipelines_worker_spy).to have_received(:perform_async).exactly(count).times
- end
- end
- end
- end
-
- context 'pipeline is unlocked' do
- let!(:pipeline) { create(:ci_pipeline, ci_ref_id: ci_ref.id, locked: :unlocked) }
-
- it 'does not unlock pipelines' do
- ci_ref.succeed!
-
- expect(unlock_previous_pipelines_worker_spy).not_to have_received(:perform_async)
- end
- end
- end
- end
-
describe '.ensure_for' do
let_it_be(:project) { create(:project, :repository) }
@@ -241,4 +186,117 @@ RSpec.describe Ci::Ref, feature_category: :continuous_integration do
let!(:model) { create(:ci_ref, project: parent) }
end
end
+
+ describe '#last_successful_ci_source_pipeline' do
+ let_it_be(:ci_ref) { create(:ci_ref) }
+
+ let(:ci_source) { Enums::Ci::Pipeline.sources[:push] }
+ let(:dangling_source) { Enums::Ci::Pipeline.sources[:parent_pipeline] }
+
+ subject(:result) { ci_ref.last_successful_ci_source_pipeline }
+
+ context 'when there are no successful CI source pipelines' do
+ let!(:running_ci_source) { create(:ci_pipeline, :running, ci_ref: ci_ref, source: ci_source) }
+ let!(:successful_dangling_source) { create(:ci_pipeline, :success, ci_ref: ci_ref, source: dangling_source) }
+
+ it { is_expected.to be_nil }
+ end
+
+ context 'when there are successful CI source pipelines' do
+ context 'and the latest pipeline is a successful CI source pipeline' do
+ let!(:failed_ci_source) { create(:ci_pipeline, :failed, ci_ref: ci_ref, source: ci_source) }
+ let!(:successful_dangling_source) { create(:ci_pipeline, :success, ci_ref: ci_ref, source: dangling_source, child_of: failed_ci_source) }
+ let!(:successful_ci_source) { create(:ci_pipeline, :success, ci_ref: ci_ref, source: ci_source) }
+
+ it 'returns the last successful CI source pipeline' do
+ expect(result).to eq(successful_ci_source)
+ end
+ end
+
+ context 'and there is a newer successful dangling source pipeline than the successful CI source pipelines' do
+ let!(:successful_ci_source_1) { create(:ci_pipeline, :success, ci_ref: ci_ref, source: ci_source) }
+ let!(:successful_ci_source_2) { create(:ci_pipeline, :success, ci_ref: ci_ref, source: ci_source) }
+ let!(:failed_ci_source) { create(:ci_pipeline, :failed, ci_ref: ci_ref, source: ci_source) }
+ let!(:successful_dangling_source) { create(:ci_pipeline, :success, ci_ref: ci_ref, source: dangling_source, child_of: failed_ci_source) }
+
+ it 'returns the last successful CI source pipeline' do
+ expect(result).to eq(successful_ci_source_2)
+ end
+
+ context 'and the newer successful dangling source is a child of a successful CI source pipeline' do
+ let!(:parent_ci_source) { create(:ci_pipeline, :success, ci_ref: ci_ref, source: ci_source) }
+ let!(:successful_child_source) { create(:ci_pipeline, :success, ci_ref: ci_ref, source: dangling_source, child_of: parent_ci_source) }
+
+ it 'returns the parent pipeline instead' do
+ expect(result).to eq(parent_ci_source)
+ end
+ end
+ end
+ end
+ end
+
+ describe '#last_unlockable_ci_source_pipeline' do
+ let(:ci_source) { Enums::Ci::Pipeline.sources[:push] }
+ let(:dangling_source) { Enums::Ci::Pipeline.sources[:parent_pipeline] }
+
+ let_it_be(:project) { create(:project) }
+ let_it_be(:ci_ref) { create(:ci_ref, project: project) }
+
+ subject(:result) { ci_ref.last_unlockable_ci_source_pipeline }
+
+ context 'when there are unlockable pipelines in the ref' do
+ context 'and the last CI source pipeline in the ref is unlockable' do
+ let!(:unlockable_ci_source_1) { create(:ci_pipeline, :success, project: project, ci_ref: ci_ref, source: ci_source) }
+ let!(:unlockable_ci_source_2) { create(:ci_pipeline, :blocked, project: project, ci_ref: ci_ref, source: ci_source) }
+
+ it 'returns the CI source pipeline' do
+ expect(result).to eq(unlockable_ci_source_2)
+ end
+
+ context 'and it has unlockable child pipelines' do
+ let!(:child) { create(:ci_pipeline, :success, project: project, ci_ref: ci_ref, source: dangling_source, child_of: unlockable_ci_source_2) }
+ let!(:child_2) { create(:ci_pipeline, :success, project: project, ci_ref: ci_ref, source: dangling_source, child_of: unlockable_ci_source_2) }
+
+ it 'returns the parent CI source pipeline' do
+ expect(result).to eq(unlockable_ci_source_2)
+ end
+ end
+
+ context 'and it has a non-unlockable child pipeline' do
+ let!(:child) { create(:ci_pipeline, :running, project: project, ci_ref: ci_ref, source: dangling_source, child_of: unlockable_ci_source_2) }
+
+ it 'returns the parent CI source pipeline' do
+ expect(result).to eq(unlockable_ci_source_2)
+ end
+ end
+ end
+
+ context 'and the last CI source pipeline in the ref is not unlockable' do
+ let!(:unlockable_ci_source) { create(:ci_pipeline, :skipped, project: project, ci_ref: ci_ref, source: ci_source) }
+ let!(:unlockable_dangling_source) { create(:ci_pipeline, :success, project: project, ci_ref: ci_ref, source: dangling_source, child_of: unlockable_ci_source) }
+ let!(:non_unlockable_ci_source) { create(:ci_pipeline, :running, project: project, ci_ref: ci_ref, source: ci_source) }
+ let!(:non_unlockable_ci_source_2) { create(:ci_pipeline, :running, project: project, ci_ref: ci_ref, source: ci_source) }
+
+ it 'returns the last unlockable CI source pipeline before it' do
+ expect(result).to eq(unlockable_ci_source)
+ end
+
+ context 'and it has unlockable child pipelines' do
+ let!(:child) { create(:ci_pipeline, :success, project: project, ci_ref: ci_ref, source: dangling_source, child_of: non_unlockable_ci_source) }
+ let!(:child_2) { create(:ci_pipeline, :success, project: project, ci_ref: ci_ref, source: dangling_source, child_of: non_unlockable_ci_source) }
+
+ it 'returns the last unlockable CI source pipeline before it' do
+ expect(result).to eq(unlockable_ci_source)
+ end
+ end
+ end
+ end
+
+ context 'when there are no unlockable pipelines in the ref' do
+ let!(:non_unlockable_pipeline) { create(:ci_pipeline, :running, project: project, ci_ref: ci_ref, source: ci_source) }
+ let!(:pipeline_from_another_ref) { create(:ci_pipeline, :success, source: ci_source) }
+
+ it { is_expected.to be_nil }
+ end
+ end
end
diff --git a/spec/models/packages/protection/rule_spec.rb b/spec/models/packages/protection/rule_spec.rb
index 42c56393a72..3f0aefa945a 100644
--- a/spec/models/packages/protection/rule_spec.rb
+++ b/spec/models/packages/protection/rule_spec.rb
@@ -34,6 +34,32 @@ RSpec.describe Packages::Protection::Rule, type: :model, feature_category: :pack
it { is_expected.to validate_presence_of(:package_name_pattern) }
it { is_expected.to validate_uniqueness_of(:package_name_pattern).scoped_to(:project_id, :package_type) }
it { is_expected.to validate_length_of(:package_name_pattern).is_at_most(255) }
+
+ [
+ '@my-scope/my-package',
+ '@my-scope/*my-package-with-wildcard-inbetween',
+ '@my-scope/*my-package-with-wildcard-start',
+ '@my-scope/my-*package-*with-wildcard-multiple-*',
+ '@my-scope/my-package-with_____underscore',
+ '@my-scope/my-package-with-regex-characters.+',
+ '@my-scope/my-package-with-wildcard-end*'
+ ].each do |package_name_pattern|
+ it { is_expected.to allow_value(package_name_pattern).for(:package_name_pattern) }
+ end
+
+ [
+ '@my-scope/my-package-with-percent-sign-%',
+ '*@my-scope/my-package-with-wildcard-start',
+ '@my-scope/my-package-with-backslash-\*'
+ ].each do |package_name_pattern|
+ it {
+ is_expected.not_to(
+ allow_value(package_name_pattern)
+ .for(:package_name_pattern)
+ .with_message(_('should be a valid NPM package name with optional wildcard characters.'))
+ )
+ }
+ end
end
describe '#package_type' do
@@ -51,14 +77,13 @@ RSpec.describe Packages::Protection::Rule, type: :model, feature_category: :pack
context 'with different package name patterns' do
where(:package_name_pattern, :expected_pattern_query) do
- '@my-scope/my-package' | '@my-scope/my-package'
- '*@my-scope/my-package-with-wildcard-start' | '%@my-scope/my-package-with-wildcard-start'
- '@my-scope/my-package-with-wildcard-end*' | '@my-scope/my-package-with-wildcard-end%'
- '@my-scope/*my-package-with-wildcard-inbetween' | '@my-scope/%my-package-with-wildcard-inbetween'
- '**@my-scope/**my-package-with-wildcard-multiple**' | '%%@my-scope/%%my-package-with-wildcard-multiple%%'
- '@my-scope/my-package-with_____underscore' | '@my-scope/my-package-with\_\_\_\_\_underscore'
- '@my-scope/my-package-with-percent-sign-%' | '@my-scope/my-package-with-percent-sign-\%'
- '@my-scope/my-package-with-regex-characters.+' | '@my-scope/my-package-with-regex-characters.+'
+ '@my-scope/my-package' | '@my-scope/my-package'
+ '@my-scope/*my-package-with-wildcard-start' | '@my-scope/%my-package-with-wildcard-start'
+ '@my-scope/my-package-with-wildcard-end*' | '@my-scope/my-package-with-wildcard-end%'
+ '@my-scope/my-package*with-wildcard-inbetween' | '@my-scope/my-package%with-wildcard-inbetween'
+ '@my-scope/**my-package-**-with-wildcard-multiple**' | '@my-scope/%%my-package-%%-with-wildcard-multiple%%'
+ '@my-scope/my-package-with_____underscore' | '@my-scope/my-package-with\_\_\_\_\_underscore'
+ '@my-scope/my-package-with-regex-characters.+' | '@my-scope/my-package-with-regex-characters.+'
end
with_them do
@@ -74,7 +99,7 @@ RSpec.describe Packages::Protection::Rule, type: :model, feature_category: :pack
end
let_it_be(:ppr_with_wildcard_start) do
- create(:package_protection_rule, package_name_pattern: '*@my-scope/my_package-with-wildcard-start')
+ create(:package_protection_rule, package_name_pattern: '@my-scope/*my_package-with-wildcard-start')
end
let_it_be(:ppr_with_wildcard_end) do
@@ -82,11 +107,11 @@ RSpec.describe Packages::Protection::Rule, type: :model, feature_category: :pack
end
let_it_be(:ppr_with_wildcard_inbetween) do
- create(:package_protection_rule, package_name_pattern: '@my-scope/*my_package-with-wildcard-inbetween')
+ create(:package_protection_rule, package_name_pattern: '@my-scope/my_package*with-wildcard-inbetween')
end
let_it_be(:ppr_with_wildcard_multiples) do
- create(:package_protection_rule, package_name_pattern: '**@my-scope/**my_package-with-wildcard-multiple**')
+ create(:package_protection_rule, package_name_pattern: '@my-scope/**my_package**with-wildcard-multiple**')
end
let_it_be(:ppr_with_underscore) do
@@ -103,46 +128,47 @@ RSpec.describe Packages::Protection::Rule, type: :model, feature_category: :pack
context 'with several package protection rule scenarios' do
where(:package_name, :expected_package_protection_rules) do
- '@my-scope/my_package' | [ref(:package_protection_rule)]
- '@my-scope/my2package' | []
- '@my-scope/my_package-2' | []
+ '@my-scope/my_package' | [ref(:package_protection_rule)]
+ '@my-scope/my2package' | []
+ '@my-scope/my_package-2' | []
# With wildcard pattern at the start
- '@my-scope/my_package-with-wildcard-start' | [ref(:ppr_with_wildcard_start)]
- '@my-scope/my_package-with-wildcard-start-any' | []
- 'prefix-@my-scope/my_package-with-wildcard-start' | [ref(:ppr_with_wildcard_start)]
- 'prefix-@my-scope/my_package-with-wildcard-start-any' | []
+ '@my-scope/my_package-with-wildcard-start' | [ref(:ppr_with_wildcard_start)]
+ '@my-scope/my_package-with-wildcard-start-any' | []
+ '@my-scope/any-my_package-with-wildcard-start' | [ref(:ppr_with_wildcard_start)]
+ '@my-scope/any-my_package-with-wildcard-start-any' | []
# With wildcard pattern at the end
- '@my-scope/my_package-with-wildcard-end' | [ref(:ppr_with_wildcard_end)]
- '@my-scope/my_package-with-wildcard-end:1234567890' | [ref(:ppr_with_wildcard_end)]
- 'prefix-@my-scope/my_package-with-wildcard-end' | []
- 'prefix-@my-scope/my_package-with-wildcard-end:1234567890' | []
+ '@my-scope/my_package-with-wildcard-end' | [ref(:ppr_with_wildcard_end)]
+ '@my-scope/my_package-with-wildcard-end:1234567890' | [ref(:ppr_with_wildcard_end)]
+ '@my-scope/any-my_package-with-wildcard-end' | []
+ '@my-scope/any-my_package-with-wildcard-end:1234567890' | []
# With wildcard pattern inbetween
- '@my-scope/my_package-with-wildcard-inbetween' | [ref(:ppr_with_wildcard_inbetween)]
- '@my-scope/any-my_package-with-wildcard-inbetween' | [ref(:ppr_with_wildcard_inbetween)]
- '@my-scope/any-my_package-my_package-wildcard-inbetween-any' | []
+ '@my-scope/my_packagewith-wildcard-inbetween' | [ref(:ppr_with_wildcard_inbetween)]
+ '@my-scope/my_package-any-with-wildcard-inbetween' | [ref(:ppr_with_wildcard_inbetween)]
+ '@my-scope/any-my_package-my_package-wildcard-inbetween-any' | []
# With multiple wildcard pattern are used
- '@my-scope/my_package-with-wildcard-multiple' | [ref(:ppr_with_wildcard_multiples)]
- 'prefix-@my-scope/any-my_package-with-wildcard-multiple-any' | [ref(:ppr_with_wildcard_multiples)]
- '****@my-scope/****my_package-with-wildcard-multiple****' | [ref(:ppr_with_wildcard_multiples)]
- 'prefix-@other-scope/any-my_package-with-wildcard-multiple-any' | []
+ '@my-scope/my_packagewith-wildcard-multiple' | [ref(:ppr_with_wildcard_multiples)]
+ '@my-scope/any-my_package-any-with-wildcard-multiple-any' | [ref(:ppr_with_wildcard_multiples)]
+ '@my-scope/****my_package****with-wildcard-multiple****' | [ref(:ppr_with_wildcard_multiples)]
+ '@other-scope/any-my_package-with-wildcard-multiple-any' | []
# With underscore
- '@my-scope/my_package-with_____underscore' | [ref(:ppr_with_underscore)]
- '@my-scope/my_package-with_any_underscore' | []
+ '@my-scope/my_package-with_____underscore' | [ref(:ppr_with_underscore)]
+ '@my-scope/my_package-with_any_underscore' | []
- '@my-scope/my_package-with-regex-characters.+' | [ref(:ppr_with_regex_characters)]
- '@my-scope/my_package-with-regex-characters.' | []
- '@my-scope/my_package-with-regex-characters' | []
- '@my-scope/my_package-with-regex-characters-any' | []
+ # With regex pattern
+ '@my-scope/my_package-with-regex-characters.+' | [ref(:ppr_with_regex_characters)]
+ '@my-scope/my_package-with-regex-characters.' | []
+ '@my-scope/my_package-with-regex-characters' | []
+ '@my-scope/my_package-with-regex-characters-any' | []
# Special cases
- nil | []
- '' | []
- 'any_package' | []
+ nil | []
+ '' | []
+ 'any_package' | []
end
with_them do
diff --git a/spec/requests/api/graphql/merge_requests/codequality_reports_comparer_spec.rb b/spec/requests/api/graphql/merge_requests/codequality_reports_comparer_spec.rb
index 2939e9307e9..09a229c2098 100644
--- a/spec/requests/api/graphql/merge_requests/codequality_reports_comparer_spec.rb
+++ b/spec/requests/api/graphql/merge_requests/codequality_reports_comparer_spec.rb
@@ -54,6 +54,7 @@ RSpec.describe 'Query.project.mergeRequest.codequalityReportsComparer', feature_
let(:codequality_reports_comparer_fields) do
<<~QUERY
codequalityReportsComparer {
+ status
report {
status
newErrors {
@@ -138,6 +139,7 @@ RSpec.describe 'Query.project.mergeRequest.codequalityReportsComparer', feature_
expect(result).to match(
a_hash_including(
{
+ status: 'PARSED',
report: {
status: 'FAILED',
newErrors: [
diff --git a/spec/requests/api/graphql/mutations/merge_requests/set_time_estimate_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/set_time_estimate_spec.rb
index 6bc130a97cf..541cdf0660d 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/set_time_estimate_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/set_time_estimate_spec.rb
@@ -17,8 +17,11 @@ RSpec.describe 'Setting time estimate of a merge request', feature_category: :co
let(:extra_params) { { project_path: project.full_path } }
let(:input_params) { input.merge(extra_params) }
- let(:mutation) { graphql_mutation(:merge_request_update, input_params, nil, ['productAnalyticsState']) }
let(:mutation_response) { graphql_mutation_response(:merge_request_update) }
+ let(:mutation) do
+ # exclude codequalityReportsComparer because it's behind a feature flag
+ graphql_mutation(:merge_request_update, input_params, nil, %w[productAnalyticsState codequalityReportsComparer])
+ end
context 'when the user is not allowed to update a merge request' do
before_all do
diff --git a/spec/requests/api/graphql/mutations/merge_requests/update_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/update_spec.rb
index 3e2bdb376ad..ef21f77d818 100644
--- a/spec/requests/api/graphql/mutations/merge_requests/update_spec.rb
+++ b/spec/requests/api/graphql/mutations/merge_requests/update_spec.rb
@@ -12,8 +12,11 @@ RSpec.describe 'Update of an existing merge request', feature_category: :code_re
let(:input) { { 'iid' => merge_request.iid.to_s } }
let(:extra_params) { { project_path: project.full_path } }
let(:input_params) { input.merge(extra_params) }
- let(:mutation) { graphql_mutation(:merge_request_update, input_params, nil, ['productAnalyticsState']) }
let(:mutation_response) { graphql_mutation_response(:merge_request_update) }
+ let(:mutation) do
+ # exclude codequalityReportsComparer because it's behind a feature flag
+ graphql_mutation(:merge_request_update, input_params, nil, %w[productAnalyticsState codequalityReportsComparer])
+ end
context 'when the user is not allowed to update the merge request' do
it_behaves_like 'a mutation that returns a top-level access error'
diff --git a/spec/requests/api/graphql/project/merge_request_spec.rb b/spec/requests/api/graphql/project/merge_request_spec.rb
index c274199e65b..23be9fa5286 100644
--- a/spec/requests/api/graphql/project/merge_request_spec.rb
+++ b/spec/requests/api/graphql/project/merge_request_spec.rb
@@ -22,7 +22,7 @@ RSpec.describe 'getting merge request information nested in a project', feature_
it_behaves_like 'a working graphql query' do
# we exclude Project.pipeline because it needs arguments,
- # codequalityReportsComparer because no pipeline exist yet
+ # codequalityReportsComparer because it is behind a feature flag
# and runners because the user is not an admin and therefore has no access
let(:excluded) { %w[jobs pipeline runners codequalityReportsComparer] }
let(:mr_fields) { all_graphql_fields_for('MergeRequest', excluded: excluded) }
diff --git a/spec/requests/api/graphql/project/merge_requests_spec.rb b/spec/requests/api/graphql/project/merge_requests_spec.rb
index 543de43bcf3..176a02df0be 100644
--- a/spec/requests/api/graphql/project/merge_requests_spec.rb
+++ b/spec/requests/api/graphql/project/merge_requests_spec.rb
@@ -48,8 +48,11 @@ RSpec.describe 'getting merge request listings nested in a project', feature_cat
end
it_behaves_like 'a working graphql query' do
+ # we exclude codequalityReportsComparer because it is behind feature flag
+ let(:excluded) { %w[codequalityReportsComparer] }
+
let(:query) do
- query_merge_requests(all_graphql_fields_for('MergeRequest', max_depth: 2))
+ query_merge_requests(all_graphql_fields_for('MergeRequest', max_depth: 2, excluded: excluded))
end
before do
diff --git a/spec/rubocop/cop/style/inline_disable_annotation_spec.rb b/spec/rubocop/cop/style/inline_disable_annotation_spec.rb
new file mode 100644
index 00000000000..a180c08d534
--- /dev/null
+++ b/spec/rubocop/cop/style/inline_disable_annotation_spec.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+require 'rubocop_spec_helper'
+
+require_relative '../../../../rubocop/cop/style/inline_disable_annotation'
+
+RSpec.describe RuboCop::Cop::Style::InlineDisableAnnotation, feature_category: :shared do
+ it 'registers an offense' do
+ expect_offense(<<~RUBY)
+ # some other comment
+ abc = '1'
+ ['this', 'that'].each do |word|
+ next if something? # rubocop:disable Some/Cop, Another/Cop
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Inline disabling a cop needs to follow [...]
+ end
+ # rubocop:disable Some/Cop, Another/Cop - Bad comment
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Inline disabling a cop needs to follow [...]
+ # rubocop :todo Some/Cop Some other things
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Inline disabling a cop needs to follow [...]
+ # rubocop: disable Some/Cop, Another/Cop Some more stuff
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Inline disabling a cop needs to follow [...]
+ # rubocop:disable Some/Cop -- Good comment
+ if blah && this # some other comment about nothing
+ this.match?(/blah/) # rubocop:disable Some/Cop with a bad comment
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Inline disabling a cop needs to follow [...]
+ end
+ RUBY
+ end
+
+ it 'accepts correctly formatted comment' do
+ expect_no_offenses(<<~RUBY)
+ # some other comment
+ abc = '1'
+ ['this', 'that'].each do |word|
+ next if something? # rubocop:disable Some/Cop, Another/Cop -- Good comment
+ end
+ # rubocop:disable Some/Cop, Another/Cop -- Good comment
+ # rubocop :todo Some/Cop Some other things -- Good comment
+ # rubocop: disable Some/Cop, Another/Cop Some more stuff -- Good comment
+ # rubocop:disable Some/Cop -- Good comment
+ if blah && this # some other comment about nothing
+ this.match?(/blah/) # rubocop:disable Some/Cop -- Good comment
+ end
+ RUBY
+ end
+end
diff --git a/spec/services/ci/refs/enqueue_pipelines_to_unlock_service_spec.rb b/spec/services/ci/refs/enqueue_pipelines_to_unlock_service_spec.rb
index 468302cb689..052be3b2587 100644
--- a/spec/services/ci/refs/enqueue_pipelines_to_unlock_service_spec.rb
+++ b/spec/services/ci/refs/enqueue_pipelines_to_unlock_service_spec.rb
@@ -26,34 +26,40 @@ RSpec.describe Ci::Refs::EnqueuePipelinesToUnlockService, :unlock_pipelines, :cl
shared_examples_for 'unlocking pipelines' do
let(:is_tag) { target_ref.ref_path.include?(::Gitlab::Git::TAG_REF_PREFIX) }
- let!(:other_ref_pipeline) { create_pipeline(:locked, other_ref, tag: false) }
- let!(:old_unlocked_pipeline) { create_pipeline(:unlocked, ref) }
- let!(:older_locked_pipeline_1) { create_pipeline(:locked, ref) }
- let!(:older_locked_pipeline_2) { create_pipeline(:locked, ref) }
- let!(:older_locked_pipeline_3) { create_pipeline(:locked, ref) }
- let!(:older_child_pipeline) { create_pipeline(:locked, ref, child_of: older_locked_pipeline_3) }
- let!(:pipeline) { create_pipeline(:locked, ref) }
- let!(:child_pipeline) { create_pipeline(:locked, ref, child_of: pipeline) }
- let!(:newer_pipeline) { create_pipeline(:locked, ref) }
+ let!(:other_ref_pipeline) { create_pipeline(:locked, other_ref, :failed, tag: false) }
+ let!(:old_unlocked_pipeline) { create_pipeline(:unlocked, ref, :failed) }
+ let!(:old_locked_pipeline_1) { create_pipeline(:locked, ref, :failed) }
+ let!(:old_locked_pipeline_2) { create_pipeline(:locked, ref, :success) }
+ let!(:old_locked_pipeline_3) { create_pipeline(:locked, ref, :success) }
+ let!(:old_locked_pipeline_3_child) { create_pipeline(:locked, ref, :success, child_of: old_locked_pipeline_3) }
+ let!(:old_locked_pipeline_4) { create_pipeline(:locked, ref, :success) }
+ let!(:old_locked_pipeline_4_child) { create_pipeline(:locked, ref, :success, child_of: old_locked_pipeline_4) }
+ let!(:old_locked_pipeline_5) { create_pipeline(:locked, ref, :failed) }
+ let!(:old_locked_pipeline_5_child) { create_pipeline(:locked, ref, :success, child_of: old_locked_pipeline_5) }
+ let!(:pipeline) { create_pipeline(:locked, ref, :failed) }
+ let!(:child_pipeline) { create_pipeline(:locked, ref, :failed, child_of: pipeline) }
+ let!(:newer_pipeline) { create_pipeline(:locked, ref, :failed) }
context 'when before_pipeline is given' do
let(:before_pipeline) { pipeline }
- it 'only enqueues older locked pipelines within the ref' do
+ it 'only enqueues old locked pipelines within the ref, excluding the last successful CI source pipeline' do
expect { execute }
.to change { pipeline_ids_waiting_to_be_unlocked }
.from([])
.to([
- older_locked_pipeline_1.id,
- older_locked_pipeline_2.id,
- older_locked_pipeline_3.id,
- older_child_pipeline.id
+ old_locked_pipeline_1.id,
+ old_locked_pipeline_2.id,
+ old_locked_pipeline_3.id,
+ old_locked_pipeline_3_child.id,
+ old_locked_pipeline_5.id,
+ old_locked_pipeline_5_child.id
])
expect(execute).to include(
status: :success,
- total_pending_entries: 4,
- total_new_entries: 4
+ total_pending_entries: 6,
+ total_new_entries: 6
)
end
end
@@ -66,10 +72,14 @@ RSpec.describe Ci::Refs::EnqueuePipelinesToUnlockService, :unlock_pipelines, :cl
.to change { pipeline_ids_waiting_to_be_unlocked }
.from([])
.to([
- older_locked_pipeline_1.id,
- older_locked_pipeline_2.id,
- older_locked_pipeline_3.id,
- older_child_pipeline.id,
+ old_locked_pipeline_1.id,
+ old_locked_pipeline_2.id,
+ old_locked_pipeline_3.id,
+ old_locked_pipeline_3_child.id,
+ old_locked_pipeline_4.id,
+ old_locked_pipeline_4_child.id,
+ old_locked_pipeline_5.id,
+ old_locked_pipeline_5_child.id,
pipeline.id,
child_pipeline.id,
newer_pipeline.id
@@ -77,8 +87,8 @@ RSpec.describe Ci::Refs::EnqueuePipelinesToUnlockService, :unlock_pipelines, :cl
expect(execute).to include(
status: :success,
- total_pending_entries: 7,
- total_new_entries: 7
+ total_pending_entries: 11,
+ total_new_entries: 11
)
end
end
@@ -96,9 +106,9 @@ RSpec.describe Ci::Refs::EnqueuePipelinesToUnlockService, :unlock_pipelines, :cl
it_behaves_like 'unlocking pipelines'
end
- def create_pipeline(type, ref, tag: is_tag, child_of: nil)
+ def create_pipeline(type, ref, status, tag: is_tag, child_of: nil)
trait = type == :locked ? :artifacts_locked : :unlocked
- create(:ci_pipeline, trait, ref: ref, tag: tag, project: project, child_of: child_of).tap do |p|
+ create(:ci_pipeline, trait, status: status, ref: ref, tag: tag, project: project, child_of: child_of).tap do |p|
if child_of
build = create(:ci_build, pipeline: child_of)
create(:ci_sources_pipeline, source_job: build, source_project: project, pipeline: p, project: project)
diff --git a/spec/tooling/danger/gitlab_schema_validation_suggestion_spec.rb b/spec/tooling/danger/gitlab_schema_validation_suggestion_spec.rb
new file mode 100644
index 00000000000..c83e0319423
--- /dev/null
+++ b/spec/tooling/danger/gitlab_schema_validation_suggestion_spec.rb
@@ -0,0 +1,108 @@
+# frozen_string_literal: true
+
+require 'fast_spec_helper'
+require 'gitlab/dangerfiles/spec_helper'
+
+require_relative '../../../tooling/danger/gitlab_schema_validation_suggestion'
+require_relative '../../../tooling/danger/project_helper'
+
+RSpec.describe Tooling::Danger::GitlabSchemaValidationSuggestion, feature_category: :cell do
+ include_context "with dangerfile"
+
+ let(:fake_danger) { DangerSpecHelper.fake_danger.include(described_class) }
+ let(:fake_project_helper) { instance_double(Tooling::Danger::ProjectHelper) }
+ let(:filename) { 'db/docs/application_settings.yml' }
+ let(:file_lines) do
+ file_diff.map { |line| line.delete_prefix('+') }
+ end
+
+ let(:file_diff) do
+ [
+ "+---",
+ "+table_name: application_settings",
+ "+classes:",
+ "+- ApplicationSetting",
+ "+feature_categories:",
+ "+- continuous_integration",
+ "+description: GitLab application settings",
+ "+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/8589b4e137f50293952923bb07e2814257d7784d",
+ "+milestone: '7.7'",
+ "+gitlab_schema: #{schema}"
+ ]
+ end
+
+ subject(:gitlab_schema_validation) { fake_danger.new(helper: fake_helper) }
+
+ before do
+ allow(gitlab_schema_validation).to receive(:project_helper).and_return(fake_project_helper)
+ allow(gitlab_schema_validation.project_helper).to receive(:file_lines).and_return(file_lines)
+ allow(gitlab_schema_validation.helper).to receive(:changed_lines).with(filename).and_return(file_diff)
+ allow(gitlab_schema_validation.helper).to receive(:all_changed_files).and_return([filename])
+ end
+
+ shared_examples_for 'does not add a comment' do
+ it do
+ expect(gitlab_schema_validation).not_to receive(:markdown)
+
+ gitlab_schema_validation.add_suggestions_on_using_clusterwide_schema
+ end
+ end
+
+ context 'for discouraging the use of gitlab_main_clusterwide schema' do
+ let(:schema) { 'gitlab_main_clusterwide' }
+
+ context 'when the file path matches' do
+ it 'adds the comment' do
+ expected_comment = "\n#{described_class::SUGGESTION.chomp}"
+
+ expect(gitlab_schema_validation).to receive(:markdown).with(expected_comment, file: filename, line: 10)
+
+ gitlab_schema_validation.add_suggestions_on_using_clusterwide_schema
+ end
+ end
+
+ context 'when the file path does not match' do
+ let(:filename) { 'some_path/application_settings.yml' }
+
+ it_behaves_like 'does not add a comment'
+ end
+
+ context 'for EE' do
+ let(:filename) { 'ee/db/docs/application_settings.yml' }
+
+ it_behaves_like 'does not add a comment'
+ end
+
+ context 'for a deleted table' do
+ let(:filename) { 'db/docs/deleted_tables/application_settings.yml' }
+
+ it_behaves_like 'does not add a comment'
+ end
+ end
+
+ context 'on removing the gitlab_main_clusterwide schema' do
+ let(:file_diff) do
+ [
+ "+---",
+ "+table_name: application_settings",
+ "+classes:",
+ "+- ApplicationSetting",
+ "+feature_categories:",
+ "+- continuous_integration",
+ "+description: GitLab application settings",
+ "+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/8589b4e137f50293952923bb07e2814257d7784d",
+ "+milestone: '7.7'",
+ "-gitlab_schema: gitlab_main_clusterwide",
+ "+gitlab_schema: gitlab_main_cell"
+ ]
+ end
+
+ it_behaves_like 'does not add a comment'
+ end
+
+ context 'when a different schema is added' do
+ let(:schema) { 'gitlab_main' }
+
+ it_behaves_like 'does not add a comment'
+ end
+end
diff --git a/spec/views/ci/status/_icon.html.haml_spec.rb b/spec/views/ci/status/_icon.html.haml_spec.rb
index 78b19957cf0..a3058b20255 100644
--- a/spec/views/ci/status/_icon.html.haml_spec.rb
+++ b/spec/views/ci/status/_icon.html.haml_spec.rb
@@ -31,7 +31,7 @@ RSpec.describe 'ci/status/_icon' do
end
it 'contains build status text' do
- expect(rendered).to have_css('.ci-status-icon.ci-status-icon-success')
+ expect(rendered).to have_css('[data-testid="status_success_borderless-icon"]')
end
it 'does not contain links' do
@@ -59,7 +59,7 @@ RSpec.describe 'ci/status/_icon' do
end
it 'contains valid commit status text' do
- expect(rendered).to have_css('.ci-status-icon.ci-status-icon-running')
+ expect(rendered).to have_css('[data-testid="status_running_borderless-icon"]')
end
it 'has link to external status page' do
@@ -75,7 +75,7 @@ RSpec.describe 'ci/status/_icon' do
end
it 'contains valid commit status text' do
- expect(rendered).to have_css('.ci-status-icon.ci-status-icon-canceled')
+ expect(rendered).to have_css('[data-testid="status_canceled_borderless-icon"]')
end
it 'has link to external status page' do
diff --git a/spec/views/layouts/header/_new_dropdown.haml_spec.rb b/spec/views/layouts/header/_new_dropdown.haml_spec.rb
index 2c5882fce3d..ef028da7ab9 100644
--- a/spec/views/layouts/header/_new_dropdown.haml_spec.rb
+++ b/spec/views/layouts/header/_new_dropdown.haml_spec.rb
@@ -185,6 +185,11 @@ RSpec.describe 'layouts/header/_new_dropdown', feature_category: :navigation do
context 'when the user is not allowed to do anything' do
let(:user) { create(:user, :external) } # rubocop:disable RSpec/FactoryBot/AvoidCreate
+ before do
+ allow(user).to receive(:can?).and_call_original
+ allow(user).to receive(:can?).with(:create_organization).and_return(false)
+ end
+
it 'is nil' do
# We have to use `view.render` because `render` causes issues
# https://github.com/rails/rails/issues/41320
diff --git a/spec/views/projects/issues/_related_branches.html.haml_spec.rb b/spec/views/projects/issues/_related_branches.html.haml_spec.rb
index 11c398f4e3b..d37c8c762a3 100644
--- a/spec/views/projects/issues/_related_branches.html.haml_spec.rb
+++ b/spec/views/projects/issues/_related_branches.html.haml_spec.rb
@@ -25,7 +25,7 @@ RSpec.describe 'projects/issues/_related_branches' do
expect(rendered).to have_text('other')
expect(rendered).to have_link(href: 'link-to-feature')
expect(rendered).to have_link(href: 'link-to-other')
- expect(rendered).to have_css('.ci-status-icon')
+ expect(rendered).to have_css('[data-testid="ci-icon"]')
expect(rendered).to have_css('.related-branch-info')
end
end
diff --git a/spec/views/projects/tags/index.html.haml_spec.rb b/spec/views/projects/tags/index.html.haml_spec.rb
index 01e8d23fb9f..0ac5efa2e6d 100644
--- a/spec/views/projects/tags/index.html.haml_spec.rb
+++ b/spec/views/projects/tags/index.html.haml_spec.rb
@@ -91,7 +91,7 @@ RSpec.describe 'projects/tags/index.html.haml' do
render
- expect(page.find('.tags .content-list li', text: tag)).to have_css '.gl-badge .ci-status-icon-success'
+ expect(page.find('.tags .content-list li', text: tag)).to have_css '[data-testid="status_success_borderless-icon"]'
expect(page.all('.tags .content-list li')).to all(have_css('svg.s16'))
end
diff --git a/spec/workers/ci/refs/unlock_previous_pipelines_worker_spec.rb b/spec/workers/ci/refs/unlock_previous_pipelines_worker_spec.rb
index 2f00ea45edc..558ac5b9e0b 100644
--- a/spec/workers/ci/refs/unlock_previous_pipelines_worker_spec.rb
+++ b/spec/workers/ci/refs/unlock_previous_pipelines_worker_spec.rb
@@ -17,6 +17,7 @@ RSpec.describe Ci::Refs::UnlockPreviousPipelinesWorker, :unlock_pipelines, :clea
create(
:ci_pipeline,
:with_persisted_artifacts,
+ :artifacts_locked,
ref: older_pipeline.ref,
tag: older_pipeline.tag,
project: older_pipeline.project
@@ -25,12 +26,30 @@ RSpec.describe Ci::Refs::UnlockPreviousPipelinesWorker, :unlock_pipelines, :clea
describe '#perform' do
it 'executes a service' do
+ ci_ref = pipeline.ci_ref
+ expect(ci_ref).to receive(:last_unlockable_ci_source_pipeline).and_return(pipeline)
+
+ expect(Ci::Ref).to receive(:find_by_id).with(pipeline.ci_ref.id).and_return(ci_ref)
+
expect_next_instance_of(Ci::Refs::EnqueuePipelinesToUnlockService) do |instance|
- expect(instance).to receive(:execute).and_call_original
+ expect(instance).to receive(:execute).with(ci_ref, before_pipeline: pipeline).and_call_original
end
worker.perform(pipeline.ci_ref.id)
end
+
+ context 'when ref has no pipelines locked' do
+ before do
+ older_pipeline.update!(locked: :unlocked)
+ pipeline.update!(locked: :unlocked)
+ end
+
+ it 'does nothing' do
+ expect(Ci::Refs::EnqueuePipelinesToUnlockService).not_to receive(:new)
+
+ worker.perform(pipeline.ci_ref.id)
+ end
+ end
end
it_behaves_like 'an idempotent worker' do
diff --git a/tooling/danger/gitlab_schema_validation_suggestion.rb b/tooling/danger/gitlab_schema_validation_suggestion.rb
new file mode 100644
index 00000000000..e1f049fc732
--- /dev/null
+++ b/tooling/danger/gitlab_schema_validation_suggestion.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require_relative 'suggestion'
+
+module Tooling
+ module Danger
+ module GitlabSchemaValidationSuggestion
+ include ::Tooling::Danger::Suggestor
+
+ MATCH = %r{gitlab_schema: gitlab_main_clusterwide}
+ REPLACEMENT = nil
+ DB_DOCS_PATH = %r{\Adb/docs/[^/]+\.ya?ml\z}
+
+ SUGGESTION = <<~MESSAGE_MARKDOWN
+ :warning: You have added `gitlab_main_clusterwide` as the schema for this table. We expect most tables to use the
+ `gitlab_main_cell` schema instead, as using the clusterwide schema can have significant scaling implications.
+
+ Please see the [guidelines on choosing gitlab schema](https://docs.gitlab.com/ee/development/database/multiple_databases.html#guidelines-on-choosing-between-gitlab_main_cell-and-gitlab_main_clusterwide-schema) for more information.
+
+ Please consult with ~"group::tenant scale" if you believe that the clusterwide schema is the best fit for this table.
+ MESSAGE_MARKDOWN
+
+ def add_suggestions_on_using_clusterwide_schema
+ helper.all_changed_files.grep(DB_DOCS_PATH).each do |filename|
+ add_suggestion(
+ filename: filename,
+ regex: MATCH,
+ replacement: REPLACEMENT,
+ comment_text: SUGGESTION
+ )
+ end
+ end
+ end
+ end
+end