diff options
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 |