diff --git a/.eslintignore b/.eslintignore index 1d069e1938..b7769ef897 100644 --- a/.eslintignore +++ b/.eslintignore @@ -9,3 +9,4 @@ /sitespeed-result/ /fixtures/**/*.graphql spec/fixtures/**/*.graphql +**/contracts/consumer/ diff --git a/.eslintrc.yml b/.eslintrc.yml index 549f177159..f5814639b3 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -105,6 +105,8 @@ overrides: message: 'Avoid using "setData" on VTU wrapper' - selector: MemberExpression[object.type!='ThisExpression'][property.type='Identifier'][property.name='$nextTick'] message: 'Using $nextTick from a component instance is discouraged. Import nextTick directly from the Vue package.' + - selector: Identifier[name='setImmediate'] + message: 'Prefer explicit waitForPromises (or equivalent), or jest.runAllTimers (or equivalent) to vague setImmediate calls.' - files: - 'config/**/*' - 'scripts/**/*' diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1b551967cb..05d4c2bb6d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,7 +16,7 @@ stages: # in cases where jobs require Docker-in-Docker, the job # definition must be extended with `.use-docker-in-docker` default: - image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-14.15-yarn-1.22-postgresql-11-graphicsmagick-1.3.36 + image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-11-graphicsmagick-1.3.36 tags: - gitlab-org # All jobs are interruptible by default @@ -65,10 +65,15 @@ variables: # we override the max_old_space_size to prevent OOM errors NODE_OPTIONS: --max_old_space_size=3584 GIT_DEPTH: "20" + # 'GIT_STRATEGY: clone' optimizes the pack-objects cache hit ratio + GIT_STRATEGY: "clone" GIT_SUBMODULE_STRATEGY: "none" GET_SOURCES_ATTEMPTS: "3" DEBIAN_VERSION: "bullseye" + TMP_TEST_FOLDER: "${CI_PROJECT_DIR}/tmp/tests" + GITLAB_WORKHORSE_FOLDER: "gitlab-workhorse" + TMP_TEST_GITLAB_WORKHORSE_PATH: "${TMP_TEST_FOLDER}/${GITLAB_WORKHORSE_FOLDER}" KNAPSACK_RSPEC_SUITE_REPORT_PATH: knapsack/report-master.json FLAKY_RSPEC_SUITE_REPORT_PATH: rspec/flaky/report-suite.json RSPEC_TESTS_MAPPING_PATH: crystalball/mapping.json @@ -86,6 +91,8 @@ variables: CHECK_PRECOMPILED_ASSETS: "true" FF_USE_FASTZIP: "true" SKIP_FLAKY_TESTS_AUTOMATICALLY: "true" + # Run with decomposed databases by default + DECOMPOSED_DB: "true" DOCS_REVIEW_APPS_DOMAIN: "178.62.207.141.nip.io" DOCS_GITLAB_REPO_SUFFIX: "ee" diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index ab9805bda7..26ce20e976 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -208,7 +208,9 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/.markdownlint @marcel.amirault @eread @aqualls @cnorris /doc/ @gl-docsteam /doc/.vale/ @marcel.amirault @eread @aqualls @cnorris -/doc/administration/application_settings_cache.md @marcia + +[Documentation Pages] +/doc/administration/application_settings_cache.md @marcel.amirault /doc/administration/audit_event_streaming.md @eread /doc/administration/audit_events.md @eread /doc/administration/audit_reports.md @eread @@ -226,7 +228,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/administration/auth/oidc.md @eread /doc/administration/auth/smartcard.md @eread /doc/administration/cicd.md @marcel.amirault -/doc/administration/clusters/kas.md @marcia +/doc/administration/clusters/kas.md @sselhorn /doc/administration/compliance.md @eread /doc/administration/configure.md @axil /doc/administration/consul.md @axil @@ -259,17 +261,21 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/administration/maintenance_mode/index.md @axil /doc/administration/merge_request_diffs.md @aqualls /doc/administration/monitoring/ @ngaskill +/doc/administration/monitoring/prometheus/index.md @axil /doc/administration/nfs.md @axil /doc/administration/object_storage.md @axil /doc/administration/operations/ @axil -/doc/administration/operations/sidekiq_memory_killer.md @marcia +/doc/administration/operations/moving_repositories.md @eread +/doc/administration/operations/sidekiq_memory_killer.md @marcel.amirault /doc/administration/package_information/ @axil /doc/administration/packages/ @ngaskill -/doc/administration/pages/ @rdickenson +/doc/administration/pages/index.md @rdickenson +/doc/administration/pages/source.md @rdickenson /doc/administration/polling.md @axil -/doc/administration/postgresql/ @marcia +/doc/administration/postgresql/ @aqualls /doc/administration/pseudonymizer.md @axil /doc/administration/raketasks/ @axil +/doc/administration/raketasks/praefect.md @eread /doc/administration/read_only_gitlab.md @axil /doc/administration/redis/ @axil /doc/administration/reference_architectures/ @axil @@ -280,15 +286,16 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/administration/repository_storage_types.md @eread /doc/administration/restart_gitlab.md @axil /doc/administration/server_hooks.md @eread +/doc/administration/sidekiq_health_check.md @axil /doc/administration/sidekiq.md @axil /doc/administration/smime_signing_email.md @axil /doc/administration/snippets/index.md @aqualls /doc/administration/static_objects_external_storage.md @aqualls -/doc/administration/terraform_state.md @marcia +/doc/administration/terraform_state.md @sselhorn /doc/administration/timezone.md @axil /doc/administration/troubleshooting/ @axil -/doc/administration/troubleshooting/group_saml_scim.md @eread -/doc/administration/troubleshooting/postgresql.md @marcia +/doc/administration/troubleshooting/elasticsearch.md @rdickenson +/doc/administration/troubleshooting/postgresql.md @aqualls /doc/administration/uploads.md @axil /doc/administration/user_settings.md @eread /doc/administration/whats-new.md @kpaizee @@ -336,7 +343,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/group_activity_analytics.md @fneill /doc/api/group_badges.md @eread /doc/api/group_boards.md @msedlakjakubowski -/doc/api/group_clusters.md @marcia +/doc/api/group_clusters.md @sselhorn /doc/api/group_import_export.md @ngaskill /doc/api/group_iterations.md @msedlakjakubowski /doc/api/group_labels.md @msedlakjakubowski @@ -349,7 +356,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/groups.md @eread /doc/api/import.md @ngaskill /doc/api/index.md @kpaizee -/doc/api/instance_clusters.md @marcia +/doc/api/instance_clusters.md @sselhorn /doc/api/instance_level_ci_variables.md @marcel.amirault /doc/api/integrations.md @kpaizee /doc/api/invitations.md @kpaizee @@ -389,7 +396,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/plan_limits.md @eread /doc/api/project_aliases.md @aqualls /doc/api/project_badges.md @aqualls -/doc/api/project_clusters.md @marcia +/doc/api/project_clusters.md @sselhorn /doc/api/project_import_export.md @aqualls /doc/api/project_level_variables.md @marcel.amirault /doc/api/project_relations_export.md @ngaskill @@ -408,7 +415,6 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/repositories.md @aqualls /doc/api/repository_files.md @aqualls /doc/api/repository_submodules.md @aqualls -/doc/api/resource_access_tokens.md @eread /doc/api/resource_groups.md @rdickenson /doc/api/resource_iteration_events.md @msedlakjakubowski /doc/api/resource_label_events.md @eread @@ -418,6 +424,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/runners.md @sselhorn /doc/api/scim.md @eread /doc/api/search.md @aqualls +/doc/api/secure_files.md @marcel.amirault /doc/api/settings.md @eread /doc/api/sidekiq_metrics.md @axil /doc/api/snippet_repository_storage_moves.md @aqualls @@ -435,7 +442,6 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/topics.md @fneill /doc/api/usage_data.md @fneill /doc/api/users.md @eread -/doc/api/v3_to_v4.md @kpaizee /doc/api/version.md @kpaizee /doc/api/visual_review_discussions.md @eread /doc/api/vulnerabilities.md @fneill @@ -443,13 +449,14 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/api/vulnerability_findings.md @fneill /doc/api/wikis.md @aqualls /doc/architecture/blueprints/container_registry_metadata_database/index.md @ngaskill -/doc/architecture/blueprints/database/scalability/patterns/ @marcia -/doc/architecture/blueprints/gitlab_to_kubernetes_communication/index.md @marcia +/doc/architecture/blueprints/database/scalability/patterns/ @aqualls +/doc/architecture/blueprints/gitlab_to_kubernetes_communication/index.md @sselhorn /doc/ci/caching/index.md @marcel.amirault -/doc/ci/chatops/index.md @marcia +/doc/ci/chatops/index.md @sselhorn /doc/ci/ci_cd_for_external_repos/ @marcel.amirault /doc/ci/cloud_deployment/ecs/quick_start_guide.md @rdickenson /doc/ci/cloud_deployment/index.md @rdickenson +/doc/ci/cloud_services/ @marcel.amirault /doc/ci/directed_acyclic_graph/index.md @marcel.amirault /doc/ci/docker/index.md @marcel.amirault /doc/ci/docker/using_docker_build.md @marcel.amirault @@ -457,7 +464,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/ci/docker/using_kaniko.md @marcel.amirault /doc/ci/enable_or_disable_ci.md @marcel.amirault /doc/ci/environments/ @rdickenson -/doc/ci/examples/authenticating-with-hashicorp-vault/index.md @rdickenson +/doc/ci/examples/authenticating-with-hashicorp-vault/index.md @marcel.amirault /doc/ci/examples/deployment/composer-npm-deploy.md @rdickenson /doc/ci/examples/deployment/index.md @rdickenson /doc/ci/examples/end_to_end_testing_webdriverio/index.md @eread @@ -485,7 +492,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/ci/resource_groups/index.md @rdickenson /doc/ci/review_apps/index.md @eread /doc/ci/runners/ @sselhorn -/doc/ci/secrets/index.md @marcia +/doc/ci/secrets/index.md @marcel.amirault /doc/ci/services/ @sselhorn /doc/ci/ssh_keys/index.md @marcel.amirault /doc/ci/test_cases/index.md @msedlakjakubowski @@ -495,104 +502,84 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/ci/variables/ @marcel.amirault /doc/ci/yaml/ @marcel.amirault /doc/ci/yaml/artifacts_reports.md @eread -/doc/development/adding_database_indexes.md @marcia +/doc/development/adding_database_indexes.md @aqualls /doc/development/application_limits.md @axil /doc/development/approval_rules.md @aqualls /doc/development/audit_event_guide/index.md @eread -/doc/development/auto_devops.md @marcia -/doc/development/avoiding_downtime_in_migrations.md @marcia -/doc/development/backend/ruby_style_guide.md @marcia -/doc/development/background_migrations.md @marcia +/doc/development/auto_devops.md @sselhorn +/doc/development/avoiding_downtime_in_migrations.md @aqualls +/doc/development/backend/create_source_code_be/index.md @aqualls /doc/development/build_test_package.md @axil /doc/development/bulk_import.md @ngaskill /doc/development/cascading_settings.md @eread -/doc/development/chatops_on_gitlabcom.md @marcia +/doc/development/chatops_on_gitlabcom.md @sselhorn /doc/development/cicd/cicd_reference_documentation_guide.md @marcel.amirault /doc/development/cicd/index.md @marcel.amirault +/doc/development/cicd/schema.md @marcel.amirault /doc/development/cicd/templates.md @marcel.amirault /doc/development/code_intelligence/index.md @aqualls -/doc/development/contributing/ @marcia -/doc/development/creating_enums.md @marcia -/doc/development/database_debugging.md @marcia -/doc/development/database_query_comments.md @marcia -/doc/development/database_review.md @marcia -/doc/development/database/ @marcia -/doc/development/db_dump.md @marcia +/doc/development/creating_enums.md @aqualls +/doc/development/database_debugging.md @aqualls +/doc/development/database_query_comments.md @aqualls +/doc/development/database_review.md @aqualls +/doc/development/database/ @aqualls +/doc/development/db_dump.md @aqualls /doc/development/developing_with_solargraph.md @aqualls /doc/development/distributed_tracing.md @ngaskill -/doc/development/documentation/feature_flags.md @marcia -/doc/development/documentation/graphql_styleguide.md @marcia +/doc/development/documentation/feature_flags.md @sselhorn +/doc/development/documentation/graphql_styleguide.md @sselhorn /doc/development/documentation/index.md @cnorris /doc/development/documentation/redirects.md @cnorris -/doc/development/documentation/restful_api_styleguide.md @marcia /doc/development/documentation/review_apps.md @cnorris /doc/development/documentation/structure.md @sselhorn -/doc/development/documentation/styleguide/index.md @sselhorn -/doc/development/documentation/styleguide/word_list.md @sselhorn +/doc/development/documentation/styleguide/ @sselhorn /doc/development/documentation/testing.md @cnorris -/doc/development/elasticsearch.md @marcia +/doc/development/elasticsearch.md @rdickenson /doc/development/experiment_guide/ @kpaizee /doc/development/export_csv.md @ngaskill /doc/development/fe_guide/content_editor.md @aqualls -/doc/development/fe_guide/dark_mode.md @marcia -/doc/development/fe_guide/graphql.md @marcia /doc/development/fe_guide/source_editor.md @aqualls -/doc/development/feature_categorization/index.md @marcia -/doc/development/feature_flags/controls.md @marcia -/doc/development/feature_flags/index.md @marcia /doc/development/filtering_by_label.md @msedlakjakubowski -/doc/development/foreign_keys.md @marcia +/doc/development/foreign_keys.md @aqualls /doc/development/geo.md @axil /doc/development/geo/framework.md @axil /doc/development/git_object_deduplication.md @eread /doc/development/gitaly.md @eread -/doc/development/graphql_guide/batchloader.md @marcia -/doc/development/graphql_guide/graphql_pro.md @kpaizee -/doc/development/graphql_guide/index.md @kpaizee -/doc/development/graphql_guide/pagination.md @kpaizee -/doc/development/hash_indexes.md @marcia +/doc/development/graphql_guide/ @kpaizee +/doc/development/graphql_guide/batchloader.md @aqualls +/doc/development/hash_indexes.md @aqualls /doc/development/i18n/ @ngaskill -/doc/development/image_scaling.md @marcia +/doc/development/image_scaling.md @marcel.amirault /doc/development/import_export.md @ngaskill -/doc/development/index.md @marcia -/doc/development/insert_into_tables_in_batches.md @marcia -/doc/development/integrations/codesandbox.md @marcia +/doc/development/insert_into_tables_in_batches.md @aqualls /doc/development/integrations/jenkins.md @kpaizee /doc/development/integrations/jira_connect.md @kpaizee /doc/development/integrations/secure_partner_integration.md @rdickenson /doc/development/integrations/secure.md @ngaskill /doc/development/internal_api/ @aqualls -/doc/development/internal_users.md @marcia /doc/development/issuable-like-models.md @msedlakjakubowski /doc/development/issue_types.md @msedlakjakubowski -/doc/development/iterating_tables_in_batches.md @marcia -/doc/development/kubernetes.md @marcia +/doc/development/iterating_tables_in_batches.md @aqualls +/doc/development/kubernetes.md @sselhorn /doc/development/lfs.md @aqualls /doc/development/licensed_feature_availability.md @sselhorn -/doc/development/logging.md @ngaskill /doc/development/maintenance_mode.md @axil /doc/development/new_fe_guide/modules/widget_extensions.md @aqualls -/doc/development/new_fe_guide/tips.md @marcia /doc/development/omnibus.md @axil -/doc/development/ordering_table_columns.md @marcia +/doc/development/ordering_table_columns.md @aqualls /doc/development/packages.md @ngaskill -/doc/development/permissions.md @eread -/doc/development/policies.md @eread -/doc/development/prometheus_metrics.md @ngaskill -/doc/development/query_performance.md @marcia +/doc/development/product_qualified_lead_guide/index.md @kpaizee +/doc/development/query_performance.md @aqualls /doc/development/real_time.md @msedlakjakubowski -/doc/development/secure_coding_guidelines.md @marcia -/doc/development/serializing_data.md @marcia +/doc/development/serializing_data.md @aqualls /doc/development/service_ping/ @fneill /doc/development/snowplow/ @fneill -/doc/development/sql.md @marcia -/doc/development/stage_group_dashboards.md @marcia -/doc/development/swapping_tables.md @marcia -/doc/development/testing_guide/best_practices.md @marcia -/doc/development/testing_guide/end_to_end/best_practices.md @marcia -/doc/development/understanding_explain_plans.md @marcia +/doc/development/sql.md @aqualls +/doc/development/swapping_tables.md @aqualls +/doc/development/understanding_explain_plans.md @aqualls /doc/development/value_stream_analytics.md @fneill -/doc/development/verifying_database_capabilities.md @marcia +/doc/development/value_stream_analytics/value_stream_analytics_aggregated_backend.md @fneill +/doc/development/verifying_database_capabilities.md @aqualls /doc/development/wikis.md @aqualls /doc/development/work_items.md @msedlakjakubowski /doc/development/work_items_widgets.md @msedlakjakubowski @@ -605,7 +592,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/gitlab-basics/start-using-git.md @aqualls /doc/install/ @axil /doc/integration/ @kpaizee -/doc/integration/elasticsearch.md @marcia +/doc/integration/elasticsearch.md @rdickenson /doc/integration/gitpod.md @aqualls /doc/integration/kerberos.md @eread /doc/integration/mattermost/index.md @axil @@ -613,7 +600,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/integration/saml.md @eread /doc/integration/security_partners/index.md @rdickenson /doc/integration/sourcegraph.md @aqualls -/doc/integration/vault.md @rdickenson +/doc/integration/vault.md @sselhorn /doc/operations/ @ngaskill /doc/operations/feature_flags.md @rdickenson /doc/operations/product_analytics.md @fneill @@ -626,18 +613,17 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/raketasks/x509_signatures.md @aqualls /doc/security/ @eread /doc/ssh/index.md @eread -/doc/subscriptions/ @sselhorn +/doc/subscriptions/ @fneill /doc/system_hooks/system_hooks.md @kpaizee /doc/topics/authentication/index.md @eread -/doc/topics/autodevops/customize.md @marcia -/doc/topics/autodevops/ @marcia +/doc/topics/autodevops/ @sselhorn /doc/topics/git/ @aqualls /doc/topics/gitlab_flow.md @aqualls /doc/topics/offline/ @axil /doc/topics/plan_and_track.md @msedlakjakubowski /doc/update/ @axil -/doc/update/mysql_to_postgresql.md @marcia -/doc/update/upgrading_postgresql_using_slony.md @marcia +/doc/update/mysql_to_postgresql.md @aqualls +/doc/update/upgrading_postgresql_using_slony.md @aqualls /doc/user/admin_area/analytics/ @fneill /doc/user/admin_area/broadcast_messages.md @kpaizee /doc/user/admin_area/credentials_inventory.md @eread @@ -648,8 +634,9 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/admin_area/license.md @kpaizee /doc/user/admin_area/merge_requests_approvals.md @aqualls /doc/user/admin_area/moderate_users.md @eread -/doc/user/admin_area/monitoring/background_migrations.md @marcia +/doc/user/admin_area/monitoring/background_migrations.md @aqualls /doc/user/admin_area/monitoring/health_check.md @ngaskill +/doc/user/admin_area/reporting/spamcheck.md @axil /doc/user/admin_area/review_abuse_reports.md @eread /doc/user/admin_area/settings/account_and_limit_settings.md @aqualls /doc/user/admin_area/settings/continuous_integration.md @marcel.amirault @@ -667,6 +654,8 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/admin_area/settings/push_event_activities_limit.md @aqualls /doc/user/admin_area/settings/rate_limit_on_issues_creation.md @msedlakjakubowski /doc/user/admin_area/settings/rate_limit_on_notes_creation.md @msedlakjakubowski +/doc/user/admin_area/settings/rate_limit_on_users_api.md @eread +/doc/user/admin_area/settings/third_party_offers.md @fneill /doc/user/admin_area/settings/visibility_and_access_controls.md @aqualls /doc/user/analytics/ci_cd_analytics.md @rdickenson /doc/user/analytics/ @fneill @@ -674,20 +663,20 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/application_security/cluster_image_scanning/index.md @ngaskill /doc/user/application_security/container_scanning/index.md @ngaskill /doc/user/application_security/cve_id_request.md @fneill -/doc/user/application_security/policies/index.md @ngaskill +/doc/user/application_security/policies/ @ngaskill /doc/user/application_security/security_dashboard/index.md @fneill /doc/user/application_security/threat_monitoring/index.md @ngaskill /doc/user/application_security/vulnerabilities/ @fneill /doc/user/application_security/vulnerability_report/index.md @fneill /doc/user/asciidoc.md @aqualls /doc/user/award_emojis.md @msedlakjakubowski -/doc/user/clusters/ @marcia +/doc/user/clusters/ @sselhorn /doc/user/compliance/compliance_report/index.md @eread /doc/user/compliance/index.md @eread /doc/user/compliance/license_compliance/index.md @rdickenson +/doc/user/crm/index.md @msedlakjakubowski /doc/user/discussions/index.md @aqualls -/doc/user/feature_flags.md @marcia -/doc/user/group/clusters/index.md @marcia +/doc/user/group/clusters/index.md @sselhorn /doc/user/group/contribution_analytics/index.md @fneill /doc/user/group/custom_project_templates.md @ngaskill /doc/user/group/devops_adoption/index.md @fneill @@ -699,6 +688,7 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/group/insights/index.md @fneill /doc/user/group/issues_analytics/index.md @msedlakjakubowski /doc/user/group/iterations/index.md @msedlakjakubowski +/doc/user/group/planning_hierarchy/index.md @msedlakjakubowski /doc/user/group/repositories_analytics/index.md @eread /doc/user/group/roadmap/index.md @msedlakjakubowski /doc/user/group/saml_sso/group_managed_accounts.md @eread @@ -707,31 +697,24 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/group/settings/import_export.md @ngaskill /doc/user/group/subgroups/index.md @eread /doc/user/group/value_stream_analytics/index.md @fneill -/doc/user/infrastructure/clusters/ @marcia -/doc/user/infrastructure/clusters/manage/clusters_health.md @marcia +/doc/user/infrastructure/clusters/ @sselhorn /doc/user/infrastructure/clusters/manage/management_project_applications/apparmor.md @ngaskill -/doc/user/infrastructure/clusters/manage/management_project_applications/certmanager.md @marcia /doc/user/infrastructure/clusters/manage/management_project_applications/cilium.md @ngaskill /doc/user/infrastructure/clusters/manage/management_project_applications/elasticstack.md @ngaskill /doc/user/infrastructure/clusters/manage/management_project_applications/falco.md @ngaskill /doc/user/infrastructure/clusters/manage/management_project_applications/fluentd.md @ngaskill -/doc/user/infrastructure/clusters/manage/management_project_applications/ingress.md @marcia -/doc/user/infrastructure/clusters/manage/management_project_applications/prometheus.md @ngaskill -/doc/user/infrastructure/clusters/manage/management_project_applications/runner.md @sselhorn -/doc/user/infrastructure/clusters/manage/management_project_applications/sentry.md @ngaskill -/doc/user/infrastructure/clusters/manage/management_project_applications/vault.md @marcia -/doc/user/infrastructure/iac/ @marcia -/doc/user/infrastructure/index.md @marcia +/doc/user/infrastructure/iac/ @sselhorn +/doc/user/infrastructure/index.md @ssehorn /doc/user/markdown.md @aqualls /doc/user/packages/ @ngaskill -/doc/user/packages/infrastructure_registry/index.md @marcia -/doc/user/packages/terraform_module_registry/index.md @marcia +/doc/user/packages/infrastructure_registry/index.md @sselhorn +/doc/user/packages/terraform_module_registry/index.md @sselhorn /doc/user/permissions.md @eread /doc/user/profile/ @eread /doc/user/profile/notifications.md @msedlakjakubowski /doc/user/project/autocomplete_characters.md @aqualls /doc/user/project/badges.md @aqualls -/doc/user/project/clusters/ @marcia +/doc/user/project/clusters/ @sselhorn /doc/user/project/clusters/kubernetes_pod_logs.md @ngaskill /doc/user/project/clusters/protect/ @ngaskill /doc/user/project/code_intelligence.md @aqualls @@ -786,10 +769,11 @@ lib/gitlab/checks/** @proglottis @toon @zj-gitlab /doc/user/project/wiki/index.md @aqualls /doc/user/project/working_with_projects.md @fneill /doc/user/reserved_names.md @fneill -/doc/user/search/advanced_search.md @marcia +/doc/user/search/advanced_search.md @rdickenson /doc/user/search/index.md @aqualls +/doc/user/shortcuts.md @aqualls /doc/user/snippets.md @aqualls /doc/user/tasks.md @msedlakjakubowski /doc/user/todos.md @msedlakjakubowski -/doc/user/usage_quotas.md @sselhorn +/doc/user/usage_quotas.md @fneill /doc/user/workspace/index.md @fneill diff --git a/.gitlab/ci/ci-templates.gitlab-ci.yml b/.gitlab/ci/ci-templates.gitlab-ci.yml new file mode 100644 index 0000000000..d6e2fdf2fb --- /dev/null +++ b/.gitlab/ci/ci-templates.gitlab-ci.yml @@ -0,0 +1,13 @@ +templates-shellcheck: + extends: + - .ci-templates:rules:shellcheck + - .default-before_script + - .default-retry + - .ruby-cache + - .use-pg13 + stage: test + needs: + - setup-test-env + script: + - apt update && apt install -y shellcheck=0.7.1-1+deb11u1 + - bundle exec scripts/lint_templates_bash.rb diff --git a/.gitlab/ci/frontend.gitlab-ci.yml b/.gitlab/ci/frontend.gitlab-ci.yml index ef5af34254..cb07384676 100644 --- a/.gitlab/ci/frontend.gitlab-ci.yml +++ b/.gitlab/ci/frontend.gitlab-ci.yml @@ -11,7 +11,7 @@ - .default-retry - .default-before_script - .assets-compile-cache - image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7-git-2.33-lfs-2.9-node-14.15-yarn-1.22-graphicsmagick-1.3.36 + image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7-git-2.33-lfs-2.9-node-16.14-yarn-1.22-graphicsmagick-1.3.36 variables: SETUP_DB: "false" WEBPACK_VENDOR_DLL: "true" diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml index 33b04faf73..146a7067ac 100644 --- a/.gitlab/ci/global.gitlab-ci.yml +++ b/.gitlab/ci/global.gitlab-ci.yml @@ -213,7 +213,7 @@ - *storybook-node-modules-cache-push .use-pg11: - image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-14.15-yarn-1.22-postgresql-11-graphicsmagick-1.3.36 + image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-11-graphicsmagick-1.3.36 services: - name: postgres:11.6 command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] @@ -222,16 +222,16 @@ POSTGRES_HOST_AUTH_METHOD: trust .use-pg12: - image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-14.15-yarn-1.22-postgresql-12-graphicsmagick-1.3.36 + image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-12-graphicsmagick-1.3.36 services: - name: postgres:12 command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] - - name: redis:5.0-alpine + - name: redis:6.0-alpine variables: POSTGRES_HOST_AUTH_METHOD: trust .use-pg13: - image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-14.15-yarn-1.22-postgresql-13-graphicsmagick-1.3.36 + image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-13-graphicsmagick-1.3.36 services: - name: postgres:13 command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] @@ -240,34 +240,34 @@ POSTGRES_HOST_AUTH_METHOD: trust .use-pg11-ee: - image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-14.15-yarn-1.22-postgresql-11-graphicsmagick-1.3.36 + image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-11-graphicsmagick-1.3.36 services: - name: postgres:11.6 command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] - name: redis:5.0-alpine - - name: elasticsearch:7.14.2 + - name: elasticsearch:7.17.0 command: ["elasticsearch", "-E", "discovery.type=single-node"] variables: POSTGRES_HOST_AUTH_METHOD: trust .use-pg12-ee: - image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-14.15-yarn-1.22-postgresql-12-graphicsmagick-1.3.36 + image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-12-graphicsmagick-1.3.36 services: - name: postgres:12 command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] - - name: redis:5.0-alpine - - name: elasticsearch:7.14.2 + - name: redis:6.0-alpine + - name: elasticsearch:7.17.0 command: ["elasticsearch", "-E", "discovery.type=single-node"] variables: POSTGRES_HOST_AUTH_METHOD: trust .use-pg13-ee: - image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-14.15-yarn-1.22-postgresql-13-graphicsmagick-1.3.36 + image: ${REGISTRY_HOST}/${REGISTRY_GROUP}/gitlab-build-images:debian-${DEBIAN_VERSION}-ruby-2.7.patched-golang-1.16-git-2.33-lfs-2.9-chrome-97-node-16.14-yarn-1.22-postgresql-13-graphicsmagick-1.3.36 services: - name: postgres:13 command: ["postgres", "-c", "fsync=off", "-c", "synchronous_commit=off", "-c", "full_page_writes=off"] - name: redis:5.0-alpine - - name: elasticsearch:7.14.2 + - name: elasticsearch:7.17.0 command: ["elasticsearch", "-E", "discovery.type=single-node"] variables: POSTGRES_HOST_AUTH_METHOD: trust diff --git a/.gitlab/ci/memory.gitlab-ci.yml b/.gitlab/ci/memory.gitlab-ci.yml index c6572d9709..efdae0715a 100644 --- a/.gitlab/ci/memory.gitlab-ci.yml +++ b/.gitlab/ci/memory.gitlab-ci.yml @@ -9,7 +9,7 @@ artifacts: reports: metrics: "${METRICS_FILE}" - expire_in: 31d + expire_in: 62d # Show memory usage caused by invoking require per gem. @@ -26,11 +26,17 @@ memory-on-boot: NODE_ENV: "production" RAILS_ENV: "production" SETUP_DB: "true" - MEMORY_ON_BOOT_FILE: "tmp/memory_on_boot.txt" + MEMORY_ON_BOOT_FILE_PREFIX: "tmp/memory_on_boot_" + TEST_COUNT: 5 script: - - PATH_TO_HIT="/users/sign_in" CUT_OFF=0.3 bundle exec derailed exec perf:mem >> "${MEMORY_ON_BOOT_FILE}" - - scripts/generate-memory-metrics-on-boot "${MEMORY_ON_BOOT_FILE}" >> "${METRICS_FILE}" + - | + for i in $(seq 1 $TEST_COUNT) + do + echo "Starting run $i out of $TEST_COUNT" + PATH_TO_HIT="/users/sign_in" CUT_OFF=0.3 bundle exec derailed exec perf:mem >> "${MEMORY_ON_BOOT_FILE_PREFIX}$i.txt" + done + - scripts/generate-memory-metrics-on-boot "${MEMORY_ON_BOOT_FILE_PREFIX}" "$TEST_COUNT" >> "${METRICS_FILE}" artifacts: paths: - "${METRICS_FILE}" - - "${MEMORY_ON_BOOT_FILE}" + - "${MEMORY_ON_BOOT_FILE_PREFIX}*.txt" diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml index 8a4ea690c6..1c745e6d98 100644 --- a/.gitlab/ci/rails.gitlab-ci.yml +++ b/.gitlab/ci/rails.gitlab-ci.yml @@ -18,15 +18,14 @@ variables: RSPEC_TESTS_MAPPING_ENABLED: "true" -.decomposed-database: +.single-db: variables: - DECOMPOSED_DB: "true" + DECOMPOSED_DB: "false" -.decomposed-database-rspec: - extends: .decomposed-database +.single-db-rspec: + extends: .single-db variables: - GITLAB_LOAD_BALANCING_REUSE_PRIMARY_ci: "main" - GITLAB_USE_MODEL_LOAD_BALANCING: "true" + GITLAB_USE_MODEL_LOAD_BALANCING: "false" .rspec-base: extends: @@ -182,7 +181,7 @@ # rspec job parallel configs ############################ -####################################################### +############################################################### # EE/FOSS: default refs (MRs, default branch, schedules) jobs # setup-test-env: extends: @@ -193,40 +192,53 @@ setup-test-env: variables: SETUP_DB: "false" script: + - source scripts/gitlab_workhorse_component_helpers.sh + - run_timed_command "download_and_extract_gitlab_workhorse_package" || true - run_timed_command "scripts/setup-test-env" + - run_timed_command "select_gitlab_workhorse_essentials" - echo -e "\e[0Ksection_start:`date +%s`:gitaly-test-build[collapsed=true]\r\e[0KCompiling Gitaly binaries" - run_timed_command "scripts/gitaly-test-build" # Do not use 'bundle exec' here - echo -e "\e[0Ksection_end:`date +%s`:gitaly-test-build\r\e[0K" - artifacts: expire_in: 7d paths: - config/secrets.yml - - tmp/tests/gitaly/_build/bin/ - - tmp/tests/gitaly/_build/deps/git/install - - tmp/tests/gitaly/config.toml - - tmp/tests/gitaly/gitaly2.config.toml - - tmp/tests/gitaly/internal/ - - tmp/tests/gitaly/internal_gitaly2/ - - tmp/tests/gitaly/internal_sockets/ - - tmp/tests/gitaly/Makefile - - tmp/tests/gitaly/praefect.config.toml - - tmp/tests/gitaly/ruby/ - - tmp/tests/gitlab-elasticsearch-indexer/bin/gitlab-elasticsearch-indexer - - tmp/tests/gitlab-shell/ - - tmp/tests/gitlab-test-fork/ - - tmp/tests/gitlab-test-fork_bare/ - - tmp/tests/gitlab-test/ - - tmp/tests/gitlab-workhorse/gitlab-zip-metadata - - tmp/tests/gitlab-workhorse/gitlab-zip-cat - - tmp/tests/gitlab-workhorse/gitlab-workhorse - - tmp/tests/gitlab-workhorse/gitlab-resize-image - - tmp/tests/gitlab-workhorse/config.toml - - tmp/tests/gitlab-workhorse/WORKHORSE_TREE - - tmp/tests/repositories/ - - tmp/tests/second_storage/ + - ${TMP_TEST_FOLDER}/gitaly/_build/bin/ + - ${TMP_TEST_FOLDER}/gitaly/_build/deps/git/install + - ${TMP_TEST_FOLDER}/gitaly/config.toml + - ${TMP_TEST_FOLDER}/gitaly/gitaly2.config.toml + - ${TMP_TEST_FOLDER}/gitaly/internal/ + - ${TMP_TEST_FOLDER}/gitaly/internal_gitaly2/ + - ${TMP_TEST_FOLDER}/gitaly/internal_sockets/ + - ${TMP_TEST_FOLDER}/gitaly/Makefile + - ${TMP_TEST_FOLDER}/gitaly/praefect.config.toml + - ${TMP_TEST_FOLDER}/gitaly/ruby/ + - ${TMP_TEST_FOLDER}/gitlab-elasticsearch-indexer/bin/gitlab-elasticsearch-indexer + - ${TMP_TEST_FOLDER}/gitlab-shell/ + - ${TMP_TEST_FOLDER}/gitlab-test-fork/ + - ${TMP_TEST_FOLDER}/gitlab-test-fork_bare/ + - ${TMP_TEST_FOLDER}/gitlab-test/ + - ${TMP_TEST_FOLDER}/repositories/ + - ${TMP_TEST_FOLDER}/second_storage/ + - ${TMP_TEST_GITLAB_WORKHORSE_PATH}/ when: always +build-components: + extends: + - setup-test-env + - .rails:rules:build-components + script: + - source scripts/gitlab_workhorse_component_helpers.sh + - 'gitlab_workhorse_archive_doesnt_exist || { echoinfo "INFO: Exiting early as package exists."; exit 0; }' + - run_timed_command "scripts/setup-test-env" + - run_timed_command "select_gitlab_workhorse_essentials" + - run_timed_command "create_gitlab_workhorse_package" + - run_timed_command "upload_gitlab_workhorse_package" + artifacts: + expire_in: 7d + paths: + - ${TMP_TEST_GITLAB_WORKHORSE_PATH}/ + update-setup-test-env-cache: extends: - setup-test-env @@ -264,11 +276,11 @@ rspec migration pg12 minimal: - .minimal-rspec-tests - .rails:rules:ee-and-foss-migration:minimal -rspec migration pg12 decomposed: +rspec migration pg12 single-db: extends: - rspec migration pg12 - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db rspec unit pg12: extends: @@ -282,11 +294,11 @@ rspec unit pg12 minimal: - .minimal-rspec-tests - .rails:rules:ee-and-foss-unit:minimal -rspec unit pg12 decomposed: +rspec unit pg12 single-db: extends: - rspec unit pg12 - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db rspec integration pg12: extends: @@ -300,11 +312,11 @@ rspec integration pg12 minimal: - .minimal-rspec-tests - .rails:rules:ee-and-foss-integration:minimal -rspec integration pg12 decomposed: +rspec integration pg12 single-db: extends: - rspec integration pg12 - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db rspec system pg12: extends: @@ -320,11 +332,11 @@ rspec system pg12 minimal: - .minimal-rspec-tests - .rails:rules:ee-and-foss-system:minimal -rspec system pg12 decomposed: +rspec system pg12 single-db: extends: - rspec system pg12 - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db # Dedicated job to test DB library code against PG11. # Note that these are already tested against PG12 in the `rspec unit pg12` / `rspec-ee unit pg12` jobs. @@ -351,22 +363,22 @@ db:rollback: - scripts/db_tasks db:migrate VERSION=20210301200959 - scripts/db_tasks db:migrate SKIP_SCHEMA_VERSION_CHECK=true -db:rollback decomposed: +db:rollback single-db: extends: - db:rollback - - .decomposed-database - - .rails:rules:decomposed-databases + - .single-db + - .rails:rules:single-db db:migrate:reset: extends: .db-job-base script: - bundle exec rake db:migrate:reset -db:migrate:reset decomposed: +db:migrate:reset single-db: extends: - db:migrate:reset - - .decomposed-database - - .rails:rules:decomposed-databases + - .single-db + - .rails:rules:single-db db:migrate-from-previous-major-version: extends: .db-job-base @@ -375,6 +387,8 @@ db:migrate-from-previous-major-version: SETUP_DB: "false" PROJECT_TO_CHECKOUT: "gitlab-foss" TAG_TO_CHECKOUT: "v13.12.9" + # FIXME: make this job work with `GITLAB_USE_MODEL_LOAD_BALANCING: true`, see https://gitlab.com/gitlab-org/gitlab/-/issues/355573 + GITLAB_USE_MODEL_LOAD_BALANCING: "false" before_script: - !reference [.default-before_script, before_script] - '[[ -d "ee/" ]] || export PROJECT_TO_CHECKOUT="gitlab"' @@ -388,11 +402,11 @@ db:migrate-from-previous-major-version: script: - run_timed_command "scripts/db_tasks db:migrate" -db:migrate-from-previous-major-version-decomposed: +db:migrate-from-previous-major-version-single-db: extends: - db:migrate-from-previous-major-version - - .decomposed-database - - .rails:rules:decomposed-databases + - .single-db + - .rails:rules:single-db .db:check-schema-base: extends: @@ -409,9 +423,9 @@ db:check-schema: - db:migrate-from-previous-major-version - .db:check-schema-base -db:check-schema-decomposed: +db:check-schema-single-db: extends: - - db:migrate-from-previous-major-version-decomposed + - db:migrate-from-previous-major-version-single-db - .db:check-schema-base db:check-migrations: @@ -423,11 +437,11 @@ db:check-migrations: - scripts/validate_migration_schema allow_failure: true -db:check-migrations-decomposed: +db:check-migrations-single-db: extends: - db:check-migrations - - .decomposed-database - - .rails:rules:decomposed-databases + - .single-db + - .rails:rules:single-db db:migrate-non-superuser: extends: @@ -534,11 +548,11 @@ rspec:coverage: - rspec unit pg12 minimal - rspec integration pg12 minimal - rspec system pg12 minimal - # FOSS/EE decomposed jobs - - rspec migration pg12 decomposed - - rspec unit pg12 decomposed - - rspec integration pg12 decomposed - - rspec system pg12 decomposed + # FOSS/EE single-db jobs + - rspec migration pg12 single-db + - rspec unit pg12 single-db + - rspec integration pg12 single-db + - rspec system pg12 single-db # EE jobs - rspec-ee migration pg12 - rspec-ee unit pg12 @@ -549,11 +563,11 @@ rspec:coverage: - rspec-ee unit pg12 minimal - rspec-ee integration pg12 minimal - rspec-ee system pg12 minimal - # EE decomposed jobs - - rspec-ee migration pg12 decomposed - - rspec-ee unit pg12 decomposed - - rspec-ee integration pg12 decomposed - - rspec-ee system pg12 decomposed + # EE single-db jobs + - rspec-ee migration pg12 single-db + - rspec-ee unit pg12 single-db + - rspec-ee integration pg12 single-db + - rspec-ee system pg12 single-db # Geo jobs - rspec-ee unit pg12 geo - rspec-ee integration pg12 geo @@ -567,16 +581,16 @@ rspec:coverage: # As-if-FOSS jobs - rspec migration pg12-as-if-foss - rspec migration pg12-as-if-foss minimal - - rspec migration pg12-as-if-foss decomposed + - rspec migration pg12-as-if-foss single-db - rspec unit pg12-as-if-foss - rspec unit pg12-as-if-foss minimal - - rspec unit pg12-as-if-foss decomposed + - rspec unit pg12-as-if-foss single-db - rspec integration pg12-as-if-foss - rspec integration pg12-as-if-foss minimal - - rspec integration pg12-as-if-foss decomposed + - rspec integration pg12-as-if-foss single-db - rspec system pg12-as-if-foss - rspec system pg12-as-if-foss minimal - - rspec system pg12-as-if-foss decomposed + - rspec system pg12-as-if-foss single-db script: - run_timed_command "bundle exec scripts/merge-simplecov" coverage: '/LOC \((\d+\.\d+%)\) covered.$/' @@ -666,11 +680,11 @@ rspec migration pg12-as-if-foss minimal: - .minimal-rspec-tests - .rails:rules:as-if-foss-migration:minimal -rspec migration pg12-as-if-foss decomposed: +rspec migration pg12-as-if-foss single-db: extends: - rspec migration pg12-as-if-foss - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db rspec unit pg12-as-if-foss: extends: @@ -684,11 +698,11 @@ rspec unit pg12-as-if-foss minimal: - .minimal-rspec-tests - .rails:rules:as-if-foss-unit:minimal -rspec unit pg12-as-if-foss decomposed: +rspec unit pg12-as-if-foss single-db: extends: - rspec unit pg12-as-if-foss - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db rspec integration pg12-as-if-foss: extends: @@ -702,11 +716,11 @@ rspec integration pg12-as-if-foss minimal: - .minimal-rspec-tests - .rails:rules:as-if-foss-integration:minimal -rspec integration pg12-as-if-foss decomposed: +rspec integration pg12-as-if-foss single-db: extends: - rspec integration pg12-as-if-foss - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db rspec system pg12-as-if-foss: extends: @@ -720,11 +734,11 @@ rspec system pg12-as-if-foss minimal: - .minimal-rspec-tests - .rails:rules:as-if-foss-system:minimal -rspec system pg12-as-if-foss decomposed: +rspec system pg12-as-if-foss single-db: extends: - rspec system pg12-as-if-foss - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db rspec migration pg12-as-if-jh: extends: @@ -764,11 +778,11 @@ rspec-ee migration pg12 minimal: - .minimal-rspec-tests - .rails:rules:ee-only-migration:minimal -rspec-ee migration pg12 decomposed: +rspec-ee migration pg12 single-db: extends: - rspec-ee migration pg12 - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db rspec-ee unit pg12: extends: @@ -782,11 +796,11 @@ rspec-ee unit pg12 minimal: - .minimal-rspec-tests - .rails:rules:ee-only-unit:minimal -rspec-ee unit pg12 decomposed: +rspec-ee unit pg12 single-db: extends: - rspec-ee unit pg12 - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db rspec-ee integration pg12: extends: @@ -800,11 +814,11 @@ rspec-ee integration pg12 minimal: - .minimal-rspec-tests - .rails:rules:ee-only-integration:minimal -rspec-ee integration pg12 decomposed: +rspec-ee integration pg12 single-db: extends: - rspec-ee integration pg12 - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db rspec-ee system pg12: extends: @@ -818,11 +832,11 @@ rspec-ee system pg12 minimal: - .minimal-rspec-tests - .rails:rules:ee-only-system:minimal -rspec-ee system pg12 decomposed: +rspec-ee system pg12 single-db: extends: - rspec-ee system pg12 - - .decomposed-database-rspec - - .rails:rules:decomposed-databases + - .single-db-rspec + - .rails:rules:single-db rspec-ee unit pg12 geo: extends: diff --git a/.gitlab/ci/reports.gitlab-ci.yml b/.gitlab/ci/reports.gitlab-ci.yml index b9d2e31191..d040abfe90 100644 --- a/.gitlab/ci/reports.gitlab-ci.yml +++ b/.gitlab/ci/reports.gitlab-ci.yml @@ -121,6 +121,11 @@ yarn-audit-dependency_scanning: - cd .. && tar -I "gzip --best" -cf gitlab.tgz gitlab/ script: - DEBUG=* node /usr/src/app/cli.js analyze --format gitlab --manager ${PACKAGE_MANAGER} gitlab.tgz | tee ${CI_PROJECT_DIR}/gl-dependency-scanning-report.json + after_script: + - mkdir ~/.aws + - '[[ -z "${AWS_SIEM_REPORT_INGESTION_CREDENTIALS_FILE}" ]] || mv "${AWS_SIEM_REPORT_INGESTION_CREDENTIALS_FILE}" ~/.aws/credentials' + - npm install --no-save --ignore-scripts @aws-sdk/client-s3@3.49.0 + - scripts/ingest-reports-to-siem artifacts: paths: - gl-dependency-scanning-report.json diff --git a/.gitlab/ci/review-apps/dast.gitlab-ci.yml b/.gitlab/ci/review-apps/dast.gitlab-ci.yml index d0ad4d23a8..df8ad4c517 100644 --- a/.gitlab/ci/review-apps/dast.gitlab-ci.yml +++ b/.gitlab/ci/review-apps/dast.gitlab-ci.yml @@ -5,7 +5,7 @@ extends: - .reports:rules:schedule-dast image: - name: "registry.gitlab.com/gitlab-org/security-products/dast:$DAST_VERSION" + name: "registry.gitlab.com/security-products/dast:$DAST_VERSION" resource_group: dast_scan variables: DAST_USERNAME_FIELD: "user[login]" diff --git a/.gitlab/ci/review-apps/qa.gitlab-ci.yml b/.gitlab/ci/review-apps/qa.gitlab-ci.yml index eaf6429ad5..a955096992 100644 --- a/.gitlab/ci/review-apps/qa.gitlab-ci.yml +++ b/.gitlab/ci/review-apps/qa.gitlab-ci.yml @@ -42,9 +42,6 @@ expire_in: 7 days when: always -.parallel-qa-base: - parallel: 5 - .allure-report-base: image: name: ${GITLAB_DEPENDENCY_PROXY}andrcuns/allure-report-publisher:0.4.2 @@ -82,7 +79,7 @@ review-qa-reliable: extends: - .review-qa-base - .review:rules:review-qa-reliable - - .parallel-qa-base + parallel: 8 retry: 1 variables: QA_RUN_TYPE: review-qa-reliable @@ -92,10 +89,11 @@ review-qa-all: extends: - .review-qa-base - .review:rules:review-qa-all - - .parallel-qa-base + parallel: 5 variables: QA_RUN_TYPE: review-qa-all QA_SCENARIO: Test::Instance::All + QA_SKIP_SMOKE_RELIABLE: "true" review-performance: extends: diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml index a4bb99c49a..70b532b97f 100644 --- a/.gitlab/ci/rules.gitlab-ci.yml +++ b/.gitlab/ci/rules.gitlab-ci.yml @@ -61,8 +61,8 @@ .if-merge-request-labels-run-all-jest: &if-merge-request-labels-run-all-jest if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-all-jest/' -.if-merge-request-labels-run-decomposed: &if-merge-request-labels-run-decomposed - if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-decomposed/' +.if-merge-request-labels-run-single-db: &if-merge-request-labels-run-single-db + if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-single-db/' .if-merge-request-labels-run-review-app: &if-merge-request-labels-run-review-app if: '$CI_MERGE_REQUEST_LABELS =~ /pipeline:run-review-app/' @@ -147,6 +147,9 @@ - "scripts/trigger-build.rb" - "{,ee/,jh/}{bin,config}/**/*.rb" +.ci-templates-patterns: &ci-templates-patterns + - "lib/gitlab/ci/templates/**/*.gitlab-ci.yml" + .ci-qa-patterns: &ci-qa-patterns - ".gitlab-ci.yml" - ".gitlab/ci/frontend.gitlab-ci.yml" @@ -164,6 +167,7 @@ .yaml-lint-patterns: &yaml-lint-patterns - ".gitlab-ci.yml" - ".gitlab/ci/**/*.yml" + - "data/**/*.yml" - "lib/gitlab/ci/templates/**/*.yml" .docs-patterns: &docs-patterns @@ -247,7 +251,7 @@ # List explicitly all the app/ dirs that are backend (i.e. all except app/assets). - "{,ee/,jh/}{app/channels,app/controllers,app/finders,app/graphql,app/helpers,app/mailers,app/models,app/policies,app/presenters,app/serializers,app/services,app/uploaders,app/validators,app/views,app/workers}/**/*" - "{,ee/,jh/}{bin,cable,config,db,generator_templates,lib}/**/*" - - "{,ee/,jh/}spec/**/*.rb" + - "{,ee/,jh/}spec/**/*" # CI changes - ".gitlab-ci.yml" - ".gitlab/ci/**/*" @@ -441,6 +445,9 @@ - "GITLAB_WORKHORSE_VERSION" - "workhorse/**/*" - ".gitlab/ci/workhorse.gitlab-ci.yml" + # CI Templates changes + - "scripts/lint_templates_bash.rb" + - "lib/gitlab/ci/templates/**/*.gitlab-ci.yml" .danger-patterns: &danger-patterns - "Dangerfile" @@ -609,6 +616,15 @@ when: manual allow_failure: true +###################### +# CI Templates Rules # +###################### +.ci-templates:rules:shellcheck: + rules: + - changes: *ci-templates-patterns + - changes: + - scripts/lint_templates_bash.rb + ################## # Delivery rules # ################## @@ -876,14 +892,26 @@ ############### # Rails rules # ############### +.rails:rules:build-components: + rules: + - <<: *if-dot-com-ee-schedule + - <<: *if-dot-com-gitlab-org-default-branch + changes: + - "workhorse/**/*" + - <<: *if-dot-com-gitlab-org-merge-request + when: manual + allow_failure: true + .rails:rules:setup-test-env: rules: - changes: *setup-test-env-patterns - <<: *if-merge-request-labels-run-all-rspec -.rails:rules:decomposed-databases: +.rails:rules:single-db: rules: - - <<: *if-merge-request-labels-run-decomposed + - <<: *if-merge-request-labels-run-single-db + - <<: *if-merge-request + changes: *db-patterns - <<: *if-default-branch-schedule-nightly .rails:rules:ee-and-foss-migration: diff --git a/.gitlab/ci/setup.gitlab-ci.yml b/.gitlab/ci/setup.gitlab-ci.yml index 1aeccfcb21..ad500fe0dd 100644 --- a/.gitlab/ci/setup.gitlab-ci.yml +++ b/.gitlab/ci/setup.gitlab-ci.yml @@ -159,7 +159,7 @@ add-jh-folder: script: - JH_BRANCH=$(./scripts/setup/find-jh-branch.rb) - 'echo "JH_BRANCH: ${JH_BRANCH}"' - - curl --location -o "jh-folder.tar.gz" "https://gitlab.com/gitlab-org/gitlab-jh/gitlab/-/archive/${JH_BRANCH}/gitlab-${JH_BRANCH}.tar.gz?path=jh" + - curl --location -o "jh-folder.tar.gz" "https://gitlab.com/gitlab-org/gitlab-jh-mirrors/gitlab/-/archive/${JH_BRANCH}/gitlab-${JH_BRANCH}.tar.gz?path=jh" - tar -xf "jh-folder.tar.gz" - mv "gitlab-${JH_BRANCH}-jh/jh/" ./ - cp Gemfile.lock jh/ diff --git a/.gitlab/ci/yaml.gitlab-ci.yml b/.gitlab/ci/yaml.gitlab-ci.yml index 218dc0a785..606bb38532 100644 --- a/.gitlab/ci/yaml.gitlab-ci.yml +++ b/.gitlab/ci/yaml.gitlab-ci.yml @@ -8,6 +8,6 @@ lint-yaml: stage: lint needs: [] variables: - LINT_PATHS: .gitlab-ci.yml .gitlab/ci lib/gitlab/ci/templates + LINT_PATHS: .gitlab-ci.yml .gitlab/ci lib/gitlab/ci/templates data/deprecations data/removals data/whats_new script: - yamllint --strict -f colored $LINT_PATHS diff --git a/.gitlab/issue_templates/Deprecations.md b/.gitlab/issue_templates/Deprecations.md index cea010153b..2e48c27231 100644 --- a/.gitlab/issue_templates/Deprecations.md +++ b/.gitlab/issue_templates/Deprecations.md @@ -34,15 +34,33 @@ Which tier is this feature available in? * Ultimate --> -### Checklist +### Checklists -- [ ] @mention your stage's stable counterparts on this issue. For example, Customer Support, Customer Success (Technical Account Manager), Product Marketing Manager. +**Labels** + +- [ ] This issue is labeled ~deprecation, and with the relevant `~devops::`, `~group::`, and `~Category:` labels. +- [ ] This issue is labeled ~"breaking change" if the removal of the deprecated item will be a [breaking change](https://about.gitlab.com/handbook/product/gitlab-the-product/#examples-of-breaking-changes). + +**Timeline** + +Please add links to the relevant merge requests. + +- As soon as possible, but no later than the third milestone preceding the major release (for example, given the following release schedule: `14.8, 14.9, 14.10, 15.0` – `14.8` is the third milestone preceding the major release): + - [ ] A [deprecation entry](https://about.gitlab.com/handbook/marketing/blog/release-posts/#creating-a-deprecation-entry) has been created so the deprecation will appear in release posts and on the [general deprecation page](https://docs.gitlab.com/ee/update/deprecations). + - [ ] Documentation has been updated to add a note about the [end-of-life](https://docs.gitlab.com/ee/development/documentation/styleguide/#end-of-life-for-features-or-products) and to mark the feature as [deprecated](https://docs.gitlab.com/ee/development/documentation/styleguide/#deprecated-features). +- [ ] On or before the major milestone: A [removal entry](https://about.gitlab.com/handbook/marketing/blog/release-posts/#removals) has been created so the removal will appear on the [removals by milestones](https://docs.gitlab.com/ee/update/removals) page and be announced in the release post. +- On the major milestone: + - [ ] The deprecated item has been removed. + - [ ] If the removal of the deprecated item is a [breaking change](https://about.gitlab.com/handbook/product/gitlab-the-product/#examples-of-breaking-changes), the merge request is labeled ~"breaking change". + +**Mentions** + +- [ ] Your stage's stable counterparts have been `@mentioned` on this issue. For example, Customer Support, Customer Success (Technical Account Manager), Product Marketing Manager. - To see who the stable counterparts are for a product team visit [product categories](https://about.gitlab.com/handbook/product/categories/) - If there is no stable counterpart listed for Sales/CS please mention `@timtams` - If there is no stable counterpart listed for Support please mention `@gitlab-com/support/managers` - If there is no stable counterpart listed for Marketing please mention `@cfoster3` - -- [ ] `@mention` your GPM so that they are aware of planned deprecations. The goal is to have reviews happen at least two releases before the final removal of the feature or introduction of a breaking change. +- [ ] Your GPM has been `@mentioned` so that they are aware of planned deprecations. The goal is to have reviews happen at least two releases before the final removal of the feature or introduction of a breaking change. ### Deprecation Milestone @@ -75,6 +93,6 @@ Use the following resources to find the appropriate labels: /label ~"GitLab Free" ~"GitLab Premium" ~"GitLab Ultimate" -/label ~"type::deprecation" +/label ~"deprecation" diff --git a/.gitlab/issue_templates/Design Sprint.md b/.gitlab/issue_templates/Design Sprint.md index 7772c2d580..f85d41a112 100644 --- a/.gitlab/issue_templates/Design Sprint.md +++ b/.gitlab/issue_templates/Design Sprint.md @@ -146,16 +146,18 @@ Deciding which persona we are focusing on will be part of the Day 1 discussions * [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#delaney-development-team-lead) * [Presley (Product Designer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#presley-product-designer) * [Sasha (Software Developer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sasha-software-developer) -* [Devon (DevOps Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#devon-devops-engineer) +* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer) * [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sidney-systems-administrator) * [Sam (Security Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sam-security-analyst) * [Rachel (Release Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#rachel-release-manager) * [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#alex-security-operations-engineer) * [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#simone-software-engineer-in-test) * [Allison (Application Ops)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#allison-application-ops) -* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer) +* [Ingrid (Infrastructure Operator)](https://about.gitlab.com/handbook/product/personas/#ingrid-infrastructure-operator) +* [Dakota (Application Development Director)](https://about.gitlab.com/handbook/product/personas/#dakota-application-development-director) * [Dana (Data Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#dana-data-analyst) * [Eddie (Content Editor)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#eddie-content-editor) + --> ## Agenda diff --git a/.gitlab/issue_templates/Doc_cleanup.md b/.gitlab/issue_templates/Doc_cleanup.md new file mode 100644 index 0000000000..69caea1ae1 --- /dev/null +++ b/.gitlab/issue_templates/Doc_cleanup.md @@ -0,0 +1,53 @@ + + +## Identified documentation issue + + + +## Process + +If you, as a contributor, decide to take this work on, assign this issue to yourself, and create one or more linked +merge requests that resolve this issue. Be sure to close this issue after all linked merge requests are completed. + +The work for this issue should involve only what's listed in the previous section. If you identify other work that +needs to be done, create separate, unlinked MRs as needed to address those items. + +When using automated test results for identified work, use this issue to work only on the listed lines. For +example, if the tests list several lines that show the word "admin" as needing to possibly be "administrator," +do not modify other parts of the page that may also include "admin," as the testing may have excluded those lines +(for example, they may be part of the **Admin Area** of GitLab). + +## Additional information + + + +### Who can address the issue + + + +### Other links/references + + + +/label ~documentation diff --git a/.gitlab/issue_templates/Dogfooding.md b/.gitlab/issue_templates/Dogfooding.md index d780fbd3f1..9545c9bc9d 100644 --- a/.gitlab/issue_templates/Dogfooding.md +++ b/.gitlab/issue_templates/Dogfooding.md @@ -1,6 +1,6 @@ -/label ~"dogfooding" ~"group::" ~"section::" ~"Category::" +/label ~"dogfooding" ~"group::" ~"section::" ~"Category:" ## Feature to Dogfood diff --git a/.gitlab/issue_templates/Feature Flag Roll Out.md b/.gitlab/issue_templates/Feature Flag Roll Out.md index 590e627df7..0d150bcb56 100644 --- a/.gitlab/issue_templates/Feature Flag Roll Out.md +++ b/.gitlab/issue_templates/Feature Flag Roll Out.md @@ -89,7 +89,8 @@ _Consider adding links to check for Sentry errors, Production logs for 5xx, 302s - [ ] Ensure that you or a representative in development can be available for at least 2 hours after feature flag updates in production. If a different developer will be covering, or an exception is needed, please inform the oncall SRE by using the `@sre-oncall` Slack alias. - [ ] Ensure that documentation has been updated ([More info](https://docs.gitlab.com/ee/development/documentation/feature_flags.html#features-that-became-enabled-by-default)). -- [ ] Announce on [the feature issue](ISSUE LINK) an estimated time this will be enabled on GitLab.com. +- [ ] Announce on [the feature issue](ISSUE LINK) an estimated time this will be enabled on GitLab.com. +- [ ] Ensure that any breaking changes have been announced following the [release post process](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations-removals-and-breaking-changes) to ensure GitLab customers are aware. - [ ] Notify `#support_gitlab-com` and your team channel ([more guidance when this is necessary in the dev docs](https://docs.gitlab.com/ee/development/feature_flags/controls.html#communicate-the-change)). ### Global rollout on production @@ -100,7 +101,7 @@ For visibility, all `/chatops` commands that target production should be execute - If the feature flag in code has [an actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), perform **actor-based** rollout. - [ ] `/chatops run feature set --actors` - If the feature flag in code does **NOT** have [an actor](https://docs.gitlab.com/ee/development/feature_flags/#feature-actors), perform time-based rollout (**random** rollout). - - [ ] `/chatops run feature set ` + - [ ] `/chatops run feature set --random` - Enable the feature globally on production environment. - [ ] `/chatops run feature set true` - [ ] Announce on [the feature issue](ISSUE LINK) that the feature has been globally enabled. diff --git a/.gitlab/issue_templates/Feature Proposal - lean.md b/.gitlab/issue_templates/Feature Proposal - lean.md index 53ad17bbf3..c902c25461 100644 --- a/.gitlab/issue_templates/Feature Proposal - lean.md +++ b/.gitlab/issue_templates/Feature Proposal - lean.md @@ -25,17 +25,17 @@ Personas are described at https://about.gitlab.com/handbook/marketing/product-ma * [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#delaney-development-team-lead) * [Presley (Product Designer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#presley-product-designer) * [Sasha (Software Developer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sasha-software-developer) -* [Devon (DevOps Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#devon-devops-engineer) +* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer) * [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sidney-systems-administrator) * [Sam (Security Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sam-security-analyst) * [Rachel (Release Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#rachel-release-manager) * [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#alex-security-operations-engineer) * [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#simone-software-engineer-in-test) * [Allison (Application Ops)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#allison-application-ops) -* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer) +* [Ingrid (Infrastructure Operator)](https://about.gitlab.com/handbook/product/personas/#ingrid-infrastructure-operator) +* [Dakota (Application Development Director)](https://about.gitlab.com/handbook/product/personas/#dakota-application-development-director) * [Dana (Data Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#dana-data-analyst) * [Eddie (Content Editor)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#eddie-content-editor) - --> ### Feature Usage Metrics diff --git a/.gitlab/issue_templates/Feature proposal - detailed.md b/.gitlab/issue_templates/Feature proposal - detailed.md index 78faf146fb..d60b5f24de 100644 --- a/.gitlab/issue_templates/Feature proposal - detailed.md +++ b/.gitlab/issue_templates/Feature proposal - detailed.md @@ -4,7 +4,7 @@ -### Problem to solve +### Problem to solve @@ -19,16 +19,18 @@ Personas are described at https://about.gitlab.com/handbook/marketing/product-ma * [Delaney (Development Team Lead)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#delaney-development-team-lead) * [Presley (Product Designer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#presley-product-designer) * [Sasha (Software Developer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sasha-software-developer) -* [Devon (DevOps Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#devon-devops-engineer) +* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer) * [Sidney (Systems Administrator)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sidney-systems-administrator) * [Sam (Security Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#sam-security-analyst) * [Rachel (Release Manager)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#rachel-release-manager) * [Alex (Security Operations Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#alex-security-operations-engineer) * [Simone (Software Engineer in Test)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#simone-software-engineer-in-test) * [Allison (Application Ops)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#allison-application-ops) -* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer) +* [Ingrid (Infrastructure Operator)](https://about.gitlab.com/handbook/product/personas/#ingrid-infrastructure-operator) +* [Dakota (Application Development Director)](https://about.gitlab.com/handbook/product/personas/#dakota-application-development-director) * [Dana (Data Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#dana-data-analyst) * [Eddie (Content Editor)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#eddie-content-editor) + --> ### User experience goal @@ -37,7 +39,6 @@ Personas are described at https://about.gitlab.com/handbook/marketing/product-ma For example, "The user should be able to use the UI/API/.gitlab-ci.yml with GitLab to " https://about.gitlab.com/handbook/engineering/ux/ux-research-training/user-story-mapping/ --> - ### Proposal @@ -55,9 +56,9 @@ Consider adding checkboxes and expectations of users with certain levels of memb * [ ] Add expected impact to Reporter (20) members * [ ] Add expected impact to Developer (30) members * [ ] Add expected impact to Maintainer (40) members -* [ ] Add expected impact to Owner (50) members +* [ ] Add expected impact to Owner (50) members -Please consider performing a threat model for the code changes that are introduced as part of this feature. To get started, refer to our Threat Modeling handbook page https://about.gitlab.com/handbook/security/threat_modeling/#threat-modeling. +Please consider performing a threat model for the code changes that are introduced as part of this feature. To get started, refer to our Threat Modeling handbook page https://about.gitlab.com/handbook/security/threat_modeling/#threat-modeling. Don't hesitate to reach out to the Application Security Team (`@gitlab-com/gl-security/appsec`) to discuss any security concerns. --> @@ -91,7 +92,7 @@ See the test engineering planning process and reach out to your counterpart Soft * Ultimate/Gold --> -### Feature Usage Metrics +### Feature Usage Metrics -### Who will use this solution? +### Who will use this solution? ### Summary +Failing job(s): +Failing spec(s): + +Corresponding test case(s): ### Stack trace @@ -52,7 +57,7 @@ If you include multiple screenshots it can be helpful to hide all but the first /label ~Quality ~QA ~test -/label ~"failure::broken-test" ~"failure::flaky-test" ~"failure::stale-test" ~"failure::test-environment" ~"failure::investigating" +/label ~"failure::broken-test" ~"failure::flaky-test" ~"failure::stale-test" ~"failure::test-environment" ~"failure::investigating" ~"failure::new" /label ~"type::maintenance" diff --git a/.gitlab/merge_request_templates/Pipeline Configuration.md b/.gitlab/merge_request_templates/Pipeline Configuration.md index a0b8d1cb8e..336988d8bd 100644 --- a/.gitlab/merge_request_templates/Pipeline Configuration.md +++ b/.gitlab/merge_request_templates/Pipeline Configuration.md @@ -35,4 +35,4 @@ This will help keep track of expected cost increases to the [GitLab project aver - [ ] Consider communicating these changes to the broader team following the [communication guideline for pipeline changes](https://about.gitlab.com/handbook/engineering/quality/engineering-productivity/#pipeline-changes) -/label ~"type::tooling" ~"tooling::pipelines" ~"Engineering Productivity" +/label ~"maintenance::pipelines" ~"Engineering Productivity" diff --git a/.gitlab/merge_request_templates/Security Release.md b/.gitlab/merge_request_templates/Security Release.md index bfa80d6501..f43bddaa46 100644 --- a/.gitlab/merge_request_templates/Security Release.md +++ b/.gitlab/merge_request_templates/Security Release.md @@ -31,7 +31,7 @@ See [the general developer security release guidelines](https://gitlab.com/gitla ## Maintainer checklist - [ ] Correct milestone is applied and the title is matching across all backports. -- [ ] Assigned to `@gitlab-release-tools-bot` with passing CI pipelines. +- [ ] Assigned (_not_ as reviewer) to `@gitlab-release-tools-bot` with passing CI pipelines. /label ~security diff --git a/.gitpod.yml b/.gitpod.yml index a67242e08a..d1a709c55e 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -20,6 +20,8 @@ tasks: gdk config set gitlab.rails.port 443 gdk config set gitlab.rails.https.enabled true gdk config set webpack.host 127.0.0.1 + gdk config set webpack.static false + gdk config set webpack.live_reload false # make documentation builds available gdk config set gitlab_docs.enabled true # reconfigure GDK @@ -49,6 +51,8 @@ tasks: gdk config set gitlab.rails.port 443 gdk config set gitlab.rails.https.enabled true gdk config set webpack.host 127.0.0.1 + gdk config set webpack.static false + gdk config set webpack.live_reload false # reconfigure GDK echo "$(date) – Reconfiguring GDK" | tee -a /workspace/startup.log gdk reconfigure diff --git a/.nvmrc b/.nvmrc index 18711d290e..832d385064 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -14.17.5 +16.14.0 diff --git a/.rubocop.yml b/.rubocop.yml index 8416653d67..99424713bd 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -16,6 +16,9 @@ inherit_from: - ./rubocop/rubocop-migrations.yml - ./rubocop/rubocop-usage-data.yml - ./rubocop/rubocop-code_reuse.yml + <% Dir.glob('jh/rubocop/**/*.yml').each do |jh_rubocop_yaml| %> + - '<%= jh_rubocop_yaml %>' + <% end %> inherit_mode: merge: @@ -43,6 +46,10 @@ AllCops: CacheRootDirectory: <%= Dir.getwd %>/tmp MaxFilesInCache: 30000 +Metrics/ParameterLists: + Exclude: + - 'app/components/**/*' + Cop/AvoidKeywordArgumentsInSidekiqWorkers: Enabled: true Include: @@ -236,6 +243,10 @@ Rails/FindBy: - 'spec/**/*.rb' - 'ee/spec/**/*.rb' +Rails/IndexBy: + Exclude: + - 'tooling/danger/**/*.rb' + # This is currently exiting with a rubocop exception error and should be # resolved hopefully a future update # An error occurred while Rails/UniqueValidationWithoutIndex cop was inspecting @@ -604,8 +615,9 @@ Rails/TimeZone: - 'ee/spec/workers/**/*' - 'ee/lib/**/*' - 'ee/spec/lib/**/*' + - 'spec/features/**/*' + - 'ee/spec/features/**/*' -# WIP: See https://gitlab.com/gitlab-org/gitlab/-/issues/220040 Rails/SaveBang: Enabled: true AllowImplicitReturn: false diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index ac8afd5c00..2ffe70b446 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -6,11 +6,6 @@ # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. -# Offense count: 314 -# Cop supports --auto-correct. -Capybara/CurrentPathExpectation: - Enabled: false - # Offense count: 221 Capybara/VisibilityMatcher: Enabled: false @@ -20,11 +15,6 @@ Gitlab/PolicyRuleBoolean: Exclude: - 'ee/app/policies/ee/identity_provider_policy.rb' -# Offense count: 5 -Graphql/IDType: - Exclude: - - 'app/graphql/mutations/boards/issues/issue_move_list.rb' - # Offense count: 2270 # Cop supports --auto-correct. # Configuration parameters: EnforcedStyle, IndentationWidth. @@ -32,13 +22,6 @@ Graphql/IDType: Layout/ArgumentAlignment: Enabled: false -# Offense count: 54 -# Cop supports --auto-correct. -# Configuration parameters: AllowAliasSyntax, AllowedMethods. -# AllowedMethods: alias_method, public, protected, private -Layout/EmptyLinesAroundAttributeAccessor: - Enabled: false - # Offense count: 771 # Cop supports --auto-correct. # Configuration parameters: EnforcedStyle, IndentationWidth. @@ -124,11 +107,6 @@ Lint/BinaryOperatorWithIdenticalOperands: Lint/ConstantDefinitionInBlock: Enabled: false -# Offense count: 1 -Lint/DuplicateRequire: - Exclude: - - 'ee/spec/lib/gitlab/auth/group_saml/user_spec.rb' - # Offense count: 2 # Configuration parameters: AllowComments. Lint/EmptyFile: @@ -136,13 +114,6 @@ Lint/EmptyFile: - 'db/seeds.rb' - 'ee/db/geo/seeds.rb' -# Offense count: 8 -# Cop supports --auto-correct. -Lint/IdentityComparison: - Exclude: - - 'spec/tooling/danger/weightage/maintainers_spec.rb' - - 'spec/tooling/danger/weightage/reviewers_spec.rb' - # Offense count: 208 # Configuration parameters: MaximumRangeSize. Lint/MissingCopEnableDirective: @@ -182,11 +153,6 @@ Lint/StructNewOverride: - 'app/serializers/environment_serializer.rb' - 'lib/gitlab/ci/pipeline/duration.rb' -# Offense count: 1 -Lint/UnreachableLoop: - Exclude: - - 'qa/qa/runtime/feature.rb' - # Offense count: 22 # Cop supports --auto-correct. # Configuration parameters: AllowComments. @@ -225,13 +191,6 @@ Naming/HeredocDelimiterCase: Naming/HeredocDelimiterNaming: Enabled: false -# Offense count: 5 -# Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames. -# AllowedNames: at, by, db, id, in, io, ip, of, on, os, pp, to -Naming/MethodParameterName: - Exclude: - - 'lib/gitlab/diff/inline_diff.rb' - # Offense count: 218 # Cop supports --auto-correct. # Configuration parameters: PreferredName. @@ -278,16 +237,6 @@ Performance/DeletePrefix: - 'spec/lib/gitlab/gfm/uploads_rewriter_spec.rb' - 'spec/support/helpers/test_env.rb' -# Offense count: 5 -# Cop supports --auto-correct. -# Configuration parameters: SafeMultiline. -Performance/DeleteSuffix: - Exclude: - - 'app/helpers/submodule_helper.rb' - - 'app/workers/concerns/application_worker.rb' - - 'ee/app/models/geo/upload_registry.rb' - - 'ee/app/workers/geo/file_download_dispatch_worker/attachment_job_finder.rb' - # Offense count: 121 Performance/MethodObjectAsBlock: Enabled: false @@ -311,23 +260,6 @@ Performance/StringInclude: - 'spec/spec_helper.rb' - 'spec/support_specs/helpers/active_record/query_recorder_spec.rb' -# Offense count: 18 -# Cop supports --auto-correct. -Performance/Sum: - Exclude: - - 'app/controllers/projects/pipelines/tests_controller.rb' - - 'app/models/application_setting_implementation.rb' - - 'app/models/ci/pipeline.rb' - - 'app/services/issues/export_csv_service.rb' - - 'ee/spec/lib/gitlab/elastic/bulk_indexer_spec.rb' - - 'lib/api/entities/issuable_time_stats.rb' - - 'lib/container_registry/tag.rb' - - 'lib/gitlab/ci/reports/test_suite_comparer.rb' - - 'lib/gitlab/diff/file.rb' - - 'lib/gitlab/usage_data.rb' - - 'lib/peek/views/detailed_view.rb' - - 'spec/models/namespace/root_storage_statistics_spec.rb' - # Offense count: 15209 # Configuration parameters: Prefixes. # Prefixes: when, with, without @@ -379,11 +311,6 @@ RSpec/ReturnFromStub: RSpec/ScatteredLet: Enabled: false -# Offense count: 4 -RSpec/ScatteredSetup: - Exclude: - - 'spec/requests/api/jobs_spec.rb' - # Offense count: 10 # Configuration parameters: EnforcedStyle. # SupportedStyles: symbols, strings @@ -433,13 +360,6 @@ Rails/BelongsTo: - 'app/models/deployment.rb' - 'app/models/environment.rb' -# Offense count: 93 -# Configuration parameters: Database, Include. -# SupportedDatabases: mysql, postgresql -# Include: db/migrate/*.rb -Rails/BulkChangeTable: - Enabled: false - # Offense count: 155 # Cop supports --auto-correct. Rails/ContentTag: @@ -485,24 +405,6 @@ Rails/HasManyOrHasOneDependent: Rails/HelperInstanceVariable: Enabled: false -# Offense count: 17 -# Cop supports --auto-correct. -Rails/IndexBy: - Exclude: - - 'app/graphql/types/design_management/design_fields.rb' - - 'app/models/ci/pipeline.rb' - - 'app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb' - - 'ee/app/services/projects/update_mirror_service.rb' - - 'ee/app/services/security/store_report_service.rb' - - 'ee/lib/ee/gitlab/auth/ldap/sync/group.rb' - - 'ee/lib/ee/gitlab/background_migration/backfill_version_data_from_gitaly.rb' - - 'ee/lib/gitlab/analytics/type_of_work/tasks_by_type.rb' - - 'ee/lib/gitlab/elastic/document_reference.rb' - - 'ee/lib/gitlab/group_plans_preloader.rb' - - 'lib/gitlab/database/count/reltuples_count_strategy.rb' - - 'lib/gitlab/language_detection.rb' - - 'tooling/danger/sidekiq_queues.rb' - # Offense count: 47 # Cop supports --auto-correct. Rails/IndexWith: @@ -525,12 +427,6 @@ Rails/InverseOf: Rails/LexicallyScopedActionFilter: Enabled: false -# Offense count: 2 -# Cop supports --auto-correct. -Rails/LinkToBlank: - Exclude: - - 'app/helpers/projects_helper.rb' - - 'ee/app/helpers/ee/users/callouts_helper.rb' # Offense count: 1 # Cop supports --auto-correct. @@ -572,14 +468,6 @@ Rails/RenderInline: Exclude: - 'ee/app/controllers/sitemap_controller.rb' -# Offense count: 4 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle. -# SupportedStyles: conservative, aggressive -Rails/ShortI18n: - Exclude: - - 'app/uploaders/content_type_whitelist.rb' - # Offense count: 1144 # Configuration parameters: ForbiddenMethods, AllowedMethods. # ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all @@ -654,14 +542,6 @@ Style/CombinableLoops: - 'spec/requests/api/members_spec.rb' - 'spec/support/shared_examples/features/protected_branches_access_control_ce_shared_examples.rb' -# Offense count: 1 -# Cop supports --auto-correct. -# Configuration parameters: EnforcedStyle, SingleLineConditionsOnly, IncludeTernaryExpressions. -# SupportedStyles: assign_to_condition, assign_inside_condition -Style/ConditionalAssignment: - Exclude: - - 'lib/gitlab/database.rb' - # Offense count: 5 # Cop supports --auto-correct. Style/EachWithObject: @@ -777,18 +657,6 @@ Style/NumericLiteralPrefix: Style/PercentLiteralDelimiters: Enabled: false -# Offense count: 26 -# Cop supports --auto-correct. -# Configuration parameters: SafeForConstants. -Style/RedundantFetchBlock: - Exclude: - - 'app/finders/admin/projects_finder.rb' - - 'lib/gitlab/diff/file.rb' - - 'spec/lib/gitlab/json_cache_spec.rb' - - 'spec/lib/gitlab/metrics/dashboard/cache_spec.rb' - - 'spec/lib/gitlab/null_request_store_spec.rb' - - 'spec/lib/gitlab/safe_request_store_spec.rb' - # Offense count: 206 # Cop supports --auto-correct. Style/RedundantInterpolation: diff --git a/.rubocop_todo/database/multiple_databases.yml b/.rubocop_todo/database/multiple_databases.yml index 69bc0b64a3..27e28128a9 100644 --- a/.rubocop_todo/database/multiple_databases.yml +++ b/.rubocop_todo/database/multiple_databases.yml @@ -1,13 +1,6 @@ --- Database/MultipleDatabases: Exclude: - - ee/lib/gitlab/geo/database_tasks.rb - - ee/lib/gitlab/geo/geo_tasks.rb - - ee/lib/gitlab/geo/health_check.rb - - ee/lib/gitlab/geo/log_cursor/daemon.rb - - ee/lib/pseudonymizer/dumper.rb - - ee/lib/pseudonymizer/pager.rb - - ee/spec/lib/pseudonymizer/dumper_spec.rb - ee/spec/services/ee/merge_requests/update_service_spec.rb - lib/backup/database.rb - lib/backup/manager.rb @@ -18,11 +11,7 @@ Database/MultipleDatabases: - lib/gitlab/database/migrations/observers/query_log.rb - lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table.rb - lib/gitlab/database.rb - - lib/gitlab/gitlab_import/importer.rb - lib/gitlab/health_checks/db_check.rb - - lib/gitlab/import_export/base/relation_factory.rb - - lib/gitlab/import_export/group/relation_tree_restorer.rb - - lib/gitlab/legacy_github_import/importer.rb - lib/gitlab/seeder.rb - spec/db/schema_spec.rb - spec/initializers/database_config_spec.rb diff --git a/.rubocop_todo/gitlab/namespaced_class.yml b/.rubocop_todo/gitlab/namespaced_class.yml index 7d0f69c930..73f4a5deec 100644 --- a/.rubocop_todo/gitlab/namespaced_class.yml +++ b/.rubocop_todo/gitlab/namespaced_class.yml @@ -496,7 +496,6 @@ Gitlab/NamespacedClass: - app/serializers/build_trace_serializer.rb - app/serializers/cluster_application_entity.rb - app/serializers/cluster_entity.rb - - app/serializers/cluster_error_entity.rb - app/serializers/cluster_serializer.rb - app/serializers/codequality_degradation_entity.rb - app/serializers/codequality_reports_comparer_entity.rb diff --git a/.rubocop_todo/graphql/argument_uniqueness.yml b/.rubocop_todo/graphql/argument_uniqueness.yml new file mode 100644 index 0000000000..036d5d8ecd --- /dev/null +++ b/.rubocop_todo/graphql/argument_uniqueness.yml @@ -0,0 +1,4 @@ +--- +GraphQL/ArgumentUniqueness: + Exclude: + - app/graphql/resolvers/merge_requests_resolver.rb diff --git a/.rubocop_todo/graphql/field_definitions.yml b/.rubocop_todo/graphql/field_definitions.yml index e1245a5340..0e2399ba24 100644 --- a/.rubocop_todo/graphql/field_definitions.yml +++ b/.rubocop_todo/graphql/field_definitions.yml @@ -1,9 +1,4 @@ --- GraphQL/FieldDefinitions: Exclude: - - ee/app/graphql/types/ci/code_quality_degradation_type.rb - - ee/app/graphql/types/epic_type.rb - - ee/app/graphql/types/group_release_stats_type.rb - - ee/app/graphql/types/iteration_type.rb - - ee/app/graphql/types/requirements_management/requirement_type.rb - ee/app/graphql/types/vulnerability_type.rb diff --git a/.rubocop_todo/graphql/field_method.yml b/.rubocop_todo/graphql/field_method.yml index 7c336451c4..6a05b3c23b 100644 --- a/.rubocop_todo/graphql/field_method.yml +++ b/.rubocop_todo/graphql/field_method.yml @@ -1,8 +1,4 @@ --- GraphQL/FieldMethod: Exclude: - - app/graphql/types/ci/job_type.rb - - app/graphql/types/merge_request_type.rb - - app/graphql/types/metrics/dashboards/annotation_type.rb - app/graphql/types/packages/package_details_type.rb - - app/graphql/types/project_type.rb diff --git a/.rubocop_todo/graphql/ordered_arguments.yml b/.rubocop_todo/graphql/ordered_arguments.yml index def1b0085e..1a30490e89 100644 --- a/.rubocop_todo/graphql/ordered_arguments.yml +++ b/.rubocop_todo/graphql/ordered_arguments.yml @@ -4,10 +4,3 @@ GraphQL/OrderedArguments: - app/graphql/resolvers/base_issues_resolver.rb - app/graphql/resolvers/design_management/designs_resolver.rb - app/graphql/resolvers/design_management/version/design_at_version_resolver.rb - - app/graphql/types/commit_action_type.rb - - app/graphql/types/diff_paths_input_type.rb - - app/graphql/types/issues/negated_issue_filter_input_type.rb - - app/graphql/types/jira_users_mapping_input_type.rb - - app/graphql/types/notes/diff_image_position_input_type.rb - - app/graphql/types/notes/diff_position_base_input_type.rb - - app/graphql/types/notes/diff_position_input_type.rb diff --git a/.rubocop_todo/graphql/ordered_fields.yml b/.rubocop_todo/graphql/ordered_fields.yml index 4aa6a2e779..b6ddd018f4 100644 --- a/.rubocop_todo/graphql/ordered_fields.yml +++ b/.rubocop_todo/graphql/ordered_fields.yml @@ -1,16 +1,6 @@ --- GraphQL/OrderedFields: Exclude: - - app/graphql/types/board_list_type.rb - - app/graphql/types/ci/analytics_type.rb - - app/graphql/types/ci/ci_cd_setting_type.rb - - app/graphql/types/ci/config/group_type.rb - - app/graphql/types/ci/config/job_type.rb - - app/graphql/types/ci/config/stage_type.rb - - app/graphql/types/ci/detailed_status_type.rb - - app/graphql/types/ci/group_type.rb - - app/graphql/types/ci/job_type.rb - - app/graphql/types/ci/runner_architecture_type.rb - app/graphql/types/ci/runner_platform_type.rb - app/graphql/types/ci/runner_type.rb - app/graphql/types/ci/stage_type.rb @@ -32,14 +22,6 @@ GraphQL/OrderedFields: - 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_stack_trace_type.rb - - app/graphql/types/error_tracking/sentry_error_type.rb - - app/graphql/types/evidence_type.rb - - app/graphql/types/grafana_integration_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/label_type.rb - app/graphql/types/merge_request_type.rb - app/graphql/types/metadata/kas_type.rb - app/graphql/types/metadata_type.rb @@ -48,14 +30,6 @@ GraphQL/OrderedFields: - app/graphql/types/notes/diff_position_type.rb - app/graphql/types/notes/discussion_type.rb - app/graphql/types/notes/note_type.rb - - app/graphql/types/packages/composer/json_type.rb - - app/graphql/types/packages/composer/metadatum_type.rb - - app/graphql/types/packages/conan/file_metadatum_type.rb - - app/graphql/types/packages/conan/metadatum_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/maven/metadatum_type.rb - app/graphql/types/packages/nuget/metadatum_type.rb - app/graphql/types/packages/package_dependency_link_type.rb - app/graphql/types/packages/package_file_type.rb @@ -71,14 +45,6 @@ GraphQL/OrderedFields: - app/graphql/types/root_storage_statistics_type.rb - app/graphql/types/task_completion_status.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/user_callout_type.rb - - app/graphql/types/user_status_type.rb - - ee/app/graphql/types/analytics/devops_adoption/snapshot_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_type.rb - ee/app/graphql/types/geo/geo_node_type.rb - ee/app/graphql/types/requirements_management/requirement_states_count_type.rb diff --git a/.rubocop_todo/graphql/unused_argument.yml b/.rubocop_todo/graphql/unused_argument.yml new file mode 100644 index 0000000000..c55d855159 --- /dev/null +++ b/.rubocop_todo/graphql/unused_argument.yml @@ -0,0 +1,5 @@ +--- +GraphQL/UnusedArgument: + Exclude: + - app/graphql/mutations/jira_import/start.rb + - app/graphql/resolvers/packages_base_resolver.rb diff --git a/.rubocop_todo/rails/include_url_helper.yml b/.rubocop_todo/rails/include_url_helper.yml deleted file mode 100644 index 6a34c58ecf..0000000000 --- a/.rubocop_todo/rails/include_url_helper.yml +++ /dev/null @@ -1,37 +0,0 @@ ---- -Rails/IncludeUrlHelper: - Exclude: - - app/models/integrations/asana.rb - - app/models/integrations/bamboo.rb - - app/models/integrations/bugzilla.rb - - app/models/integrations/campfire.rb - - app/models/integrations/confluence.rb - - app/models/integrations/custom_issue_tracker.rb - - app/models/integrations/discord.rb - - app/models/integrations/ewm.rb - - app/models/integrations/external_wiki.rb - - app/models/integrations/flowdock.rb - - app/models/integrations/hangouts_chat.rb - - app/models/integrations/irker.rb - - app/models/integrations/jenkins.rb - - app/models/integrations/mattermost.rb - - app/models/integrations/pivotaltracker.rb - - app/models/integrations/redmine.rb - - app/models/integrations/webex_teams.rb - - app/models/integrations/youtrack.rb - - app/presenters/alert_management/alert_presenter.rb - - app/presenters/environment_presenter.rb - - app/presenters/gitlab/blame_presenter.rb - - app/presenters/merge_request_presenter.rb - - app/presenters/project_presenter.rb - - app/presenters/release_presenter.rb - - app/presenters/releases/evidence_presenter.rb - - ee/app/helpers/license_helper.rb - - ee/app/models/integrations/github.rb - - ee/spec/helpers/ee/projects/security/configuration_helper_spec.rb - - ee/spec/lib/banzai/filter/cross_project_issuable_information_filter_spec.rb - - spec/helpers/merge_requests_helper_spec.rb - - spec/helpers/nav/top_nav_helper_spec.rb - - spec/helpers/notify_helper_spec.rb - - spec/lib/banzai/filter/reference_redactor_filter_spec.rb - - spec/lib/banzai/reference_redactor_spec.rb diff --git a/.rubocop_todo/rails/save_bang.yml b/.rubocop_todo/rails/save_bang.yml deleted file mode 100644 index e1698a8368..0000000000 --- a/.rubocop_todo/rails/save_bang.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -Rails/SaveBang: - Exclude: - - ee/spec/lib/analytics/merge_request_metrics_calculator_spec.rb diff --git a/.rubocop_todo/rspec/instance_variable.yml b/.rubocop_todo/rspec/instance_variable.yml new file mode 100644 index 0000000000..6c147d2280 --- /dev/null +++ b/.rubocop_todo/rspec/instance_variable.yml @@ -0,0 +1,203 @@ +--- +RSpec/InstanceVariable: + Exclude: + - ee/spec/controllers/admin/application_settings_controller_spec.rb + - ee/spec/controllers/admin/geo/settings_controller_spec.rb + - ee/spec/controllers/ee/sessions_controller_spec.rb + - ee/spec/controllers/groups/groups_controller_spec.rb + - ee/spec/controllers/groups/omniauth_callbacks_controller_spec.rb + - ee/spec/controllers/passwords_controller_spec.rb + - ee/spec/features/markdown/markdown_spec.rb + - ee/spec/frontend/fixtures/dast_profiles.rb + - ee/spec/frontend/fixtures/epic.rb + - ee/spec/graphql/types/vulnerability_request_response_header_type_spec.rb + - ee/spec/graphql/types/vulnerability_request_type_spec.rb + - ee/spec/graphql/types/vulnerability_response_type_spec.rb + - ee/spec/helpers/ee/issuables_helper_spec.rb + - ee/spec/helpers/ee/namespace_storage_limit_alert_helper_spec.rb + - ee/spec/helpers/ee/wiki_helper_spec.rb + - ee/spec/helpers/notes_helper_spec.rb + - ee/spec/helpers/search_helper_spec.rb + - ee/spec/lib/ee/gitlab/elastic/helper_spec.rb + - ee/spec/lib/gitlab/elastic/search_results_spec.rb + - ee/spec/lib/gitlab/reference_extractor_spec.rb + - ee/spec/services/ee/merge_requests/update_service_spec.rb + - ee/spec/services/ee/notification_service_spec.rb + - ee/spec/services/ee/users/create_service_spec.rb + - ee/spec/services/ee/users/destroy_service_spec.rb + - ee/spec/services/geo/metrics_update_service_spec.rb + - ee/spec/services/groups/create_service_spec.rb + - ee/spec/services/groups/participants_service_spec.rb + - ee/spec/services/projects/create_from_template_service_spec.rb + - ee/spec/services/projects/create_service_spec.rb + - ee/spec/support/shared_examples/views/subscription_shared_examples.rb + - ee/spec/tasks/geo_rake_spec.rb + - ee/spec/views/projects/security/corpus_management/show.html.haml_spec.rb + - ee/spec/views/projects/security/dast_profiles/show.html.haml_spec.rb + - ee/spec/views/projects/security/dast_scanner_profiles/new.html.haml_spec.rb + - ee/spec/views/projects/security/dast_site_profiles/new.html.haml_spec.rb + - qa/qa/specs/features/api/1_manage/import_large_github_repo_spec.rb + - qa/qa/specs/features/api/1_manage/project_access_token_spec.rb + - qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb + - qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb + - qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb + - qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb + - qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb + - qa/qa/specs/features/browser_ui/1_manage/project/invite_group_to_project_spec.rb + - qa/qa/specs/features/browser_ui/1_manage/project/protected_tags_spec.rb + - qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb + - qa/qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb + - qa/qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb + - qa/qa/specs/features/browser_ui/3_create/web_ide/add_file_template_spec.rb + - qa/qa/specs/features/browser_ui/3_create/web_ide/link_to_line_in_web_ide_spec.rb + - qa/qa/specs/features/browser_ui/3_create/web_ide/web_terminal_spec.rb + - qa/qa/specs/features/ee/api/1_manage/user/minimal_access_user_spec.rb + - qa/qa/specs/features/ee/browser_ui/12_geo/attachment_replication_spec.rb + - qa/qa/specs/features/ee/browser_ui/12_geo/geo_replication_ci_job_log_artifacts_spec.rb + - qa/qa/specs/features/ee/browser_ui/12_geo/rename_replication_spec.rb + - qa/qa/specs/features/ee/browser_ui/13_secure/create_merge_request_with_secure_spec.rb + - qa/qa/specs/features/ee/browser_ui/13_secure/license_compliance_spec.rb + - qa/qa/specs/features/ee/browser_ui/13_secure/merge_request_license_widget_spec.rb + - qa/qa/specs/features/ee/browser_ui/13_secure/project_security_dashboard_spec.rb + - qa/qa/specs/features/ee/browser_ui/13_secure/security_reports_spec.rb + - qa/qa/specs/features/ee/browser_ui/13_secure/vulnerability_management_spec.rb + - qa/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_1_spec.rb + - qa/qa/specs/features/ee/browser_ui/1_manage/group/group_file_template_spec.rb + - qa/qa/specs/features/ee/browser_ui/1_manage/group/group_ldap_sync_spec.rb + - qa/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_non_enforced_sso_spec.rb + - qa/qa/specs/features/ee/browser_ui/1_manage/group/restrict_by_ip_address_spec.rb + - qa/qa/specs/features/ee/browser_ui/1_manage/project/project_templates_spec.rb + - qa/qa/specs/features/ee/browser_ui/2_plan/integrations/jira_issues_list_spec.rb + - qa/qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb + - qa/qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/more_than_four_assignees_spec.rb + - qa/qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb + - qa/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb + - qa/qa/specs/features/ee/browser_ui/4_verify/cancelling_merge_request_in_merge_train_spec.rb + - qa/spec/support/repeater_spec.rb + - spec/commands/metrics_server/metrics_server_spec.rb + - spec/controllers/admin/clusters_controller_spec.rb + - spec/controllers/admin/topics/avatars_controller_spec.rb + - spec/controllers/concerns/renders_commits_spec.rb + - spec/controllers/confirmations_controller_spec.rb + - spec/controllers/groups/avatars_controller_spec.rb + - spec/controllers/groups/clusters_controller_spec.rb + - spec/controllers/import/bitbucket_controller_spec.rb + - spec/controllers/import/bitbucket_server_controller_spec.rb + - spec/controllers/metrics_controller_spec.rb + - spec/controllers/omniauth_callbacks_controller_spec.rb + - spec/controllers/passwords_controller_spec.rb + - spec/controllers/profiles/avatars_controller_spec.rb + - spec/controllers/projects/clusters_controller_spec.rb + - spec/controllers/sessions_controller_spec.rb + - spec/features/admin/admin_runners_spec.rb + - spec/features/calendar_spec.rb + - spec/features/issues/user_filters_issues_spec.rb + - spec/features/markdown/copy_as_gfm_spec.rb + - spec/features/markdown/gitlab_flavored_markdown_spec.rb + - spec/features/markdown/keyboard_shortcuts_spec.rb + - spec/features/markdown/markdown_spec.rb + - spec/features/merge_request/batch_comments_spec.rb + - spec/features/merge_request/user_sees_pipelines_spec.rb + - spec/features/merge_requests/user_lists_merge_requests_spec.rb + - spec/features/projects/diffs/diff_show_spec.rb + - spec/features/triggers_spec.rb + - spec/features/u2f_spec.rb + - spec/finders/admin/plans_finder_spec.rb + - spec/finders/groups_finder_spec.rb + - spec/finders/issues_finder_spec.rb + - spec/frontend/fixtures/listbox.rb + - spec/frontend/fixtures/raw.rb + - spec/frontend/fixtures/sessions.rb + - spec/frontend/fixtures/tabs.rb + - spec/frontend/fixtures/timezones.rb + - spec/frontend/fixtures/u2f.rb + - spec/frontend/fixtures/webauthn.rb + - spec/helpers/application_helper_spec.rb + - spec/helpers/award_emoji_helper_spec.rb + - spec/helpers/issuables_description_templates_helper_spec.rb + - spec/helpers/issuables_helper_spec.rb + - spec/helpers/notes_helper_spec.rb + - spec/helpers/projects_helper_spec.rb + - spec/helpers/search_helper_spec.rb + - spec/helpers/tree_helper_spec.rb + - spec/helpers/wiki_helper_spec.rb + - spec/lib/api/helpers/authentication_spec.rb + - spec/lib/banzai/filter/asset_proxy_filter_spec.rb + - spec/lib/extracts_path_spec.rb + - spec/lib/extracts_ref_spec.rb + - spec/lib/gitlab/auth/auth_finders_spec.rb + - spec/lib/gitlab/auth/ldap/person_spec.rb + - spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb + - spec/lib/gitlab/bitbucket_import/importer_spec.rb + - spec/lib/gitlab/chat_name_token_spec.rb + - spec/lib/gitlab/ci/lint_spec.rb + - spec/lib/gitlab/ci/status/composite_spec.rb + - spec/lib/gitlab/contributions_calendar_spec.rb + - spec/lib/gitlab/diff/parser_spec.rb + - spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb + - spec/lib/gitlab/git/commit_spec.rb + - spec/lib/gitlab/git/diff_collection_spec.rb + - spec/lib/gitlab/git/diff_spec.rb + - spec/lib/gitlab/git/repository_spec.rb + - spec/lib/gitlab/http_spec.rb + - spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb + - spec/lib/gitlab/import_export/group/tree_restorer_spec.rb + - spec/lib/gitlab/import_export/project/tree_restorer_spec.rb + - spec/lib/gitlab/patch/prependable_spec.rb + - spec/lib/gitlab/popen_spec.rb + - spec/lib/gitlab/project_transfer_spec.rb + - spec/lib/gitlab/reference_extractor_spec.rb + - spec/lib/gitlab/tcp_checker_spec.rb + - spec/lib/gitlab/user_access_spec.rb + - spec/lib/gitlab/version_info_spec.rb + - spec/lib/gitlab/x509/certificate_spec.rb + - spec/mailers/emails/issues_spec.rb + - spec/migrations/20220106163326_add_has_issues_on_vulnerability_reads_trigger_spec.rb + - spec/migrations/rename_services_to_integrations_spec.rb + - spec/migrations/replace_external_wiki_triggers_spec.rb + - spec/models/group_spec.rb + - spec/models/integrations/assembla_spec.rb + - spec/models/integrations/campfire_spec.rb + - spec/models/integrations/irker_spec.rb + - spec/models/member_spec.rb + - spec/models/members/project_member_spec.rb + - spec/models/namespace_spec.rb + - spec/models/note_spec.rb + - spec/models/postgresql/replication_slot_spec.rb + - spec/models/project_spec.rb + - spec/models/user_spec.rb + - spec/models/users/in_product_marketing_email_spec.rb + - spec/rack_servers/puma_spec.rb + - spec/requests/api/admin/plan_limits_spec.rb + - spec/requests/api/merge_requests_spec.rb + - spec/requests/api/users_spec.rb + - spec/requests/git_http_spec.rb + - spec/requests/openid_connect_spec.rb + - spec/requests/projects/issues/discussions_spec.rb + - spec/rubocop/cop/migration/update_column_in_batches_spec.rb + - spec/serializers/pipeline_serializer_spec.rb + - spec/services/ci/create_pipeline_service/logger_spec.rb + - spec/services/ci/process_sync_events_service_spec.rb + - spec/services/labels/update_service_spec.rb + - spec/services/members/destroy_service_spec.rb + - spec/services/merge_requests/close_service_spec.rb + - spec/services/merge_requests/refresh_service_spec.rb + - spec/services/merge_requests/reopen_service_spec.rb + - spec/services/merge_requests/update_service_spec.rb + - spec/services/milestones/create_service_spec.rb + - spec/services/notes/post_process_service_spec.rb + - spec/services/notes/update_service_spec.rb + - spec/services/notification_service_spec.rb + - spec/services/pages/zip_directory_service_spec.rb + - spec/services/projects/create_from_template_service_spec.rb + - spec/services/projects/download_service_spec.rb + - spec/services/projects/fork_service_spec.rb + - spec/services/upload_service_spec.rb + - spec/support/shared_contexts/controllers/ldap_omniauth_callbacks_controller_shared_context.rb + - spec/support/shared_contexts/email_shared_context.rb + - spec/support/shared_examples/features/wiki/user_views_wiki_empty_shared_examples.rb + - spec/support/shared_examples/path_extraction_shared_examples.rb + - spec/support/shared_examples/requests/api/notes_shared_examples.rb + - spec/support_specs/helpers/stub_feature_flags_spec.rb + - spec/views/search/_results.html.haml_spec.rb + - spec/workers/emails_on_push_worker_spec.rb diff --git a/.rubocop_todo/rspec/timecop_travel.yml b/.rubocop_todo/rspec/timecop_travel.yml index 29044236de..32133f6e55 100644 --- a/.rubocop_todo/rspec/timecop_travel.yml +++ b/.rubocop_todo/rspec/timecop_travel.yml @@ -7,15 +7,5 @@ RSpec/TimecopTravel: - ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb - ee/spec/models/broadcast_message_spec.rb - ee/spec/models/burndown_spec.rb - - qa/spec/support/repeater_spec.rb - - spec/features/users/terms_spec.rb - - spec/lib/feature_spec.rb - - spec/models/broadcast_message_spec.rb - - spec/models/concerns/issuable_spec.rb - - spec/requests/api/ci/runner/jobs_trace_spec.rb - - spec/requests/api/issues/put_projects_issues_spec.rb - - spec/support/shared_contexts/cache_allowed_users_in_namespace_shared_context.rb - - spec/support/shared_examples/requests/api/time_tracking_shared_examples.rb - - spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb - spec/workers/concerns/reenqueuer_spec.rb - - spec/lib/gitlab/analytics/cycle_analytics/median_spec.rb + - qa/spec/support/repeater_spec.rb diff --git a/.rubocop_todo/rspec/verified_doubles.yml b/.rubocop_todo/rspec/verified_doubles.yml new file mode 100644 index 0000000000..7cffea49d3 --- /dev/null +++ b/.rubocop_todo/rspec/verified_doubles.yml @@ -0,0 +1,1206 @@ +--- +RSpec/VerifiedDoubles: + Exclude: + - ee/spec/controllers/boards/issues_controller_spec.rb + - ee/spec/controllers/concerns/ee/routable_actions/sso_enforcement_redirect_spec.rb + - ee/spec/controllers/groups/clusters_controller_spec.rb + - ee/spec/controllers/groups/sso_controller_spec.rb + - ee/spec/controllers/oauth/geo_auth_controller_spec.rb + - ee/spec/controllers/projects/clusters_controller_spec.rb + - ee/spec/controllers/projects/security/network_policies_controller_spec.rb + - ee/spec/db/production/license_spec.rb + - ee/spec/elastic/migrate/20210510113500_delete_merge_requests_from_original_index_spec.rb + - ee/spec/elastic/migrate/20210510143200_delete_notes_from_original_index_spec.rb + - ee/spec/features/admin/groups/admin_subscription_alerts_spec.rb + - ee/spec/features/billings/billing_plans_spec.rb + - ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb + - ee/spec/features/profiles/account_spec.rb + - ee/spec/finders/license_template_finder_spec.rb + - ee/spec/finders/projects/integrations/jira/issues_finder_spec.rb + - ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb + - ee/spec/finders/template_finder_spec.rb + - ee/spec/graphql/ee/resolvers/board_lists_resolver_spec.rb + - ee/spec/graphql/mutations/dast_scanner_profiles/create_spec.rb + - ee/spec/graphql/mutations/dast_site_profiles/create_spec.rb + - ee/spec/graphql/mutations/dast_site_profiles/delete_spec.rb + - ee/spec/graphql/mutations/dast_site_profiles/update_spec.rb + - ee/spec/graphql/mutations/incident_management/oncall_rotation/create_spec.rb + - ee/spec/graphql/mutations/issues/promote_to_epic_spec.rb + - ee/spec/graphql/mutations/issues/set_epic_spec.rb + - ee/spec/graphql/mutations/merge_requests/accept_spec.rb + - ee/spec/graphql/mutations/vulnerabilities/create_external_issue_link_spec.rb + - ee/spec/graphql/mutations/vulnerabilities/destroy_external_issue_link_spec.rb + - ee/spec/graphql/resolvers/board_groupings/epics_resolvers_spec.rb + - ee/spec/graphql/resolvers/external_issue_resolver_spec.rb + - ee/spec/graphql/resolvers/security_report_summary_resolver_spec.rb + - ee/spec/graphql/resolvers/vulnerabilities/details_resolver_spec.rb + - ee/spec/graphql/types/network_policy_type_spec.rb + - ee/spec/graphql/types/security/training_type_spec.rb + - ee/spec/helpers/billing_plans_helper_spec.rb + - ee/spec/helpers/ee/ci/runners_helper_spec.rb + - ee/spec/helpers/ee/integrations_helper_spec.rb + - ee/spec/helpers/ee/subscribable_banner_helper_spec.rb + - ee/spec/helpers/ee/trial_helper_spec.rb + - ee/spec/helpers/ee/trial_registration_helper_spec.rb + - ee/spec/helpers/kerberos_spnego_helper_spec.rb + - ee/spec/helpers/license_helper_spec.rb + - ee/spec/helpers/roadmaps_helper_spec.rb + - ee/spec/helpers/routing/pseudonymization_helper_spec.rb + - ee/spec/helpers/subscriptions_helper_spec.rb + - ee/spec/helpers/timeboxes_helper_spec.rb + - ee/spec/helpers/vulnerabilities_helper_spec.rb + - ee/spec/lib/ee/backup/repositories_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/ci/matching/runner_matcher_spec.rb + - ee/spec/lib/ee/gitlab/ci/pipeline/quota/size_spec.rb + - ee/spec/lib/ee/gitlab/etag_caching/router/rails_spec.rb + - ee/spec/lib/ee/gitlab/gon_helper_spec.rb + - ee/spec/lib/elastic/latest/config_shared_examples.rb + - ee/spec/lib/elastic/latest/git_instance_proxy_spec.rb + - ee/spec/lib/elastic/migration_spec.rb + - ee/spec/lib/elastic/multi_version_class_proxy_spec.rb + - ee/spec/lib/elastic/multi_version_instance_proxy_spec.rb + - ee/spec/lib/gitlab/audit/target_spec.rb + - ee/spec/lib/gitlab/auth/group_saml/response_check_spec.rb + - ee/spec/lib/gitlab/auth/group_saml/token_actor_spec.rb + - ee/spec/lib/gitlab/auth/otp/session_enforcer_spec.rb + - ee/spec/lib/gitlab/authority_analyzer_spec.rb + - ee/spec/lib/gitlab/cache_spec.rb + - ee/spec/lib/gitlab/ci/pipeline/chain/limit/activity_spec.rb + - ee/spec/lib/gitlab/ci/pipeline/chain/limit/job_activity_spec.rb + - ee/spec/lib/gitlab/ci/pipeline/chain/limit/size_spec.rb + - ee/spec/lib/gitlab/code_owners/groups_loader_spec.rb + - ee/spec/lib/gitlab/code_owners/users_loader_spec.rb + - ee/spec/lib/gitlab/custom_file_templates_spec.rb + - ee/spec/lib/gitlab/elastic/client_spec.rb + - ee/spec/lib/gitlab/elastic/search_results_spec.rb + - ee/spec/lib/gitlab/expiring_subscription_message_spec.rb + - ee/spec/lib/gitlab/geo/git_ssh_proxy_spec.rb + - ee/spec/lib/gitlab/geo/log_cursor/lease_spec.rb + - ee/spec/lib/gitlab/geo/oauth/logout_token_spec.rb + - ee/spec/lib/gitlab/geo/oauth/session_spec.rb + - ee/spec/lib/gitlab/geo/replication/job_artifact_retriever_spec.rb + - ee/spec/lib/gitlab/geo/replication/job_artifact_transfer_spec.rb + - ee/spec/lib/gitlab/geo/replicator_spec.rb + - ee/spec/lib/gitlab/geo_spec.rb + - ee/spec/lib/gitlab/git_access_spec.rb + - ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_block_aggregate_spec.rb + - ee/spec/lib/gitlab/import_export/group/relation_factory_spec.rb + - ee/spec/lib/gitlab/middleware/ip_restrictor_spec.rb + - ee/spec/lib/gitlab/patch/legacy_database_config_spec.rb + - ee/spec/lib/gitlab/prometheus/queries/cluster_query_spec.rb + - ee/spec/lib/gitlab/prometheus/queries/packet_flow_metrics_query_spec.rb + - ee/spec/lib/gitlab/prometheus/queries/packet_flow_query_spec.rb + - ee/spec/lib/gitlab/subscription_portal/clients/rest_spec.rb + - ee/spec/lib/sidebars/groups/menus/analytics_menu_spec.rb + - ee/spec/lib/system_check/app/elasticsearch_check_spec.rb + - ee/spec/lib/system_check/geo/geo_database_configured_check_spec.rb + - ee/spec/models/app_sec/fuzzing/api/ci_configuration_spec.rb + - ee/spec/models/approvable_spec.rb + - ee/spec/models/concerns/ee/sha_attribute_spec.rb + - ee/spec/models/concerns/geo/verification_state_spec.rb + - ee/spec/models/ee/ci/job_artifact_spec.rb + - ee/spec/models/ee/user_spec.rb + - ee/spec/models/elastic/index_setting_spec.rb + - ee/spec/models/geo/project_registry_spec.rb + - ee/spec/models/geo/secondary_usage_data_spec.rb + - ee/spec/models/geo_node_status_spec.rb + - ee/spec/models/integrations/github/status_message_spec.rb + - ee/spec/models/integrations/github_spec.rb + - ee/spec/models/project_spec.rb + - ee/spec/models/push_rule_spec.rb + - ee/spec/presenters/audit_event_presenter_spec.rb + - ee/spec/presenters/group_member_presenter_spec.rb + - ee/spec/presenters/merge_request_approver_presenter_spec.rb + - ee/spec/presenters/project_member_presenter_spec.rb + - ee/spec/requests/api/alert_management_alerts_spec.rb + - ee/spec/requests/api/geo_spec.rb + - ee/spec/requests/api/graphql/mutations/dast_site_profiles/delete_spec.rb + - ee/spec/requests/api/internal/base_spec.rb + - ee/spec/requests/api/ldap_spec.rb + - ee/spec/requests/api/visual_review_discussions_spec.rb + - ee/spec/requests/api/vulnerability_findings_spec.rb + - ee/spec/requests/callout_spec.rb + - ee/spec/requests/rack_attack_spec.rb + - ee/spec/serializers/blocking_merge_request_entity_spec.rb + - ee/spec/serializers/clusters/environment_entity_spec.rb + - ee/spec/serializers/dashboard_operations_project_entity_spec.rb + - ee/spec/serializers/dependency_entity_spec.rb + - ee/spec/serializers/ee/admin/user_entity_spec.rb + - ee/spec/serializers/ee/build_details_entity_spec.rb + - ee/spec/serializers/ee/ci/job_entity_spec.rb + - ee/spec/serializers/ee/ci/pipeline_entity_spec.rb + - ee/spec/serializers/ee/group_child_entity_spec.rb + - ee/spec/serializers/ee/issue_board_entity_spec.rb + - ee/spec/serializers/ee/issue_entity_spec.rb + - ee/spec/serializers/ee/issue_sidebar_extras_entity_spec.rb + - ee/spec/serializers/ee/merge_request_poll_cached_widget_entity_spec.rb + - ee/spec/serializers/ee/note_entity_spec.rb + - ee/spec/serializers/environment_entity_spec.rb + - ee/spec/serializers/epic_entity_spec.rb + - ee/spec/serializers/epic_note_entity_spec.rb + - ee/spec/serializers/integrations/jira_serializers/issue_detail_entity_spec.rb + - ee/spec/serializers/integrations/jira_serializers/issue_entity_spec.rb + - ee/spec/serializers/issuable_sidebar_extras_entity_spec.rb + - ee/spec/serializers/issues/linked_issue_feature_flag_entity_spec.rb + - ee/spec/serializers/linked_feature_flag_issue_entity_spec.rb + - ee/spec/serializers/merge_request_compliance_entity_spec.rb + - ee/spec/serializers/merge_request_poll_widget_entity_spec.rb + - ee/spec/serializers/merge_request_sidebar_basic_entity_spec.rb + - ee/spec/serializers/merge_request_widget_entity_spec.rb + - ee/spec/serializers/service_field_entity_spec.rb + - ee/spec/serializers/test_reports_comparer_serializer_spec.rb + - ee/spec/serializers/user_analytics_entity_spec.rb + - ee/spec/serializers/vulnerabilities/feedback_entity_spec.rb + - ee/spec/serializers/vulnerabilities/finding_entity_spec.rb + - ee/spec/serializers/vulnerabilities/finding_reports_comparer_entity_spec.rb + - ee/spec/serializers/vulnerabilities/finding_serializer_spec.rb + - ee/spec/serializers/vulnerability_note_entity_spec.rb + - ee/spec/services/alert_management/extract_alert_payload_fields_service_spec.rb + - ee/spec/services/app_sec/dast/scans/create_service_spec.rb + - ee/spec/services/app_sec/dast/site_profiles/update_service_spec.rb + - ee/spec/services/app_sec/fuzzing/api/ci_configuration_create_service_spec.rb + - ee/spec/services/ci/create_pipeline_service/dast_configuration_spec.rb + - ee/spec/services/ci/minutes/track_live_consumption_service_spec.rb + - ee/spec/services/ci/minutes/update_project_and_namespace_usage_service_spec.rb + - ee/spec/services/ci/pipeline_creation/drop_not_runnable_builds_service_spec.rb + - ee/spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb + - ee/spec/services/dashboard/operations/list_service_spec.rb + - ee/spec/services/dashboard/projects/create_service_spec.rb + - ee/spec/services/ee/ci/job_artifacts/destroy_all_expired_service_spec.rb + - ee/spec/services/ee/ci/job_artifacts/destroy_batch_service_spec.rb + - ee/spec/services/ee/issues/create_service_spec.rb + - ee/spec/services/ee/issues/update_service_spec.rb + - ee/spec/services/ee/merge_requests/base_service_spec.rb + - ee/spec/services/ee/merge_requests/post_merge_service_spec.rb + - ee/spec/services/ee/merge_requests/refresh_service_spec.rb + - ee/spec/services/ee/notification_service_spec.rb + - ee/spec/services/ee/post_receive_service_spec.rb + - ee/spec/services/ee/service_ping/build_payload_service_spec.rb + - ee/spec/services/ee/service_ping/permit_data_categories_service_spec.rb + - ee/spec/services/ee/service_ping/service_ping_settings_spec.rb + - ee/spec/services/geo/blob_download_service_spec.rb + - ee/spec/services/geo/file_download_service_spec.rb + - ee/spec/services/geo/graphql_request_service_spec.rb + - ee/spec/services/geo/node_status_request_service_spec.rb + - ee/spec/services/geo/replication_toggle_request_service_spec.rb + - ee/spec/services/geo/repository_verification_primary_service_spec.rb + - ee/spec/services/gitlab_subscriptions/fetch_subscription_plans_service_spec.rb + - ee/spec/services/group_saml/group_managed_accounts/clean_up_members_service_spec.rb + - ee/spec/services/group_saml/sign_up_service_spec.rb + - ee/spec/services/groups/update_repository_storage_service_spec.rb + - ee/spec/services/ide/schemas_config_service_spec.rb + - ee/spec/services/incident_management/oncall_schedules/update_service_spec.rb + - ee/spec/services/incident_management/pending_escalations/process_service_spec.rb + - ee/spec/services/merge_requests/approval_service_spec.rb + - ee/spec/services/merge_requests/build_service_spec.rb + - ee/spec/services/merge_requests/reset_approvals_service_spec.rb + - ee/spec/services/namespaces/in_product_marketing_emails_service_spec.rb + - ee/spec/services/network_policies/delete_resource_service_spec.rb + - ee/spec/services/network_policies/deploy_resource_service_spec.rb + - ee/spec/services/network_policies/find_resource_service_spec.rb + - ee/spec/services/network_policies/resources_service_spec.rb + - ee/spec/services/projects/update_mirror_service_spec.rb + - ee/spec/services/projects/update_pages_service_spec.rb + - ee/spec/services/security/ingestion/ingest_report_slice_service_spec.rb + - ee/spec/services/security/orchestration/assign_service_spec.rb + - ee/spec/services/security/security_orchestration_policies/on_demand_scan_pipeline_configuration_service_spec.rb + - ee/spec/services/slash_commands/global_slack_handler_spec.rb + - ee/spec/services/status_page/publish_details_service_spec.rb + - ee/spec/services/status_page/publish_service_spec.rb + - ee/spec/services/status_page/trigger_publish_service_spec.rb + - ee/spec/services/system_note_service_spec.rb + - ee/spec/services/vulnerability_exports/export_service_spec.rb + - ee/spec/services/vulnerability_external_issue_links/create_service_spec.rb + - ee/spec/support/helpers/ee/ldap_helpers.rb + - ee/spec/support/prometheus/additional_metrics_shared_examples.rb + - ee/spec/support/shared_examples/controllers/analytics/cycle_analytics/shared_stage_shared_examples.rb + - ee/spec/support/shared_examples/controllers/cluster_metrics_shared_examples.rb + - ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb + - ee/spec/support/shared_examples/models/concerns/verifiable_replicator_shared_examples.rb + - ee/spec/support/shared_examples/models/geo_verifiable_registry_shared_examples.rb + - ee/spec/support/shared_examples/serializers/report_status_shared_examples.rb + - ee/spec/support/shared_examples/services/alert_management/alert_processing/oncall_notifications_shared_examples.rb + - ee/spec/support/shared_examples/services/base_sync_service_shared_examples.rb + - ee/spec/support/shared_examples/services/geo/geo_request_service_shared_examples.rb + - ee/spec/support/shared_examples/status_page/reference_links_examples.rb + - ee/spec/validators/json_schema_validator_spec.rb + - ee/spec/views/layouts/header/_ee_subscribable_banner.html.haml_spec.rb + - ee/spec/workers/ci/sync_reports_to_report_approval_rules_worker_spec.rb + - ee/spec/workers/geo/container_repository_sync_worker_spec.rb + - ee/spec/workers/geo/design_repository_sync_worker_spec.rb + - ee/spec/workers/geo/destroy_worker_spec.rb + - ee/spec/workers/geo/event_worker_spec.rb + - ee/spec/workers/geo/file_download_dispatch_worker_spec.rb + - ee/spec/workers/geo/file_download_worker_spec.rb + - ee/spec/workers/geo/metrics_update_worker_spec.rb + - ee/spec/workers/geo/prune_event_log_worker_spec.rb + - ee/spec/workers/geo/registry_sync_worker_spec.rb + - ee/spec/workers/geo/reverification_batch_worker_spec.rb + - ee/spec/workers/geo/sidekiq_cron_config_worker_spec.rb + - ee/spec/workers/geo/sync_timeout_cron_worker_spec.rb + - ee/spec/workers/geo/verification_batch_worker_spec.rb + - ee/spec/workers/geo/verification_cron_worker_spec.rb + - ee/spec/workers/geo/verification_timeout_worker_spec.rb + - ee/spec/workers/geo/verification_worker_spec.rb + - ee/spec/workers/iterations/cadences/create_iterations_worker_spec.rb + - ee/spec/workers/iterations/roll_over_issues_worker_spec.rb + - ee/spec/workers/ldap_group_sync_worker_spec.rb + - ee/spec/workers/merge_request_reset_approvals_worker_spec.rb + - ee/spec/workers/new_epic_worker_spec.rb + - ee/spec/workers/update_max_seats_used_for_gitlab_com_subscriptions_worker_spec.rb + - qa/spec/git/repository_spec.rb + - qa/spec/page/base_spec.rb + - qa/spec/page/validator_spec.rb + - qa/spec/page/view_spec.rb + - qa/spec/resource/api_fabricator_spec.rb + - qa/spec/resource/base_spec.rb + - qa/spec/runtime/application_settings_spec.rb + - qa/spec/runtime/feature_spec.rb + - qa/spec/runtime/release_spec.rb + - qa/spec/scenario/template_spec.rb + - qa/spec/scenario/test/integration/github_spec.rb + - qa/spec/scenario/test/sanity/selectors_spec.rb + - qa/spec/specs/allure_report_spec.rb + - qa/spec/support/formatters/allure_metadata_formatter_spec.rb + - qa/spec/support/page_error_checker_spec.rb + - qa/spec/support/run_spec.rb + - qa/spec/support/shared_examples/scenario_shared_examples.rb + - qa/spec/tools/long_running_spec_reporter_spec.rb + - spec/benchmarks/banzai_benchmark.rb + - spec/bin/feature_flag_spec.rb + - spec/controllers/admin/clusters_controller_spec.rb + - spec/controllers/application_controller_spec.rb + - spec/controllers/boards/issues_controller_spec.rb + - spec/controllers/boards/lists_controller_spec.rb + - spec/controllers/concerns/checks_collaboration_spec.rb + - spec/controllers/concerns/import_url_params_spec.rb + - spec/controllers/concerns/issuable_actions_spec.rb + - spec/controllers/concerns/issuable_collections_spec.rb + - spec/controllers/concerns/page_limiter_spec.rb + - spec/controllers/concerns/spammable_actions/akismet_mark_as_spam_action_spec.rb + - spec/controllers/concerns/spammable_actions/captcha_check/html_format_actions_support_spec.rb + - spec/controllers/concerns/spammable_actions/captcha_check/json_format_actions_support_spec.rb + - spec/controllers/dashboard/snippets_controller_spec.rb + - spec/controllers/explore/projects_controller_spec.rb + - spec/controllers/groups/clusters_controller_spec.rb + - spec/controllers/groups/dependency_proxy_auth_controller_spec.rb + - spec/controllers/groups/dependency_proxy_for_containers_controller_spec.rb + - spec/controllers/help_controller_spec.rb + - spec/controllers/import/bitbucket_controller_spec.rb + - spec/controllers/import/bitbucket_server_controller_spec.rb + - spec/controllers/import/bulk_imports_controller_spec.rb + - spec/controllers/import/fogbugz_controller_spec.rb + - spec/controllers/import/gitea_controller_spec.rb + - spec/controllers/import/github_controller_spec.rb + - spec/controllers/import/gitlab_controller_spec.rb + - spec/controllers/oauth/jira/authorizations_controller_spec.rb + - spec/controllers/omniauth_callbacks_controller_spec.rb + - spec/controllers/profiles/two_factor_auths_controller_spec.rb + - spec/controllers/projects/blob_controller_spec.rb + - spec/controllers/projects/branches_controller_spec.rb + - spec/controllers/projects/clusters_controller_spec.rb + - spec/controllers/projects/error_tracking/projects_controller_spec.rb + - spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb + - spec/controllers/projects/error_tracking_controller_spec.rb + - spec/controllers/projects/import/jira_controller_spec.rb + - spec/controllers/projects/jobs_controller_spec.rb + - spec/controllers/projects/merge_requests/diffs_controller_spec.rb + - spec/controllers/projects/merge_requests_controller_spec.rb + - spec/controllers/projects/notes_controller_spec.rb + - spec/controllers/projects/pages_controller_spec.rb + - spec/controllers/projects/performance_monitoring/dashboards_controller_spec.rb + - spec/controllers/projects/pipelines_controller_spec.rb + - spec/controllers/projects/prometheus/metrics_controller_spec.rb + - spec/controllers/projects/registry/tags_controller_spec.rb + - spec/controllers/projects/settings/operations_controller_spec.rb + - spec/controllers/projects/snippets_controller_spec.rb + - spec/controllers/sessions_controller_spec.rb + - spec/dependencies/omniauth_saml_spec.rb + - spec/experiments/concerns/project_commit_count_spec.rb + - spec/factories/ci/job_artifacts.rb + - spec/factories/clusters/applications/helm.rb + - spec/features/admin/admin_system_info_spec.rb + - spec/features/clusters/create_agent_spec.rb + - spec/features/file_uploads/maven_package_spec.rb + - spec/features/groups/container_registry_spec.rb + - spec/features/help_pages_spec.rb + - spec/features/issuables/markdown_references/jira_spec.rb + - spec/features/markdown/markdown_spec.rb + - spec/features/profiles/personal_access_tokens_spec.rb + - spec/features/projects/clusters/gcp_spec.rb + - spec/features/projects/clusters_spec.rb + - spec/features/projects/container_registry_spec.rb + - spec/features/projects/integrations/user_activates_jira_spec.rb + - spec/finders/ci/auth_job_finder_spec.rb + - spec/finders/merge_requests/oldest_per_commit_finder_spec.rb + - spec/finders/projects/serverless/functions_finder_spec.rb + - spec/finders/repositories/changelog_commits_finder_spec.rb + - spec/finders/repositories/changelog_tag_finder_spec.rb + - spec/graphql/features/authorization_spec.rb + - spec/graphql/features/feature_flag_spec.rb + - spec/graphql/mutations/alert_management/alerts/todo/create_spec.rb + - spec/graphql/mutations/alert_management/update_alert_status_spec.rb + - spec/graphql/mutations/branches/create_spec.rb + - spec/graphql/mutations/ci/job_token_scope/add_project_spec.rb + - spec/graphql/mutations/ci/job_token_scope/remove_project_spec.rb + - spec/graphql/mutations/concerns/mutations/finds_by_gid_spec.rb + - spec/graphql/mutations/design_management/upload_spec.rb + - spec/graphql/mutations/environments/canary_ingress/update_spec.rb + - spec/graphql/mutations/merge_requests/accept_spec.rb + - spec/graphql/mutations/merge_requests/create_spec.rb + - spec/graphql/resolvers/design_management/versions_resolver_spec.rb + - spec/graphql/resolvers/error_tracking/sentry_detailed_error_resolver_spec.rb + - spec/graphql/resolvers/error_tracking/sentry_error_collection_resolver_spec.rb + - spec/graphql/resolvers/error_tracking/sentry_errors_resolver_spec.rb + - spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb + - spec/graphql/resolvers/projects/jira_projects_resolver_spec.rb + - spec/graphql/types/ci/detailed_status_type_spec.rb + - spec/graphql/types/ci/status_action_type_spec.rb + - spec/graphql/types/kas/agent_connection_type_spec.rb + - spec/graphql/types/permission_types/base_permission_type_spec.rb + - spec/graphql/types/project_type_spec.rb + - spec/graphql/types/range_input_type_spec.rb + - spec/helpers/blame_helper_spec.rb + - spec/helpers/blob_helper_spec.rb + - spec/helpers/ci/pipelines_helper_spec.rb + - spec/helpers/ci/status_helper_spec.rb + - spec/helpers/ci/triggers_helper_spec.rb + - spec/helpers/commits_helper_spec.rb + - spec/helpers/dev_ops_report_helper_spec.rb + - spec/helpers/diff_helper_spec.rb + - spec/helpers/emails_helper_spec.rb + - spec/helpers/environments_helper_spec.rb + - spec/helpers/form_helper_spec.rb + - spec/helpers/gitlab_routing_helper_spec.rb + - spec/helpers/integrations_helper_spec.rb + - spec/helpers/issuables_helper_spec.rb + - spec/helpers/markup_helper_spec.rb + - spec/helpers/merge_requests_helper_spec.rb + - spec/helpers/notes_helper_spec.rb + - spec/helpers/numbers_helper_spec.rb + - spec/helpers/preferences_helper_spec.rb + - spec/helpers/projects_helper_spec.rb + - spec/helpers/routing/pseudonymization_helper_spec.rb + - spec/helpers/sorting_helper_spec.rb + - spec/helpers/submodule_helper_spec.rb + - spec/helpers/todos_helper_spec.rb + - spec/helpers/tree_helper_spec.rb + - spec/helpers/version_check_helper_spec.rb + - spec/initializers/doorkeeper_spec.rb + - spec/initializers/global_id_spec.rb + - spec/initializers/hangouts_chat_http_override_spec.rb + - spec/lib/api/base_spec.rb + - spec/lib/api/entities/ci/job_request/image_spec.rb + - spec/lib/api/entities/ci/job_request/port_spec.rb + - spec/lib/api/helpers/authentication_spec.rb + - spec/lib/api/helpers/caching_spec.rb + - spec/lib/api/helpers/graphql_helpers_spec.rb + - spec/lib/api/helpers/pagination_spec.rb + - spec/lib/api/helpers/pagination_strategies_spec.rb + - spec/lib/api/helpers/sse_helpers_spec.rb + - spec/lib/api/helpers/variables_helpers_spec.rb + - spec/lib/api/helpers_spec.rb + - spec/lib/atlassian/jira_connect/client_spec.rb + - spec/lib/backup/files_spec.rb + - spec/lib/backup/gitaly_rpc_backup_spec.rb + - spec/lib/backup/repositories_spec.rb + - spec/lib/banzai/cross_project_reference_spec.rb + - spec/lib/banzai/filter/gollum_tags_filter_spec.rb + - spec/lib/banzai/filter/repository_link_filter_spec.rb + - spec/lib/banzai/pipeline/wiki_pipeline_spec.rb + - spec/lib/banzai/querying_spec.rb + - spec/lib/banzai/reference_parser/base_parser_spec.rb + - spec/lib/banzai/reference_parser/commit_parser_spec.rb + - spec/lib/banzai/reference_parser/commit_range_parser_spec.rb + - spec/lib/banzai/render_context_spec.rb + - spec/lib/banzai/renderer_spec.rb + - spec/lib/bitbucket/connection_spec.rb + - spec/lib/bitbucket/paginator_spec.rb + - spec/lib/bitbucket_server/paginator_spec.rb + - spec/lib/bulk_imports/clients/http_spec.rb + - spec/lib/bulk_imports/common/extractors/graphql_extractor_spec.rb + - spec/lib/bulk_imports/common/extractors/rest_extractor_spec.rb + - spec/lib/bulk_imports/ndjson_pipeline_spec.rb + - spec/lib/bulk_imports/network_error_spec.rb + - spec/lib/bulk_imports/projects/pipelines/snippets_repository_pipeline_spec.rb + - spec/lib/bulk_imports/projects/transformers/project_attributes_transformer_spec.rb + - spec/lib/constraints/admin_constrainer_spec.rb + - spec/lib/constraints/feature_constrainer_spec.rb + - spec/lib/constraints/group_url_constrainer_spec.rb + - spec/lib/constraints/jira_encoded_url_constrainer_spec.rb + - spec/lib/constraints/project_url_constrainer_spec.rb + - spec/lib/constraints/user_url_constrainer_spec.rb + - spec/lib/csv_builder_spec.rb + - spec/lib/csv_builders/stream_spec.rb + - spec/lib/error_tracking/collector/dsn_spec.rb + - spec/lib/error_tracking/collector/sentry_auth_parser_spec.rb + - spec/lib/error_tracking/collector/sentry_request_parser_spec.rb + - spec/lib/error_tracking/sentry_client/issue_spec.rb + - spec/lib/extracts_path_spec.rb + - spec/lib/feature_spec.rb + - spec/lib/gitaly/server_spec.rb + - spec/lib/gitlab/api_authentication/token_locator_spec.rb + - spec/lib/gitlab/application_context_spec.rb + - spec/lib/gitlab/application_rate_limiter_spec.rb + - spec/lib/gitlab/asciidoc/include_processor_spec.rb + - spec/lib/gitlab/auth/auth_finders_spec.rb + - spec/lib/gitlab/auth/blocked_user_tracker_spec.rb + - spec/lib/gitlab/auth/ldap/adapter_spec.rb + - spec/lib/gitlab/auth/ldap/authentication_spec.rb + - spec/lib/gitlab/authorized_keys_spec.rb + - spec/lib/gitlab/avatar_cache_spec.rb + - spec/lib/gitlab/background_migration/base_job_spec.rb + - spec/lib/gitlab/background_migration/batching_strategies/base_strategy_spec.rb + - spec/lib/gitlab/background_migration/fix_merge_request_diff_commit_users_spec.rb + - spec/lib/gitlab/background_migration/job_coordinator_spec.rb + - spec/lib/gitlab/background_migration/migrate_merge_request_diff_commit_users_spec.rb + - spec/lib/gitlab/background_migration_spec.rb + - spec/lib/gitlab/bitbucket_import/importer_spec.rb + - spec/lib/gitlab/bitbucket_import/project_creator_spec.rb + - spec/lib/gitlab/bitbucket_server_import/importer_spec.rb + - spec/lib/gitlab/cache/import/caching_spec.rb + - spec/lib/gitlab/changelog/committer_spec.rb + - spec/lib/gitlab/chat/responder/base_spec.rb + - spec/lib/gitlab/chat/responder_spec.rb + - spec/lib/gitlab/ci/badge/coverage/metadata_spec.rb + - spec/lib/gitlab/ci/badge/coverage/template_spec.rb + - spec/lib/gitlab/ci/badge/pipeline/metadata_spec.rb + - spec/lib/gitlab/ci/badge/pipeline/template_spec.rb + - spec/lib/gitlab/ci/build/cache_spec.rb + - spec/lib/gitlab/ci/build/policy/changes_spec.rb + - spec/lib/gitlab/ci/build/policy/variables_spec.rb + - spec/lib/gitlab/ci/build/policy_spec.rb + - spec/lib/gitlab/ci/build/prerequisite/kubernetes_namespace_spec.rb + - spec/lib/gitlab/ci/build/rules/rule/clause/changes_spec.rb + - spec/lib/gitlab/ci/build/rules/rule_spec.rb + - spec/lib/gitlab/ci/build/rules_spec.rb + - spec/lib/gitlab/ci/build/status/reason_spec.rb + - spec/lib/gitlab/ci/config/entry/default_spec.rb + - spec/lib/gitlab/ci/config/entry/job_spec.rb + - spec/lib/gitlab/ci/config/entry/processable_spec.rb + - spec/lib/gitlab/ci/config/external/context_spec.rb + - spec/lib/gitlab/ci/config/external/file/local_spec.rb + - spec/lib/gitlab/ci/config/external/file/project_spec.rb + - spec/lib/gitlab/ci/config/external/rules_spec.rb + - spec/lib/gitlab/ci/parsers/test/junit_spec.rb + - spec/lib/gitlab/ci/pipeline/chain/command_spec.rb + - spec/lib/gitlab/ci/pipeline/chain/evaluate_workflow_rules_spec.rb + - spec/lib/gitlab/ci/pipeline/chain/helpers_spec.rb + - spec/lib/gitlab/ci/pipeline/chain/limit/deployments_spec.rb + - spec/lib/gitlab/ci/pipeline/chain/remove_unwanted_chat_jobs_spec.rb + - spec/lib/gitlab/ci/pipeline/chain/sequence_spec.rb + - spec/lib/gitlab/ci/pipeline/chain/skip_spec.rb + - spec/lib/gitlab/ci/pipeline/chain/template_usage_spec.rb + - spec/lib/gitlab/ci/pipeline/expression/lexeme/and_spec.rb + - spec/lib/gitlab/ci/pipeline/expression/lexeme/equals_spec.rb + - spec/lib/gitlab/ci/pipeline/expression/lexeme/matches_spec.rb + - spec/lib/gitlab/ci/pipeline/expression/lexeme/not_equals_spec.rb + - spec/lib/gitlab/ci/pipeline/expression/lexeme/not_matches_spec.rb + - spec/lib/gitlab/ci/pipeline/expression/lexeme/or_spec.rb + - spec/lib/gitlab/ci/pipeline/preloader_spec.rb + - spec/lib/gitlab/ci/pipeline/quota/deployments_spec.rb + - spec/lib/gitlab/ci/pipeline/seed/build_spec.rb + - spec/lib/gitlab/ci/reports/security/report_spec.rb + - spec/lib/gitlab/ci/status/build/action_spec.rb + - spec/lib/gitlab/ci/status/build/cancelable_spec.rb + - spec/lib/gitlab/ci/status/build/canceled_spec.rb + - spec/lib/gitlab/ci/status/build/created_spec.rb + - spec/lib/gitlab/ci/status/build/erased_spec.rb + - spec/lib/gitlab/ci/status/build/failed_allowed_spec.rb + - spec/lib/gitlab/ci/status/build/failed_spec.rb + - spec/lib/gitlab/ci/status/build/pending_spec.rb + - spec/lib/gitlab/ci/status/build/preparing_spec.rb + - spec/lib/gitlab/ci/status/build/retried_spec.rb + - spec/lib/gitlab/ci/status/build/retryable_spec.rb + - spec/lib/gitlab/ci/status/build/skipped_spec.rb + - spec/lib/gitlab/ci/status/build/stop_spec.rb + - spec/lib/gitlab/ci/status/build/unschedule_spec.rb + - spec/lib/gitlab/ci/status/canceled_spec.rb + - spec/lib/gitlab/ci/status/core_spec.rb + - spec/lib/gitlab/ci/status/created_spec.rb + - spec/lib/gitlab/ci/status/factory_spec.rb + - spec/lib/gitlab/ci/status/failed_spec.rb + - spec/lib/gitlab/ci/status/manual_spec.rb + - spec/lib/gitlab/ci/status/pending_spec.rb + - spec/lib/gitlab/ci/status/pipeline/blocked_spec.rb + - spec/lib/gitlab/ci/status/pipeline/delayed_spec.rb + - spec/lib/gitlab/ci/status/preparing_spec.rb + - spec/lib/gitlab/ci/status/running_spec.rb + - spec/lib/gitlab/ci/status/scheduled_spec.rb + - spec/lib/gitlab/ci/status/skipped_spec.rb + - spec/lib/gitlab/ci/status/stage/play_manual_spec.rb + - spec/lib/gitlab/ci/status/success_spec.rb + - spec/lib/gitlab/ci/status/success_warning_spec.rb + - spec/lib/gitlab/ci/status/waiting_for_resource_spec.rb + - spec/lib/gitlab/ci/trace/archive_spec.rb + - spec/lib/gitlab/ci/trace/remote_checksum_spec.rb + - spec/lib/gitlab/ci/trace/stream_spec.rb + - spec/lib/gitlab/ci/variables/builder_spec.rb + - spec/lib/gitlab/cleanup/orphan_lfs_file_references_spec.rb + - spec/lib/gitlab/cleanup/project_uploads_spec.rb + - spec/lib/gitlab/cleanup/remote_uploads_spec.rb + - spec/lib/gitlab/cluster/puma_worker_killer_observer_spec.rb + - spec/lib/gitlab/cluster/rack_timeout_observer_spec.rb + - spec/lib/gitlab/color_schemes_spec.rb + - spec/lib/gitlab/conan_token_spec.rb + - spec/lib/gitlab/config/entry/configurable_spec.rb + - spec/lib/gitlab/config/entry/factory_spec.rb + - spec/lib/gitlab/config/entry/simplifiable_spec.rb + - spec/lib/gitlab/config/entry/unspecified_spec.rb + - spec/lib/gitlab/config/entry/validator_spec.rb + - spec/lib/gitlab/conflict/file_spec.rb + - spec/lib/gitlab/cross_project_access/check_collection_spec.rb + - spec/lib/gitlab/database/async_indexes_spec.rb + - spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb + - spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb + - spec/lib/gitlab/database/batch_count_spec.rb + - spec/lib/gitlab/database/count_spec.rb + - spec/lib/gitlab/database/each_database_spec.rb + - spec/lib/gitlab/database/load_balancing/configuration_spec.rb + - spec/lib/gitlab/database/load_balancing/connection_proxy_spec.rb + - spec/lib/gitlab/database/load_balancing/host_list_spec.rb + - spec/lib/gitlab/database/load_balancing/host_spec.rb + - spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb + - spec/lib/gitlab/database/load_balancing/rack_middleware_spec.rb + - spec/lib/gitlab/database/load_balancing/resolver_spec.rb + - spec/lib/gitlab/database/load_balancing/service_discovery_spec.rb + - spec/lib/gitlab/database/load_balancing/setup_spec.rb + - spec/lib/gitlab/database/load_balancing/sidekiq_server_middleware_spec.rb + - spec/lib/gitlab/database/load_balancing_spec.rb + - spec/lib/gitlab/database/migration_helpers_spec.rb + - spec/lib/gitlab/database/migrations/background_migration_helpers_spec.rb + - spec/lib/gitlab/database/migrations/instrumentation_spec.rb + - spec/lib/gitlab/database/migrations/lock_retry_mixin_spec.rb + - spec/lib/gitlab/database/migrations/observers/query_statistics_spec.rb + - spec/lib/gitlab/database/migrations/observers/total_database_size_change_spec.rb + - spec/lib/gitlab/database/migrations/runner_spec.rb + - spec/lib/gitlab/database/partitioning/monthly_strategy_spec.rb + - spec/lib/gitlab/database/partitioning/partition_manager_spec.rb + - spec/lib/gitlab/database/partitioning/partition_monitoring_spec.rb + - spec/lib/gitlab/database/partitioning/sliding_list_strategy_spec.rb + - spec/lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table_spec.rb + - spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb + - spec/lib/gitlab/database/partitioning_spec.rb + - spec/lib/gitlab/database/postgresql_adapter/empty_query_ping_spec.rb + - spec/lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin_spec.rb + - spec/lib/gitlab/database/query_analyzer_spec.rb + - spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb + - spec/lib/gitlab/database/reindexing/reindex_concurrently_spec.rb + - spec/lib/gitlab/database/shared_model_spec.rb + - spec/lib/gitlab/database_spec.rb + - spec/lib/gitlab/diff/file_collection_sorter_spec.rb + - spec/lib/gitlab/diff/file_spec.rb + - spec/lib/gitlab/diff/line_spec.rb + - spec/lib/gitlab/diff/position_tracer_spec.rb + - spec/lib/gitlab/doctor/secrets_spec.rb + - spec/lib/gitlab/email/handler/service_desk_handler_spec.rb + - spec/lib/gitlab/email/receiver_spec.rb + - spec/lib/gitlab/email/service_desk_receiver_spec.rb + - spec/lib/gitlab/error_tracking/processor/sidekiq_processor_spec.rb + - spec/lib/gitlab/error_tracking_spec.rb + - spec/lib/gitlab/etag_caching/middleware_spec.rb + - spec/lib/gitlab/etag_caching/router/graphql_spec.rb + - spec/lib/gitlab/etag_caching/router/rails_spec.rb + - spec/lib/gitlab/etag_caching/router_spec.rb + - spec/lib/gitlab/event_store/store_spec.rb + - spec/lib/gitlab/experiment/rollout/feature_spec.rb + - spec/lib/gitlab/experimentation/controller_concern_spec.rb + - spec/lib/gitlab/experimentation/experiment_spec.rb + - spec/lib/gitlab/experimentation_spec.rb + - spec/lib/gitlab/external_authorization/access_spec.rb + - spec/lib/gitlab/external_authorization/logger_spec.rb + - spec/lib/gitlab/faraday/error_callback_spec.rb + - spec/lib/gitlab/feature_categories_spec.rb + - spec/lib/gitlab/git/blob_spec.rb + - spec/lib/gitlab/git/commit_spec.rb + - spec/lib/gitlab/git/repository_spec.rb + - spec/lib/gitlab/git/rugged_impl/use_rugged_spec.rb + - spec/lib/gitlab/git/tag_spec.rb + - spec/lib/gitlab/git_access_snippet_spec.rb + - spec/lib/gitlab/gitaly_client/commit_service_spec.rb + - spec/lib/gitlab/gitaly_client/conflict_files_stitcher_spec.rb + - spec/lib/gitlab/gitaly_client/conflicts_service_spec.rb + - spec/lib/gitlab/gitaly_client/health_check_service_spec.rb + - spec/lib/gitlab/gitaly_client/ref_service_spec.rb + - spec/lib/gitlab/gitaly_client/remote_service_spec.rb + - spec/lib/gitlab/gitaly_client/repository_service_spec.rb + - spec/lib/gitlab/gitaly_client_spec.rb + - spec/lib/gitlab/github_import/bulk_importing_spec.rb + - spec/lib/gitlab/github_import/client_spec.rb + - spec/lib/gitlab/github_import/importer/diff_note_importer_spec.rb + - spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb + - spec/lib/gitlab/github_import/importer/issue_and_label_links_importer_spec.rb + - spec/lib/gitlab/github_import/importer/issue_importer_spec.rb + - spec/lib/gitlab/github_import/importer/issues_importer_spec.rb + - spec/lib/gitlab/github_import/importer/label_links_importer_spec.rb + - spec/lib/gitlab/github_import/importer/labels_importer_spec.rb + - spec/lib/gitlab/github_import/importer/lfs_objects_importer_spec.rb + - spec/lib/gitlab/github_import/importer/milestones_importer_spec.rb + - spec/lib/gitlab/github_import/importer/note_importer_spec.rb + - spec/lib/gitlab/github_import/importer/notes_importer_spec.rb + - spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb + - spec/lib/gitlab/github_import/importer/pull_request_merged_by_importer_spec.rb + - spec/lib/gitlab/github_import/importer/pull_request_review_importer_spec.rb + - spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb + - spec/lib/gitlab/github_import/importer/pull_requests_merged_by_importer_spec.rb + - spec/lib/gitlab/github_import/importer/pull_requests_reviews_importer_spec.rb + - spec/lib/gitlab/github_import/importer/releases_importer_spec.rb + - spec/lib/gitlab/github_import/importer/repository_importer_spec.rb + - spec/lib/gitlab/github_import/importer/single_endpoint_diff_notes_importer_spec.rb + - spec/lib/gitlab/github_import/importer/single_endpoint_issue_notes_importer_spec.rb + - spec/lib/gitlab/github_import/importer/single_endpoint_merge_request_notes_importer_spec.rb + - spec/lib/gitlab/github_import/issuable_finder_spec.rb + - spec/lib/gitlab/github_import/markdown_text_spec.rb + - spec/lib/gitlab/github_import/milestone_finder_spec.rb + - spec/lib/gitlab/github_import/object_counter_spec.rb + - spec/lib/gitlab/github_import/page_counter_spec.rb + - spec/lib/gitlab/github_import/parallel_importer_spec.rb + - spec/lib/gitlab/github_import/parallel_scheduling_spec.rb + - spec/lib/gitlab/github_import/representation/diff_note_spec.rb + - spec/lib/gitlab/github_import/representation/issue_spec.rb + - spec/lib/gitlab/github_import/representation/note_spec.rb + - spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb + - spec/lib/gitlab/github_import/representation/pull_request_spec.rb + - spec/lib/gitlab/github_import/representation/to_hash_spec.rb + - spec/lib/gitlab/github_import/representation/user_spec.rb + - spec/lib/gitlab/github_import/sequential_importer_spec.rb + - spec/lib/gitlab/github_import/user_finder_spec.rb + - spec/lib/gitlab/github_import_spec.rb + - spec/lib/gitlab/gon_helper_spec.rb + - spec/lib/gitlab/gpg/commit_spec.rb + - spec/lib/gitlab/gpg/invalid_gpg_signature_updater_spec.rb + - spec/lib/gitlab/gpg_spec.rb + - spec/lib/gitlab/grape_logging/loggers/exception_logger_spec.rb + - spec/lib/gitlab/grape_logging/loggers/perf_logger_spec.rb + - spec/lib/gitlab/grape_logging/loggers/queue_duration_logger_spec.rb + - spec/lib/gitlab/grape_logging/loggers/urgency_logger_spec.rb + - spec/lib/gitlab/graphql/authorize/object_authorization_spec.rb + - spec/lib/gitlab/graphql/batch_key_spec.rb + - spec/lib/gitlab/graphql/find_argument_in_parent_spec.rb + - spec/lib/gitlab/graphql/generic_tracing_spec.rb + - spec/lib/gitlab/graphql/lazy_spec.rb + - spec/lib/gitlab/graphql/loaders/issuable_loader_spec.rb + - spec/lib/gitlab/graphql/pagination/keyset/conditions/not_null_condition_spec.rb + - spec/lib/gitlab/graphql/pagination/keyset/conditions/null_condition_spec.rb + - spec/lib/gitlab/graphql/pagination/keyset/connection_generic_keyset_spec.rb + - spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb + - spec/lib/gitlab/graphql/present/field_extension_spec.rb + - spec/lib/gitlab/graphql/timeout_spec.rb + - spec/lib/gitlab/graphql/tracers/application_context_tracer_spec.rb + - spec/lib/gitlab/graphql/tracers/timer_tracer_spec.rb + - spec/lib/gitlab/health_checks/gitaly_check_spec.rb + - spec/lib/gitlab/hook_data/base_builder_spec.rb + - spec/lib/gitlab/hotlinking_detector_spec.rb + - spec/lib/gitlab/import/import_failure_service_spec.rb + - spec/lib/gitlab/import/metrics_spec.rb + - spec/lib/gitlab/import_export/attribute_cleaner_spec.rb + - spec/lib/gitlab/import_export/base/relation_factory_spec.rb + - spec/lib/gitlab/import_export/decompressed_archive_size_validator_spec.rb + - spec/lib/gitlab/import_export/group/relation_factory_spec.rb + - spec/lib/gitlab/import_export/importer_spec.rb + - spec/lib/gitlab/import_export/project/relation_factory_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/issuables_count_for_state_spec.rb + - spec/lib/gitlab/issues/rebalancing/state_spec.rb + - spec/lib/gitlab/jira/middleware_spec.rb + - spec/lib/gitlab/jira_import/issue_serializer_spec.rb + - spec/lib/gitlab/jira_import/labels_importer_spec.rb + - spec/lib/gitlab/jira_import/metadata_collector_spec.rb + - spec/lib/gitlab/jira_import_spec.rb + - spec/lib/gitlab/job_waiter_spec.rb + - spec/lib/gitlab/json_cache_spec.rb + - spec/lib/gitlab/kas/client_spec.rb + - spec/lib/gitlab/kubernetes/config_map_spec.rb + - spec/lib/gitlab/kubernetes/default_namespace_spec.rb + - spec/lib/gitlab/kubernetes/helm/api_spec.rb + - spec/lib/gitlab/kubernetes/namespace_spec.rb + - spec/lib/gitlab/lazy_spec.rb + - spec/lib/gitlab/legacy_github_import/branch_formatter_spec.rb + - spec/lib/gitlab/legacy_github_import/comment_formatter_spec.rb + - spec/lib/gitlab/legacy_github_import/importer_spec.rb + - spec/lib/gitlab/legacy_github_import/issuable_formatter_spec.rb + - spec/lib/gitlab/legacy_github_import/issue_formatter_spec.rb + - spec/lib/gitlab/legacy_github_import/label_formatter_spec.rb + - spec/lib/gitlab/legacy_github_import/milestone_formatter_spec.rb + - spec/lib/gitlab/legacy_github_import/pull_request_formatter_spec.rb + - spec/lib/gitlab/legacy_github_import/release_formatter_spec.rb + - spec/lib/gitlab/legacy_github_import/user_formatter_spec.rb + - spec/lib/gitlab/lets_encrypt/client_spec.rb + - spec/lib/gitlab/mail_room/mail_room_spec.rb + - spec/lib/gitlab/manifest_import/metadata_spec.rb + - spec/lib/gitlab/markdown_cache/field_data_spec.rb + - spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb + - spec/lib/gitlab/merge_requests/mergeability/redis_interface_spec.rb + - spec/lib/gitlab/metrics/boot_time_tracker_spec.rb + - spec/lib/gitlab/metrics/dashboard/importers/prometheus_metrics_spec.rb + - spec/lib/gitlab/metrics/elasticsearch_rack_middleware_spec.rb + - spec/lib/gitlab/metrics/exporter/base_exporter_spec.rb + - spec/lib/gitlab/metrics/exporter/gc_request_middleware_spec.rb + - spec/lib/gitlab/metrics/exporter/health_checks_middleware_spec.rb + - spec/lib/gitlab/metrics/exporter/metrics_middleware_spec.rb + - spec/lib/gitlab/metrics/rack_middleware_spec.rb + - spec/lib/gitlab/metrics/requests_rack_middleware_spec.rb + - spec/lib/gitlab/metrics/samplers/database_sampler_spec.rb + - spec/lib/gitlab/metrics/samplers/puma_sampler_spec.rb + - spec/lib/gitlab/metrics/samplers/ruby_sampler_spec.rb + - spec/lib/gitlab/metrics/sli_spec.rb + - spec/lib/gitlab/metrics/subscribers/action_cable_spec.rb + - spec/lib/gitlab/metrics/subscribers/action_view_spec.rb + - spec/lib/gitlab/metrics/subscribers/active_record_spec.rb + - spec/lib/gitlab/metrics/subscribers/external_http_spec.rb + - spec/lib/gitlab/metrics/subscribers/load_balancing_spec.rb + - spec/lib/gitlab/metrics/subscribers/rack_attack_spec.rb + - spec/lib/gitlab/metrics/subscribers/rails_cache_spec.rb + - spec/lib/gitlab/metrics/web_transaction_spec.rb + - spec/lib/gitlab/middleware/basic_health_check_spec.rb + - spec/lib/gitlab/middleware/compressed_json_spec.rb + - spec/lib/gitlab/middleware/go_spec.rb + - spec/lib/gitlab/middleware/handle_malformed_strings_spec.rb + - spec/lib/gitlab/middleware/multipart_spec.rb + - spec/lib/gitlab/middleware/query_analyzer_spec.rb + - spec/lib/gitlab/middleware/rails_queue_duration_spec.rb + - spec/lib/gitlab/middleware/release_env_spec.rb + - spec/lib/gitlab/middleware/sidekiq_web_static_spec.rb + - spec/lib/gitlab/middleware/speedscope_spec.rb + - spec/lib/gitlab/middleware/webhook_recursion_detection_spec.rb + - spec/lib/gitlab/octokit/middleware_spec.rb + - spec/lib/gitlab/optimistic_locking_spec.rb + - spec/lib/gitlab/pages/settings_spec.rb + - spec/lib/gitlab/pagination/cursor_based_keyset_spec.rb + - spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb + - spec/lib/gitlab/pagination/keyset/cursor_based_request_context_spec.rb + - spec/lib/gitlab/pagination/keyset/cursor_pager_spec.rb + - spec/lib/gitlab/pagination/keyset/pager_spec.rb + - spec/lib/gitlab/pagination/keyset/request_context_spec.rb + - spec/lib/gitlab/pagination/keyset_spec.rb + - spec/lib/gitlab/pagination/offset_header_builder_spec.rb + - spec/lib/gitlab/pagination/offset_pagination_spec.rb + - spec/lib/gitlab/performance_bar/stats_spec.rb + - spec/lib/gitlab/phabricator_import/conduit/maniphest_spec.rb + - spec/lib/gitlab/phabricator_import/conduit/response_spec.rb + - spec/lib/gitlab/phabricator_import/conduit/user_spec.rb + - spec/lib/gitlab/polling_interval_spec.rb + - spec/lib/gitlab/popen/runner_spec.rb + - spec/lib/gitlab/process_management_spec.rb + - spec/lib/gitlab/profiler_spec.rb + - spec/lib/gitlab/prometheus/adapter_spec.rb + - spec/lib/gitlab/prometheus/queries/deployment_query_spec.rb + - spec/lib/gitlab/prometheus/queries/knative_invocation_query_spec.rb + - spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb + - spec/lib/gitlab/query_limiting/middleware_spec.rb + - spec/lib/gitlab/quick_actions/dsl_spec.rb + - spec/lib/gitlab/repository_cache_spec.rb + - spec/lib/gitlab/routing_spec.rb + - spec/lib/gitlab/runtime_spec.rb + - spec/lib/gitlab/sanitizers/svg_spec.rb + - spec/lib/gitlab/search/abuse_validators/no_abusive_coercion_from_string_validator_spec.rb + - spec/lib/gitlab/search/abuse_validators/no_abusive_term_length_validator_spec.rb + - spec/lib/gitlab/serializer/pagination_spec.rb + - spec/lib/gitlab/sidekiq_config/cli_methods_spec.rb + - spec/lib/gitlab/sidekiq_config/worker_spec.rb + - spec/lib/gitlab/sidekiq_middleware/client_metrics_spec.rb + - spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb + - spec/lib/gitlab/sidekiq_middleware/query_analyzer_spec.rb + - spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb + - spec/lib/gitlab/sidekiq_middleware_spec.rb + - spec/lib/gitlab/sidekiq_status/client_middleware_spec.rb + - spec/lib/gitlab/sidekiq_status/server_middleware_spec.rb + - spec/lib/gitlab/slash_commands/command_spec.rb + - spec/lib/gitlab/slash_commands/deploy_spec.rb + - spec/lib/gitlab/slash_commands/issue_close_spec.rb + - spec/lib/gitlab/slash_commands/issue_comment_spec.rb + - spec/lib/gitlab/slash_commands/issue_new_spec.rb + - spec/lib/gitlab/slash_commands/issue_search_spec.rb + - spec/lib/gitlab/slash_commands/issue_show_spec.rb + - spec/lib/gitlab/slash_commands/presenters/run_spec.rb + - spec/lib/gitlab/slash_commands/run_spec.rb + - spec/lib/gitlab/spamcheck/client_spec.rb + - spec/lib/gitlab/submodule_links_spec.rb + - spec/lib/gitlab/suggestions/file_suggestion_spec.rb + - spec/lib/gitlab/tab_width_spec.rb + - spec/lib/gitlab/themes_spec.rb + - spec/lib/gitlab/tracking_spec.rb + - spec/lib/gitlab/usage/metric_spec.rb + - spec/lib/gitlab/usage/metrics/instrumentations/database_metric_spec.rb + - spec/lib/gitlab/usage/service_ping/payload_keys_processor_spec.rb + - spec/lib/gitlab/usage_data_counters/merge_request_activity_unique_counter_spec.rb + - spec/lib/gitlab/usage_data_spec.rb + - spec/lib/gitlab/utils/usage_data_spec.rb + - spec/lib/gitlab/verify/job_artifacts_spec.rb + - spec/lib/gitlab/verify/lfs_objects_spec.rb + - spec/lib/gitlab/verify/uploads_spec.rb + - spec/lib/gitlab/view/presenter/base_spec.rb + - spec/lib/gitlab/view/presenter/delegated_spec.rb + - spec/lib/gitlab/view/presenter/simple_spec.rb + - spec/lib/gitlab/workhorse_spec.rb + - spec/lib/gitlab_edition_spec.rb + - spec/lib/gitlab_spec.rb + - spec/lib/google_api/cloud_platform/client_spec.rb + - spec/lib/peek/views/active_record_spec.rb + - spec/lib/peek/views/bullet_detailed_spec.rb + - spec/lib/peek/views/external_http_spec.rb + - spec/lib/safe_zip/entry_spec.rb + - spec/lib/serializers/unsafe_json_spec.rb + - spec/lib/sidebars/projects/menus/analytics_menu_spec.rb + - spec/mailers/emails/service_desk_spec.rb + - spec/mailers/notify_spec.rb + - spec/metrics_server/metrics_server_spec.rb + - spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb + - spec/models/active_session_spec.rb + - spec/models/application_record_spec.rb + - spec/models/badge_spec.rb + - spec/models/badges/project_badge_spec.rb + - spec/models/bulk_imports/export_status_spec.rb + - spec/models/ci/build_spec.rb + - spec/models/ci/build_trace_chunk_spec.rb + - spec/models/ci/commit_with_pipeline_spec.rb + - spec/models/ci/group_spec.rb + - spec/models/ci/pipeline_spec.rb + - spec/models/clusters/applications/runner_spec.rb + - spec/models/clusters/cluster_spec.rb + - spec/models/clusters/platforms/kubernetes_spec.rb + - spec/models/commit_signatures/gpg_signature_spec.rb + - spec/models/commit_spec.rb + - spec/models/commit_status_spec.rb + - spec/models/concerns/atomic_internal_id_spec.rb + - spec/models/concerns/legacy_bulk_insert_spec.rb + - spec/models/concerns/prometheus_adapter_spec.rb + - spec/models/concerns/sha256_attribute_spec.rb + - spec/models/concerns/sha_attribute_spec.rb + - spec/models/concerns/token_authenticatable_strategies/base_spec.rb + - spec/models/concerns/token_authenticatable_strategies/encrypted_spec.rb + - spec/models/concerns/triggerable_hooks_spec.rb + - spec/models/concerns/x509_serial_number_attribute_spec.rb + - spec/models/design_management/design_action_spec.rb + - spec/models/design_management/design_at_version_spec.rb + - spec/models/diff_viewer/image_spec.rb + - spec/models/environment_spec.rb + - spec/models/error_tracking/project_error_tracking_setting_spec.rb + - spec/models/event_spec.rb + - spec/models/external_issue_spec.rb + - spec/models/hooks/web_hook_spec.rb + - spec/models/integrations/asana_spec.rb + - spec/models/integrations/chat_message/pipeline_message_spec.rb + - spec/models/integrations/jira_spec.rb + - spec/models/integrations/microsoft_teams_spec.rb + - spec/models/integrations/pipelines_email_spec.rb + - spec/models/issue_spec.rb + - spec/models/key_spec.rb + - spec/models/merge_request_diff_commit_spec.rb + - spec/models/merge_request_spec.rb + - spec/models/packages/package_spec.rb + - spec/models/plan_limits_spec.rb + - spec/models/project_import_state_spec.rb + - spec/models/project_spec.rb + - spec/models/ref_matcher_spec.rb + - spec/models/release_highlight_spec.rb + - spec/models/repository_spec.rb + - spec/models/shard_spec.rb + - spec/models/snippet_spec.rb + - spec/models/ssh_host_key_spec.rb + - spec/models/upload_spec.rb + - spec/models/user_spec.rb + - spec/policies/ci/bridge_policy_spec.rb + - spec/presenters/ci/build_presenter_spec.rb + - spec/presenters/ci/pipeline_artifacts/code_quality_mr_diff_presenter_spec.rb + - spec/presenters/group_member_presenter_spec.rb + - spec/presenters/merge_request_presenter_spec.rb + - spec/presenters/packages/nuget/search_results_presenter_spec.rb + - spec/presenters/project_member_presenter_spec.rb + - spec/presenters/project_presenter_spec.rb + - spec/requests/api/avatar_spec.rb + - spec/requests/api/container_registry_event_spec.rb + - spec/requests/api/graphql/mutations/design_management/delete_spec.rb + - spec/requests/api/graphql/mutations/snippets/create_spec.rb + - spec/requests/api/graphql/project/cluster_agents_spec.rb + - spec/requests/api/graphql/project/pipeline_spec.rb + - spec/requests/api/helpers_spec.rb + - spec/requests/api/import_bitbucket_server_spec.rb + - spec/requests/api/import_github_spec.rb + - spec/requests/api/internal/base_spec.rb + - spec/requests/api/maven_packages_spec.rb + - spec/requests/api/project_container_repositories_spec.rb + - spec/requests/api/users_preferences_spec.rb + - spec/requests/jwt_controller_spec.rb + - spec/requests/whats_new_controller_spec.rb + - spec/rubocop/migration_helpers_spec.rb + - spec/scripts/setup/find_jh_branch_spec.rb + - spec/serializers/accessibility_reports_comparer_serializer_spec.rb + - spec/serializers/admin/user_entity_spec.rb + - spec/serializers/base_discussion_entity_spec.rb + - spec/serializers/build_action_entity_spec.rb + - spec/serializers/build_details_entity_spec.rb + - spec/serializers/build_trace_entity_spec.rb + - spec/serializers/ci/dag_job_entity_spec.rb + - spec/serializers/ci/dag_job_group_entity_spec.rb + - spec/serializers/ci/dag_pipeline_entity_spec.rb + - spec/serializers/ci/dag_stage_entity_spec.rb + - spec/serializers/ci/daily_build_group_report_result_entity_spec.rb + - spec/serializers/ci/daily_build_group_report_result_serializer_spec.rb + - spec/serializers/ci/job_entity_spec.rb + - spec/serializers/ci/job_serializer_spec.rb + - spec/serializers/ci/pipeline_entity_spec.rb + - spec/serializers/codequality_reports_comparer_serializer_spec.rb + - spec/serializers/commit_entity_spec.rb + - spec/serializers/container_repositories_serializer_spec.rb + - spec/serializers/container_repository_entity_spec.rb + - spec/serializers/container_tag_entity_spec.rb + - spec/serializers/deployment_cluster_entity_spec.rb + - spec/serializers/deployment_entity_spec.rb + - spec/serializers/detailed_status_entity_spec.rb + - spec/serializers/diff_file_entity_spec.rb + - spec/serializers/diffs_entity_spec.rb + - spec/serializers/diffs_metadata_entity_spec.rb + - spec/serializers/discussion_entity_spec.rb + - spec/serializers/environment_entity_spec.rb + - spec/serializers/environment_serializer_spec.rb + - spec/serializers/environment_status_entity_spec.rb + - spec/serializers/feature_flag_entity_spec.rb + - spec/serializers/feature_flag_summary_entity_spec.rb + - spec/serializers/group_child_entity_spec.rb + - spec/serializers/group_child_serializer_spec.rb + - spec/serializers/import/manifest_provider_repo_entity_spec.rb + - spec/serializers/issuable_sidebar_extras_entity_spec.rb + - spec/serializers/issue_board_entity_spec.rb + - spec/serializers/issue_entity_spec.rb + - spec/serializers/lfs_file_lock_entity_spec.rb + - spec/serializers/linked_project_issue_entity_spec.rb + - spec/serializers/merge_request_poll_cached_widget_entity_spec.rb + - spec/serializers/merge_request_poll_widget_entity_spec.rb + - spec/serializers/merge_request_sidebar_basic_entity_spec.rb + - spec/serializers/merge_request_sidebar_extras_entity_spec.rb + - spec/serializers/merge_request_widget_commit_entity_spec.rb + - spec/serializers/merge_request_widget_entity_spec.rb + - spec/serializers/merge_requests/pipeline_entity_spec.rb + - spec/serializers/note_entity_spec.rb + - spec/serializers/paginated_diff_entity_spec.rb + - spec/serializers/pipeline_details_entity_spec.rb + - spec/serializers/pipeline_serializer_spec.rb + - spec/serializers/project_note_entity_spec.rb + - spec/serializers/prometheus_alert_entity_spec.rb + - spec/serializers/review_app_setup_entity_spec.rb + - spec/serializers/runner_entity_spec.rb + - spec/serializers/service_event_entity_spec.rb + - spec/serializers/service_field_entity_spec.rb + - spec/serializers/stage_entity_spec.rb + - spec/serializers/suggestion_entity_spec.rb + - spec/serializers/test_reports_comparer_serializer_spec.rb + - spec/serializers/test_suite_entity_spec.rb + - spec/serializers/trigger_variable_entity_spec.rb + - spec/services/access_token_validation_service_spec.rb + - spec/services/authorized_project_update/find_records_due_for_refresh_service_spec.rb + - spec/services/award_emojis/toggle_service_spec.rb + - spec/services/base_count_service_spec.rb + - spec/services/bulk_imports/file_download_service_spec.rb + - spec/services/ci/change_variables_service_spec.rb + - spec/services/ci/create_pipeline_service_spec.rb + - spec/services/ci/pipeline_creation/start_pipeline_service_spec.rb + - spec/services/ci/prepare_build_service_spec.rb + - spec/services/ci/process_pipeline_service_spec.rb + - spec/services/ci/register_job_service_spec.rb + - spec/services/ci/test_failure_history_service_spec.rb + - spec/services/ci/update_build_queue_service_spec.rb + - spec/services/ci/update_build_state_service_spec.rb + - spec/services/clusters/applications/check_ingress_ip_address_service_spec.rb + - spec/services/clusters/applications/create_service_spec.rb + - spec/services/clusters/applications/prometheus_update_service_spec.rb + - spec/services/clusters/applications/update_service_spec.rb + - spec/services/clusters/aws/finalize_creation_service_spec.rb + - spec/services/clusters/aws/provision_service_spec.rb + - spec/services/clusters/aws/verify_provision_status_service_spec.rb + - spec/services/clusters/build_kubernetes_namespace_service_spec.rb + - spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb + - spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb + - spec/services/container_expiration_policies/cleanup_service_spec.rb + - spec/services/deployments/create_service_spec.rb + - spec/services/discussions/capture_diff_note_position_service_spec.rb + - spec/services/error_tracking/base_service_spec.rb + - spec/services/error_tracking/issue_update_service_spec.rb + - spec/services/event_create_service_spec.rb + - spec/services/git/base_hooks_service_spec.rb + - spec/services/git/process_ref_changes_service_spec.rb + - spec/services/git/wiki_push_service/change_spec.rb + - spec/services/ide/schemas_config_service_spec.rb + - spec/services/import/bitbucket_server_service_spec.rb + - spec/services/import/github_service_spec.rb + - spec/services/import/gitlab_projects/create_project_from_remote_file_service_spec.rb + - spec/services/issues/create_service_spec.rb + - spec/services/issues/related_branches_service_spec.rb + - spec/services/jira_connect_subscriptions/create_service_spec.rb + - spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb + - spec/services/merge_requests/approval_service_spec.rb + - spec/services/merge_requests/build_service_spec.rb + - spec/services/merge_requests/close_service_spec.rb + - spec/services/merge_requests/merge_service_spec.rb + - spec/services/merge_requests/post_merge_service_spec.rb + - spec/services/merge_requests/refresh_service_spec.rb + - spec/services/merge_requests/reopen_service_spec.rb + - spec/services/merge_requests/request_review_service_spec.rb + - spec/services/merge_requests/toggle_attention_requested_service_spec.rb + - spec/services/metrics/dashboard/clone_dashboard_service_spec.rb + - spec/services/metrics/dashboard/update_dashboard_service_spec.rb + - spec/services/metrics/users_starred_dashboards/create_service_spec.rb + - spec/services/milestones/update_service_spec.rb + - spec/services/namespaces/in_product_marketing_emails_service_spec.rb + - spec/services/namespaces/invite_team_email_service_spec.rb + - spec/services/notes/create_service_spec.rb + - spec/services/notes/render_service_spec.rb + - spec/services/notification_service_spec.rb + - spec/services/packages/generic/create_package_file_service_spec.rb + - spec/services/packages/maven/find_or_create_package_service_spec.rb + - spec/services/packages/maven/metadata/sync_service_spec.rb + - spec/services/packages/nuget/metadata_extraction_service_spec.rb + - spec/services/pages/zip_directory_service_spec.rb + - spec/services/post_receive_service_spec.rb + - spec/services/projects/after_import_service_spec.rb + - spec/services/projects/branches_by_mode_service_spec.rb + - spec/services/projects/create_service_spec.rb + - spec/services/projects/destroy_service_spec.rb + - spec/services/projects/import_service_spec.rb + - spec/services/projects/operations/update_service_spec.rb + - spec/services/projects/overwrite_project_service_spec.rb + - spec/services/projects/update_pages_service_spec.rb + - spec/services/projects/update_remote_mirror_service_spec.rb + - spec/services/projects/update_repository_storage_service_spec.rb + - spec/services/projects/update_service_spec.rb + - spec/services/repositories/changelog_service_spec.rb + - spec/services/search_service_spec.rb + - spec/services/service_ping/build_payload_service_spec.rb + - spec/services/service_ping/permit_data_categories_service_spec.rb + - spec/services/service_ping/service_ping_settings_spec.rb + - spec/services/service_ping/submit_service_ping_service_spec.rb + - spec/services/snippets/update_repository_storage_service_spec.rb + - spec/services/spam/akismet_mark_as_spam_service_spec.rb + - spec/services/spam/akismet_service_spec.rb + - spec/services/spam/ham_service_spec.rb + - spec/services/spam/spam_action_service_spec.rb + - spec/services/spam/spam_params_spec.rb + - spec/services/static_site_editor/config_service_spec.rb + - spec/services/system_note_service_spec.rb + - spec/services/system_notes/commit_service_spec.rb + - spec/services/system_notes/issuables_service_spec.rb + - spec/services/update_merge_request_metrics_service_spec.rb + - spec/services/users/activity_service_spec.rb + - spec/services/users/create_service_spec.rb + - spec/services/users/refresh_authorized_projects_service_spec.rb + - spec/services/users/update_service_spec.rb + - spec/services/web_hook_service_spec.rb + - spec/services/wiki_pages/base_service_spec.rb + - spec/spam/concerns/has_spam_action_response_fields_spec.rb + - spec/support/helpers/graphql_helpers.rb + - spec/support/helpers/import_spec_helper.rb + - spec/support/helpers/ldap_helpers.rb + - spec/support/helpers/project_forks_helper.rb + - spec/support/helpers/stub_metrics.rb + - spec/support/helpers/stub_spam_services.rb + - spec/support/import_export/common_util.rb + - spec/support/prometheus/additional_metrics_shared_examples.rb + - spec/support/shared_contexts/lib/gitlab/sidekiq_middleware/server_metrics_shared_context.rb + - spec/support/shared_contexts/services/projects/container_repository/delete_tags_service_shared_context.rb + - spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb + - spec/support/shared_examples/controllers/snippets_sort_order_shared_examples.rb + - spec/support/shared_examples/graphql/mutations/http_integrations_shared_examples.rb + - spec/support/shared_examples/lib/gitlab/config/inheritable_shared_examples.rb + - spec/support/shared_examples/lib/gitlab/diff_file_collections_shared_examples.rb + - spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb + - spec/support/shared_examples/metrics/sampler_shared_examples.rb + - spec/support/shared_examples/models/chat_integration_shared_examples.rb + - spec/support/shared_examples/models/concerns/integrations/slack_mattermost_notifier_shared_examples.rb + - spec/support/shared_examples/models/members_notifications_shared_example.rb + - spec/support/shared_examples/models/project_ci_cd_settings_shared_examples.rb + - spec/support/shared_examples/namespaces/hierarchy_examples.rb + - spec/support/shared_examples/requests/api/composer_packages_shared_examples.rb + - spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb + - spec/support/shared_examples/requests/api/debian_common_shared_examples.rb + - spec/support/shared_examples/requests/api/nuget_endpoints_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/rack_attack_shared_examples.rb + - spec/support/shared_examples/serializers/diff_file_entity_shared_examples.rb + - spec/support/shared_examples/serializers/environment_serializer_shared_examples.rb + - spec/support/shared_examples/services/alert_management/alert_processing/alert_firing_shared_examples.rb + - spec/support/shared_examples/services/alert_management/alert_processing/notifications_shared_examples.rb + - spec/support/shared_examples/services/alert_management_shared_examples.rb + - spec/support/shared_examples/services/boards/issues_move_service_shared_examples.rb + - spec/support/shared_examples/services/check_ingress_ip_address_service_shared_examples.rb + - spec/support/shared_examples/services/jira/requests/base_shared_examples.rb + - spec/support/shared_examples/services/metrics/dashboard_shared_examples.rb + - spec/support/shared_examples/services/projects/update_repository_storage_service_shared_examples.rb + - spec/support/shared_examples/services/resource_events/synthetic_notes_builder_shared_examples.rb + - spec/support/shared_examples/workers/background_migration_worker_shared_examples.rb + - spec/support/shared_examples/workers/update_repository_move_shared_examples.rb + - spec/tasks/gettext_rake_spec.rb + - spec/tasks/gitlab/background_migrations_rake_spec.rb + - spec/tasks/gitlab/check_rake_spec.rb + - spec/tasks/gitlab/cleanup_rake_spec.rb + - spec/tasks/gitlab/db_rake_spec.rb + - spec/tasks/gitlab/packages/events_rake_spec.rb + - spec/tasks/gitlab/setup_rake_spec.rb + - spec/tooling/danger/project_helper_spec.rb + - spec/tooling/danger/specs_spec.rb + - spec/tooling/lib/tooling/helm3_client_spec.rb + - spec/tooling/lib/tooling/kubernetes_client_spec.rb + - spec/tooling/rspec_flaky/example_spec.rb + - spec/tooling/rspec_flaky/listener_spec.rb + - spec/uploaders/file_uploader_spec.rb + - spec/uploaders/object_storage_spec.rb + - spec/uploaders/personal_file_uploader_spec.rb + - spec/uploaders/records_uploads_spec.rb + - spec/views/projects/issues/show.html.haml_spec.rb + - spec/views/shared/milestones/_issuables.html.haml_spec.rb + - spec/views/shared/wikis/_sidebar.html.haml_spec.rb + - spec/workers/bulk_imports/export_request_worker_spec.rb + - spec/workers/bulk_imports/pipeline_worker_spec.rb + - spec/workers/chat_notification_worker_spec.rb + - spec/workers/ci/build_prepare_worker_spec.rb + - spec/workers/ci/create_cross_project_pipeline_worker_spec.rb + - spec/workers/ci/create_downstream_pipeline_worker_spec.rb + - spec/workers/ci/pipeline_bridge_status_worker_spec.rb + - spec/workers/ci/pipeline_success_unlock_artifacts_worker_spec.rb + - spec/workers/ci/ref_delete_unlock_artifacts_worker_spec.rb + - spec/workers/clusters/agents/delete_expired_events_worker_spec.rb + - spec/workers/concerns/application_worker_spec.rb + - spec/workers/concerns/gitlab/github_import/object_importer_spec.rb + - spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb + - spec/workers/container_expiration_policies/cleanup_container_repository_worker_spec.rb + - spec/workers/create_commit_signature_worker_spec.rb + - spec/workers/environments/auto_stop_worker_spec.rb + - spec/workers/error_tracking_issue_link_worker_spec.rb + - spec/workers/gitlab/github_import/advance_stage_worker_spec.rb + - spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb + - spec/workers/gitlab/github_import/import_issue_worker_spec.rb + - spec/workers/gitlab/github_import/import_note_worker_spec.rb + - spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb + - spec/workers/gitlab/github_import/stage/finish_import_worker_spec.rb + - spec/workers/gitlab/github_import/stage/import_base_data_worker_spec.rb + - spec/workers/gitlab/github_import/stage/import_issues_and_diff_notes_worker_spec.rb + - spec/workers/gitlab/github_import/stage/import_lfs_objects_worker_spec.rb + - spec/workers/gitlab/github_import/stage/import_notes_worker_spec.rb + - spec/workers/gitlab/github_import/stage/import_pull_requests_merged_by_worker_spec.rb + - spec/workers/gitlab/github_import/stage/import_pull_requests_reviews_worker_spec.rb + - spec/workers/gitlab/github_import/stage/import_pull_requests_worker_spec.rb + - spec/workers/gitlab/github_import/stage/import_repository_worker_spec.rb + - spec/workers/gitlab_performance_bar_stats_worker_spec.rb + - spec/workers/invalid_gpg_signature_update_worker_spec.rb + - spec/workers/irker_worker_spec.rb + - spec/workers/issue_rebalancing_worker_spec.rb + - spec/workers/issues/rebalancing_worker_spec.rb + - spec/workers/merge_request_mergeability_check_worker_spec.rb + - spec/workers/new_issue_worker_spec.rb + - spec/workers/new_merge_request_worker_spec.rb + - spec/workers/pages_domain_ssl_renewal_worker_spec.rb + - spec/workers/pages_domain_verification_worker_spec.rb + - spec/workers/post_receive_spec.rb + - spec/workers/project_cache_worker_spec.rb + - spec/workers/propagate_integration_group_worker_spec.rb + - spec/workers/propagate_integration_inherit_descendant_worker_spec.rb + - spec/workers/propagate_integration_inherit_worker_spec.rb + - spec/workers/propagate_integration_project_worker_spec.rb + - spec/workers/purge_dependency_proxy_cache_worker_spec.rb + - spec/workers/repository_import_worker_spec.rb + - spec/workers/system_hook_push_worker_spec.rb + - diff --git a/.rubocop_todo/style/open_struct_use.yml b/.rubocop_todo/style/open_struct_use.yml index 80239770db..c459ea9d49 100644 --- a/.rubocop_todo/style/open_struct_use.yml +++ b/.rubocop_todo/style/open_struct_use.yml @@ -21,7 +21,6 @@ Style/OpenStructUse: - spec/graphql/mutations/commits/create_spec.rb - spec/helpers/application_settings_helper_spec.rb - spec/helpers/profiles_helper_spec.rb - - spec/lib/gitlab/auth/o_auth/provider_spec.rb - spec/lib/gitlab/gitaly_client/blobs_stitcher_spec.rb - spec/lib/gitlab/gitaly_client/diff_stitcher_spec.rb - spec/lib/gitlab/legacy_github_import/project_creator_spec.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index d76689211a..bbaa5af86f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,50 +2,661 @@ documentation](doc/development/changelog.md) for instructions on adding your own entry. -## 14.8.6 (2022-04-29) +## 14.9.4 (2022-04-29) -### Security (14 changes) +### Security (15 changes) -- [Update Import/Export merge/push access levels & exclude ci config path](gitlab-org/security/gitlab@abfa8d4c128316b1ba095ff8eda7e86018e47caf) ([merge request](gitlab-org/security/gitlab!2372)) -- [Prevent maintainers from editing PipelineSchedule](gitlab-org/security/gitlab@761a7777cb480d02b9c3418aa7317eba7c0eaff1) ([merge request](gitlab-org/security/gitlab!2423)) -- [Add validation to pypi file sha256 values](gitlab-org/security/gitlab@712cc01aee2be4b6a9847746a080f190041367d5) ([merge request](gitlab-org/security/gitlab!2417)) -- [Conan Token uses PAT rather than ID in payload](gitlab-org/security/gitlab@ba3070c90dd1b575982df22c256b0e3f97a9e919) ([merge request](gitlab-org/security/gitlab!2346)) -- [[security] Fix markdown API disclosing issue titles of limited projects](gitlab-org/security/gitlab@fd3cb263e8f165a4a1a7894c08ddf254f9cf1e92) ([merge request](gitlab-org/security/gitlab!2405)) -- [Verify that mentioned user can read TODO's note](gitlab-org/security/gitlab@e54be58cc79011d7c79dae94b993774ab36ef232) ([merge request](gitlab-org/security/gitlab!2398)) -- [Invalidate markdown cache to clear up stored XSS](gitlab-org/security/gitlab@160cdda98c80e052abbb4bec226ad63fe9c9e403) ([merge request](gitlab-org/security/gitlab!2420)) -- [Allow rate limiting of deploy tokens](gitlab-org/security/gitlab@78f7ee3d7e1258375ddcea3a20e3798092e89d41) ([merge request](gitlab-org/security/gitlab!2385)) -- [Add suffix to cache name to add isolation](gitlab-org/security/gitlab@184d49640f5dcc4ac1522c874a7b5e0c16d2e05f) ([merge request](gitlab-org/security/gitlab!2373)) -- [Disable wiki access with CI_JOB_TOKEN when improper access level](gitlab-org/security/gitlab@db93d134394675a4335c92557a55ac4381ed303f) ([merge request](gitlab-org/security/gitlab!2391)) -- [Sanitize error input to prevent HTML/CSS injection in messages](gitlab-org/security/gitlab@333dd602091810639912702c80034468ff6f8aa0) ([merge request](gitlab-org/security/gitlab!2378)) -- [Secure debug trace artifact download](gitlab-org/security/gitlab@266d812ba2e8e9936269323465c867983e3a2ebf) ([merge request](gitlab-org/security/gitlab!2367)) -- [Use password type for all secret integration properties](gitlab-org/security/gitlab@eda2b8f02b34ead354ef07b9e41be006cf90f51b) ([merge request](gitlab-org/security/gitlab!2411)) -- [Limit CI job group_name regexp](gitlab-org/security/gitlab@03ab6e9f312fb6fe50a6361f7bc78d527b223b96) ([merge request](gitlab-org/security/gitlab!2381)) +- [Fixes infinite loop when rendering Ipynb Diffs](gitlab-org/security/gitlab@9836b8e3873e1390e1f6746a1039749c312739b5) ([merge request](gitlab-org/security/gitlab!2401)) +- [Update Import/Export merge/push access levels & exclude ci config path](gitlab-org/security/gitlab@8a27e1e56e965d6b69545a2efb4f55f20cc57b2e) ([merge request](gitlab-org/security/gitlab!2371)) +- [Prevent maintainers from editing PipelineSchedule](gitlab-org/security/gitlab@ee86557a26d0c3f8a983a6f20384f6b778d4ab0b) ([merge request](gitlab-org/security/gitlab!2422)) +- [Add validation to pypi file sha256 values](gitlab-org/security/gitlab@7f78a6b9060745d9fea7f7dc71d4cf090b8e9ab5) ([merge request](gitlab-org/security/gitlab!2416)) +- [Conan Token uses PAT rather than ID in payload](gitlab-org/security/gitlab@574b7397e4b32630276cf1e5896ad4a72e82f02b) ([merge request](gitlab-org/security/gitlab!2345)) +- [[security] Fix markdown API disclosing issue titles of limited projects](gitlab-org/security/gitlab@ff61b763d040ece83387eb7c0f70d0d97aafbd66) ([merge request](gitlab-org/security/gitlab!2406)) +- [Verify that mentioned user can read TODO's note](gitlab-org/security/gitlab@7771534e395f9f433cafa9984cbeeebf86a2d797) ([merge request](gitlab-org/security/gitlab!2396)) +- [Invalidate markdown cache to clear up stored XSS](gitlab-org/security/gitlab@0768d53609d530bee4ef118a929bdd7ac6cbd5de) ([merge request](gitlab-org/security/gitlab!2419)) +- [Allow rate limiting of deploy tokens](gitlab-org/security/gitlab@8738e74dbecece0e0fcdaf5df1323437db77b947) ([merge request](gitlab-org/security/gitlab!2384)) +- [Add suffix to cache name to add isolation](gitlab-org/security/gitlab@d722e72125ded23ea4fd0eeeb775576f7cdd7181) ([merge request](gitlab-org/security/gitlab!2374)) +- [Disable wiki access with CI_JOB_TOKEN when improper access level](gitlab-org/security/gitlab@13524db78a32d13e4081a30cc0db9215c404b435) ([merge request](gitlab-org/security/gitlab!2390)) +- [Sanitize error input to prevent HTML/CSS injection in messages](gitlab-org/security/gitlab@a83683c13f7a0a8af94a88562f5904bfcb1b58e0) ([merge request](gitlab-org/security/gitlab!2377)) +- [Secure debug trace artifact download](gitlab-org/security/gitlab@811ce49adeddb56de0a1ca26652017197fe1b97a) ([merge request](gitlab-org/security/gitlab!2366)) +- [Use password type for all secret integration properties](gitlab-org/security/gitlab@f38cec8b26fa0e33da9247af9e8c53c01e6ec0c6) ([merge request](gitlab-org/security/gitlab!2410)) +- [Limit CI job group_name regexp](gitlab-org/security/gitlab@5a08c0b9dff4518dff91990eecae0ab76c5cf4ed) ([merge request](gitlab-org/security/gitlab!2380)) -## 14.8.5 (2022-03-31) +## 14.9.3 (2022-04-12) -### Security (21 changes) +### Fixed (4 changes) -- [Update to commonmarker 0.23.4](gitlab-org/security/gitlab@51532ccc5f1b6b053d4ca6c54496607e62f8f25c) ([merge request](gitlab-org/security/gitlab!2282)) -- [Revert merge request approval groups behavior](gitlab-org/security/gitlab@dd9724e429033974da6c3852dc6fd33f0f2b0a46) ([merge request](gitlab-org/security/gitlab!2334)) -- [Disallow login if password matches a fixed list](gitlab-org/security/gitlab@6779d5f2948425a7ad7f19a6e10f82cc10b80989) ([merge request](gitlab-org/security/gitlab!2358)) -- [Update devise-two-factor to 4.0.2](gitlab-org/security/gitlab@0329d2d82a9064c0bae36e7b993ee40df7c999bc) ([merge request](gitlab-org/security/gitlab!2350)) -- [Limit the number of tags associated with a CI runner](gitlab-org/security/gitlab@8d5938c08fe66c22f1bc54ff76cc9daf2de86b1a) ([merge request](gitlab-org/security/gitlab!2302)) -- [GitLab Pages Security Updates for 14.9](gitlab-org/security/gitlab@5a5a862c8a9e37ca2ea84133f92b216eaa7cd148) ([merge request](gitlab-org/security/gitlab!2328)) -- [Upgrade swagger-ui dependency](gitlab-org/security/gitlab@afcb570867db61347bb6a4e243bb2557340191be) ([merge request](gitlab-org/security/gitlab!2337)) -- [Modify release link format check to avoid regex if string is too long](gitlab-org/security/gitlab@a3ab0ff9c470c1c6e5b4fd055ddd02dffce32652) ([merge request](gitlab-org/security/gitlab!2243)) -- [Masks variables in error messages](gitlab-org/security/gitlab@94236bbdb8eef6600562bdc4e242e07eaed8c50f) ([merge request](gitlab-org/security/gitlab!2291)) -- [Escape user provided string to prevent XSS](gitlab-org/security/gitlab@03e695d4c34546582b503b3f7712246206b56b99) ([merge request](gitlab-org/security/gitlab!2314)) -- [Monkey patch of RDoc to prevent Ruby segfault](gitlab-org/security/gitlab@14eec4487387bc0c999f1c48b046a3ed3848c5a1) ([merge request](gitlab-org/security/gitlab!2232)) -- [Project import maps members' created_by_id users based on source user ID](gitlab-org/security/gitlab@7fd7ab3f57e8d8b4e0aed42aebe9a8b7436a6255) ([merge request](gitlab-org/security/gitlab!2238)) -- [Redact InvalidURIError error messages](gitlab-org/security/gitlab@0592c182bfd60aee501c4c66f47a71c9469f2bcd) ([merge request](gitlab-org/security/gitlab!2296)) -- [Fix access for approval rules API](gitlab-org/security/gitlab@987e06bacba224519adf94cda73b5a8b2e7b917a) ([merge request](gitlab-org/security/gitlab!2323)) -- [Fix kroki exploit](gitlab-org/security/gitlab@bf056c683af25ec4b94c0efa7166eea399ed6502) ([merge request](gitlab-org/security/gitlab!2277)) -- [Fix blind SSRF when looking up SSH host keys for mirroring](gitlab-org/security/gitlab@3c853a32a73aba15e309d05111b744455a360cca) ([merge request](gitlab-org/security/gitlab!2310)) -- [Escape original content in reference redactor](gitlab-org/security/gitlab@00ee99bc3834d9d59572272064c9ad6abeae5975) ([merge request](gitlab-org/security/gitlab!2318)) -- [Security fix for CI/CD analytics visibility](gitlab-org/security/gitlab@691d69be77ae3c8e0a2598b75ccf336b672fd540) ([merge request](gitlab-org/security/gitlab!2273)) -- [Latest commit exposed through fork of a private project](gitlab-org/security/gitlab@6ca7a3b040edac06b23a697bfc2bf46f457d6b81) ([merge request](gitlab-org/security/gitlab!2271)) -- [Fix Asana integration restricted branch filter](gitlab-org/security/gitlab@4c1db692b4e99fab6cdbb818cf02fb879f6d4886) ([merge request](gitlab-org/security/gitlab!2218)) -- [Revert "JH need more complex passwords"](gitlab-org/security/gitlab@919aa2b28645d49fb71508362a0c61da39893c69) ([merge request](gitlab-org/security/gitlab!2353)) +- [Revert Protected Environment group access inheritence](gitlab-org/gitlab@488fd8f3f6770eebae10c815398534ff41d57546) ([merge request](gitlab-org/gitlab!84664)) +- [Fix URL blocker when object storage enabled but type is disabled](gitlab-org/gitlab@d0da89768774de9cf635af530ed7386e65f92d40) ([merge request](gitlab-org/gitlab!84664)) +- [Remove pending builds from the queue on conflict](gitlab-org/gitlab@8c88898dfd1619cc635ce5b98e30eebd91da497f) ([merge request](gitlab-org/gitlab!84664)) +- [Fix null argument handling in background migration Rake task](gitlab-org/gitlab@23e1eb3272828b3546e18efdfaea5a8077cb20f4) ([merge request](gitlab-org/gitlab!84664)) + +## 14.9.2 (2022-03-31) + +### Security (20 changes) + +- [Quarantine UsageDataNonSqlMetrics failing test](gitlab-org/security/gitlab@123fc00ff9f407284ce05007ddc373e1bd0aeede) ([merge request](gitlab-org/security/gitlab!2364)) +- [Disallow login if password matches a fixed list](gitlab-org/security/gitlab@1a128ae3fb17b3d83974bb08034e4ba7a7d54e3b) ([merge request](gitlab-org/security/gitlab!2357)) +- [Update devise-two-factor to 4.0.2](gitlab-org/security/gitlab@17c70b13dcd437c05de63b3286245af8e6f42210) ([merge request](gitlab-org/security/gitlab!2349)) +- [Limit the number of tags associated with a CI runner](gitlab-org/security/gitlab@ed5daced882a0206e050c4f676a888ac1c2417b1) ([merge request](gitlab-org/security/gitlab!2303)) +- [GitLab Pages Security Updates for 14.9](gitlab-org/security/gitlab@79709cabf71a57a336f490636a7e32a208fe0229) ([merge request](gitlab-org/security/gitlab!2327)) +- [Upgrade swagger-ui dependency](gitlab-org/security/gitlab@14280c1d844be3ffc2f30f5321a818a7b6c51770) ([merge request](gitlab-org/security/gitlab!2336)) +- [Modify release link format check to avoid regex if string is too long](gitlab-org/security/gitlab@f516d883b46e1441410476dc140d69fde51cdf0f) ([merge request](gitlab-org/security/gitlab!2307)) +- [Masks variables in error messages](gitlab-org/security/gitlab@9cf62118390c0cfba3d36a4231a30a7836f06e2f) ([merge request](gitlab-org/security/gitlab!2308)) +- [Escape user provided string to prevent XSS](gitlab-org/security/gitlab@2da3502aef64ed1b01c13d82418950cf284098c6) ([merge request](gitlab-org/security/gitlab!2313)) +- [Monkey patch of RDoc to prevent Ruby segfault](gitlab-org/security/gitlab@0ae4925089a1b5fd7c9abeeb0756b3a50e05799a) ([merge request](gitlab-org/security/gitlab!2321)) +- [Project import maps members' created_by_id users based on source user ID](gitlab-org/security/gitlab@3826f2a7c652d3f74e45bfef8888601ca1c86ba1) ([merge request](gitlab-org/security/gitlab!2301)) +- [Redact InvalidURIError error messages](gitlab-org/security/gitlab@59b60e9cf8f79d6f41000d34a4434c5a04988030) ([merge request](gitlab-org/security/gitlab!2295)) +- [Fix access for approval rules API](gitlab-org/security/gitlab@7890215aa29624cd67c5bc8ac25175f2866479b7) ([merge request](gitlab-org/security/gitlab!2322)) +- [Fix kroki exploit](gitlab-org/security/gitlab@b2a44b407ab85ca056a271ba4e708128ef08d25f) ([merge request](gitlab-org/security/gitlab!2306)) +- [Fix blind SSRF when looking up SSH host keys for mirroring](gitlab-org/security/gitlab@5a9509b52584302c508bd6dff1454f80aae371ea) ([merge request](gitlab-org/security/gitlab!2309)) +- [Escape original content in reference redactor](gitlab-org/security/gitlab@b33b170a2c2df8285999f3631e8a53d35e0eed22) ([merge request](gitlab-org/security/gitlab!2317)) +- [Security fix for CI/CD analytics visibility](gitlab-org/security/gitlab@f3febd00b440475b2aca0b9bd6728fa5f8750288) ([merge request](gitlab-org/security/gitlab!2304)) +- [Latest commit exposed through fork of a private project](gitlab-org/security/gitlab@3f20d4f294a12ceb33bec19d86790f582fb7fb48) ([merge request](gitlab-org/security/gitlab!2294)) +- [Fix Asana integration restricted branch filter](gitlab-org/security/gitlab@08aa0f55b1b715f7311ee6502cd6f8a1b875f878) ([merge request](gitlab-org/security/gitlab!2300)) +- [Revert "JH need more complex passwords"](gitlab-org/security/gitlab@e2fb87ec5d4e235d6b83454980cec9c049849a1c) ([merge request](gitlab-org/security/gitlab!2352)) + +## 14.9.1 (2022-03-23) + +### Fixed (1 change) + +- [Fix backups not working when feature_flags table does not exist](gitlab-org/gitlab@4cc3cd6cf6eb256a9837ef92a6fdb4991cd1642c) ([merge request](gitlab-org/gitlab!83388)) + +### Changed (1 change) + +- [Alias user_email_lookup_limit to search_rate_limit](gitlab-org/gitlab@424c277fc4c994df60ea68acb8988537526108e4) ([merge request](gitlab-org/gitlab!83388)) + +## 14.9.0 (2022-03-21) + +### Added (119 changes) + +- [Toggle the related_epics_widge feature flag](gitlab-org/gitlab@8f64bbbc5c485fcdb7453f3c42949a37e030a71f) ([merge request](gitlab-org/gitlab!82333)) **GitLab Enterprise Edition** +- [Add Time to Restore Service DORA metric](gitlab-org/gitlab@0ccf5b4ae6bca2fa1ea128228e14bb63153283ce) ([merge request](gitlab-org/gitlab!82510)) **GitLab Enterprise Edition** +- [Added possiblity to create new token from the UI](gitlab-org/gitlab@8f36ef50c87ea78e33409c3ddcbbb04782fa5e15) ([merge request](gitlab-org/gitlab!82690)) +- [Add param to Wiki REST endpoint to retrieve different page versions](gitlab-org/gitlab@53b8b9fe4952d7c11a80cd52f4dab8e6d8bfa7de) ([merge request](gitlab-org/gitlab!82838)) +- [Add Harbor integration](gitlab-org/gitlab@bcb79d53fd54e545cf80416beb77360e06262c22) by @prajnamas ([merge request](gitlab-org/gitlab!80999)) +- [MR widget: update merge commit message when default changed](gitlab-org/gitlab@b005b8e80ba8691ec24a5063e4a133d21e56532e) by @trakos ([merge request](gitlab-org/gitlab!77425)) +- [Support agent registration without config](gitlab-org/gitlab@388f87faad5adf5c68ba4850a82b1d4433290b0f) ([merge request](gitlab-org/gitlab!82036)) +- [Add `RestrictGitlabSchema` that enforces `restrict_gitlab_migration`](gitlab-org/gitlab@6bdac41133bebcf66c308dc31f589046b1dc0725) ([merge request](gitlab-org/gitlab!73756)) +- [Enable the vsa_incremental_worker FF by default](gitlab-org/gitlab@d04a006d125f94b34c7eef4f6b85a37292bc7500) ([merge request](gitlab-org/gitlab!82975)) +- [Add deployment approval comment field](gitlab-org/gitlab@5dfb9cabb2d2aee7eff447e34021c8b7ca24eed4) ([merge request](gitlab-org/gitlab!82743)) **GitLab Enterprise Edition** +- [Support iteration property for issues api](gitlab-org/gitlab@406a79a51c6dc35cd8207a7426a8582cd20ecfc4) ([merge request](gitlab-org/gitlab!82813)) **GitLab Enterprise Edition** +- [Filter archived issues / MRs from GraphQL](gitlab-org/gitlab@a7fde3da984bc52b887203fa57998c93f9c6fc5f) ([merge request](gitlab-org/gitlab!82673)) +- [Purge `security_findings` records periodically](gitlab-org/gitlab@9cee0b65a405f4510fd5a77c2dcdcaf4ad95e003) ([merge request](gitlab-org/gitlab!81423)) **GitLab Enterprise Edition** +- [Upgrade GitLab Pages to 1.56.0](gitlab-org/gitlab@891adfa4d15e31f0d6087a6d22644cb9a06fe3e2) ([merge request](gitlab-org/gitlab!82901)) +- [Stream audit event on merge request approval](gitlab-org/gitlab@39d59e2adbb92572ef077918773a9110d7924e1a) ([merge request](gitlab-org/gitlab!82471)) **GitLab Enterprise Edition** +- [Use batches for pull request import jobs](gitlab-org/gitlab@b5507c4df013a527266cb0e7914a1d525e2f30eb) ([merge request](gitlab-org/gitlab!82891)) +- [Verify protected tags permissions for pull mirroring](gitlab-org/gitlab@b96fe042b134448a40e6be71dc438d74133920aa) ([merge request](gitlab-org/gitlab!82890)) +- [Document how to use CI `dependencies` and `parallel:matrix` together](gitlab-org/gitlab@681db1577821d9ed4612d2d060a3413aa4ea883b) ([merge request](gitlab-org/gitlab!82734)) +- [Add security training urls](gitlab-org/gitlab@942e93418c6aae0f85afd991e4cbc7a659521fba) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82442)) **GitLab Enterprise Edition** +- [Add `Enterprise` filter to members search bar](gitlab-org/gitlab@4f1b22da7fdeecd89130954a268ba8cae585f317) ([merge request](gitlab-org/gitlab!82059)) **GitLab Enterprise Edition** +- [Add VulnerabilityReadsFinder to speed up API responses](gitlab-org/gitlab@cf39e3350372fb806e6528a63a7ec7898c83049b) ([merge request](gitlab-org/gitlab!76220)) **GitLab Enterprise Edition** +- [Copy metric images from alert to new incident](gitlab-org/gitlab@5f62b91fa1eb6e4ba593f46bdc8caf34eecc9c76) ([merge request](gitlab-org/gitlab!79703)) **GitLab Enterprise Edition** +- [Expose UserInteractions for participants of a merge request](gitlab-org/gitlab@c0bcfde737e0e3a4c39f36234157e8103ef86cca) ([merge request](gitlab-org/gitlab!82257)) +- [Remove wiki_front_matter FF](gitlab-org/gitlab@8045da7944102e54bb172a5ef3c5a8088459c360) ([merge request](gitlab-org/gitlab!81833)) +- [Add default branch to Pipelines page filter if no search term provided](gitlab-org/gitlab@039b1145c3e477899681aeba7a27600cad9d45d5) ([merge request](gitlab-org/gitlab!82245)) +- [Creates asynchronously index on ci_job_artifacts table](gitlab-org/gitlab@88112e32fff550f742e334bc5c19c4cbc947800e) ([merge request](gitlab-org/gitlab!82585)) +- [GraphQL: Add notificationEmail to GroupMembers](gitlab-org/gitlab@0068380ce0105d50afb5fa419d9c90478f3132a9) ([merge request](gitlab-org/gitlab!81954)) +- [Add external status checks total to ping](gitlab-org/gitlab@0f9770573a9aba52ab3ba94c09315a5f498728f3) ([merge request](gitlab-org/gitlab!82416)) **GitLab Enterprise Edition** +- [Add CAPTCHA to REST API](gitlab-org/gitlab@dc9fb467df0c59c9632525e8753aab12a8d91457) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80793)) +- [Implement GET APIs for Deploy Tokens](gitlab-org/gitlab@fd6c86aa82c162720cca29c12ac8e33d55a5f8c0) by @tuxtimo ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82467)) +- [Add namespace to Security Policy Orchestration Configuration](gitlab-org/gitlab@b77aefa62c7aac43d50d29de3adeb227760615ae) ([merge request](gitlab-org/gitlab!82013)) **GitLab Enterprise Edition** +- [Add deployment approval UI MVC](gitlab-org/gitlab@d39dff988a3efa1a082afe0ebec5be6bf6fd4939) ([merge request](gitlab-org/gitlab!80759)) **GitLab Enterprise Edition** +- [Add support for failure status status checks](gitlab-org/gitlab@37bc22744f7ecc3b6b8c3cee74ad7e45aea04b58) ([merge request](gitlab-org/gitlab!81005)) **GitLab Enterprise Edition** +- [Allow to list related epics on REST API](gitlab-org/gitlab@92d9f4329badbcc7f7db24184ae63db0d756e172) ([merge request](gitlab-org/gitlab!82332)) **GitLab Enterprise Edition** +- [Add `coverage_report` keyword to CI config](gitlab-org/gitlab@eae7dfc843783e270607d71c6db0c1ab6a52a8d1) ([merge request](gitlab-org/gitlab!81378)) +- [Add audit logs when unassigning CI runner from a project](gitlab-org/gitlab@25f9eb27389dcec34f8b1b2b2003eee6c15b07d9) ([merge request](gitlab-org/gitlab!81540)) **GitLab Enterprise Edition** +- [Permalink to the latest release](gitlab-org/gitlab@4305f93ea5ba859bf4154d70dcdc83632deef2a8) ([merge request](gitlab-org/gitlab!78679)) +- [Allow the /merge quick action through graphql create note](gitlab-org/gitlab@a201e850fee679ad2bc28858daf00755f87cef5a) ([merge request](gitlab-org/gitlab!82248)) +- [Add projects with status checks to ping](gitlab-org/gitlab@d16eca98fa26b3bb065a2a2154b2249d41860fd8) ([merge request](gitlab-org/gitlab!82427)) **GitLab Enterprise Edition** +- [Add security training providers](gitlab-org/gitlab@562d3ab8e8cbbcc3dd2688727030052011d1954d) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81104)) +- [Add OpenSSL FIPS mode detection and env var](gitlab-org/gitlab@f3172799557172ca414cb17459e629e59e2e069c) ([merge request](gitlab-org/gitlab!82004)) +- [Support Vault EE namespaces](gitlab-org/gitlab@86894deb6653ddd44111401b63107f4df7f0195a) by @aleksanderzak ([merge request](gitlab-org/gitlab!80590)) +- [Add free user cap feature flag and controls](gitlab-org/gitlab@7b7114d8870dccfb74163162c3757c51da1a4df5) ([merge request](gitlab-org/gitlab!80518)) **GitLab Enterprise Edition** +- [Add support stackprof in GitLab profiler](gitlab-org/gitlab@4c42d3ac32dc3cde4b485952e4fca03de86d20a5) ([merge request](gitlab-org/gitlab!82249)) +- [Include invited groups into protected environments API](gitlab-org/gitlab@6f73dec2a64989a23d24ac85a2a701a90e9067bc) ([merge request](gitlab-org/gitlab!81029)) **GitLab Enterprise Edition** +- [Add wiki page render option to wiki API](gitlab-org/gitlab@be93a263833ff42abd8b09313a6857fb83e8dcad) ([merge request](gitlab-org/gitlab!81134)) +- [Remove rate_limit_user_sign_up_endpoint feature flag](gitlab-org/gitlab@2a506163fd32fc5bf4efc5273930b76f2919dd1e) ([merge request](gitlab-org/gitlab!82092)) +- [Expose committers on mergeRequest GraphQL type](gitlab-org/gitlab@627a989aef6a44bc7e3c1538d276d5b115db7d33) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79965)) +- [Add backend interface to look up for security training](gitlab-org/gitlab@72812ce313a47e5385e58b4b008b7427a0fe716e) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81861)) **GitLab Enterprise Edition** +- [Show security report warnings on pipeline security tab](gitlab-org/gitlab@22e8a70f7e573b39834384156efea65187b37a70) ([merge request](gitlab-org/gitlab!80934)) **GitLab Enterprise Edition** +- [Allow to destroy related epics association on internal API](gitlab-org/gitlab@c4dab676900eccc30c466c45dea6d154ff91a93c) ([merge request](gitlab-org/gitlab!82035)) **GitLab Enterprise Edition** +- [Add frontend routing to Geo GraphQL specific sites](gitlab-org/gitlab@cbf0218b10d37af4a3c54b7358649e484a444805) ([merge request](gitlab-org/gitlab!80106)) **GitLab Enterprise Edition** +- [Add audit logs when assigning CI runner to project](gitlab-org/gitlab@13f562bbde2e5335584d7ac235270a3f4d0e63ea) ([merge request](gitlab-org/gitlab!81508)) **GitLab Enterprise Edition** +- [Merge/squash commit templates: add %{all_commits} variable](gitlab-org/gitlab@ceb64735cbac1fc5b5a176efafd789817cdeb34a) by @trakos ([merge request](gitlab-org/gitlab!81097)) +- [Add size to image details heade](gitlab-org/gitlab@6d9d013cd88e7a4e1f0d775c1d432293d58e4afd) ([merge request](gitlab-org/gitlab!82114)) +- [Feat(Licesing): update upload to activate](gitlab-org/gitlab@36b4b17e98ad066038b89097e23dfd00d9423d3d) ([merge request](gitlab-org/gitlab!80904)) **GitLab Enterprise Edition** +- [Send a notification when a new access token is created](gitlab-org/gitlab@8c1d3e4a7b9242ec7cabd5392ee9be0719d65fd1) by @rpadovani ([merge request](gitlab-org/gitlab!81340)) +- [Add audit event for project deploy tokens](gitlab-org/gitlab@7ab7ea0d89ccd8446d864f6a5d3f4826100aed76) ([merge request](gitlab-org/gitlab!81829)) **GitLab Enterprise Edition** +- [Add audit event for group deploy tokens](gitlab-org/gitlab@eea536482d3c7b2a03baafc7ce51265ee77aff1e) ([merge request](gitlab-org/gitlab!82251)) **GitLab Enterprise Edition** +- [Add suggestion to use short-living tokens to end-users](gitlab-org/gitlab@ee2e5fd4f7f95e5426aac04e1f70a9bf652f93f9) ([merge request](gitlab-org/gitlab!81323)) +- [Add comment to Deployment Approvals](gitlab-org/gitlab@31f63645ff9603ac6c1e2b282576d1daa41173f7) ([merge request](gitlab-org/gitlab!82142)) **GitLab Enterprise Edition** +- [Parse pasted markdown](gitlab-org/gitlab@42449f07567d06c41d39378036a759ba58415d05) ([merge request](gitlab-org/gitlab!78394)) +- [Remove rate_limit_user_by_id_endpoint feature flag](gitlab-org/gitlab@37c0084c0a4d745e00206da6fca9c16fbc1110bf) ([merge request](gitlab-org/gitlab!82108)) +- [Remove rate_limit_username_exists_endpoint feature flag](gitlab-org/gitlab@6c018f2133b0372ff6e79d4a6a60cfcea80e2d14) ([merge request](gitlab-org/gitlab!82105)) +- [Remove rate_limit_profile_update_username feature flag](gitlab-org/gitlab@cf9f96bc79cf8532cb405c259030b61fde53b0ee) ([merge request](gitlab-org/gitlab!82095)) +- [Expose sum of weights for epic board lists on GraphQL endpoint](gitlab-org/gitlab@32b10dfbaeea605c6ab2f726650f1034693ad465) ([merge request](gitlab-org/gitlab!76440)) **GitLab Enterprise Edition** +- [Add security scan status to GraphQL API](gitlab-org/gitlab@c1ecdd58a472608760235927b2e6f34c5ab0657b) ([merge request](gitlab-org/gitlab!81305)) **GitLab Enterprise Edition** +- [Add saved replies](gitlab-org/gitlab@832f32cc313dcdec9dbf95242213af7c1f37ce76) ([merge request](gitlab-org/gitlab!80807)) +- [Backfill all project namespaces](gitlab-org/gitlab@6a08c2b64f98d8f9a19f2f215813da38fb7a3401) ([merge request](gitlab-org/gitlab!77371)) +- [Implement API endpoint to get single SSH key for specific user](gitlab-org/gitlab@9e64387c0e3fafce54ff43c212443c9a195c99bc) by @tuxtimo ([merge request](gitlab-org/gitlab!81790)) +- [Add job_variables_attributes to play build API](gitlab-org/gitlab@b669e48a4b8e23f1913d93e738386011f478057d) ([merge request](gitlab-org/gitlab!81317)) +- [Use fair queueing for Loose Foreign Keys](gitlab-org/gitlab@9738b0324e251e058fdccd3bb4ece57dbeac1479) ([merge request](gitlab-org/gitlab!81888)) +- [Add application setting for cleanup policy caching](gitlab-org/gitlab@d0c1b163f8d2ef90e97a40f6b38a789696b5171c) ([merge request](gitlab-org/gitlab!80902)) +- [Add GraphQL Todoable interface for to-do targets](gitlab-org/gitlab@4539cd906e27969dadcc9661d97dd60f73bc9cc5) by @KevSlashNull ([merge request](gitlab-org/gitlab!73603)) +- [Add circuit breaker for gitlab experimentation](gitlab-org/gitlab@54056a316d1c67bcadc82e1a7ea2dfc579cd6c0a) ([merge request](gitlab-org/gitlab!81834)) +- [Add delete endpoint for Alert metric images](gitlab-org/gitlab@9226d47f7c50a39bddf1b8850550dfd5a4291254) ([merge request](gitlab-org/gitlab!81107)) **GitLab Enterprise Edition** +- [Enable Loose Foreign Keys partition rotation](gitlab-org/gitlab@a424373c2557314bd1f6aac893e2c11a3fddc2b4) ([merge request](gitlab-org/gitlab!81793)) +- [Add scan method to dast site profile GraphQL API](gitlab-org/gitlab@40fa9ce8d12b026d830cf914fa5478e533e7aceb) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78745)) **GitLab Enterprise Edition** +- [Filter a pipeline by author](gitlab-org/gitlab@d704138cb32a10b2cf078d9f2bd66922bbbaf6c2) by @genctys ([merge request](gitlab-org/gitlab!79470)) +- [Allow to pass suggestedColors to ColorPicker](gitlab-org/gitlab@55babfe9fb03831c83dc5128efe3f635f65b87ff) by @wwwjon ([merge request](gitlab-org/gitlab!81604)) +- [Add security_and_compliance_access_level to Projects API](gitlab-org/gitlab@2bd37b450c9027e3eff7451f309d5a2d45458736) by @ytans ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81086)) +- [Add user and system note filters to note_authors association](gitlab-org/gitlab@fcea425c2849e574d9dfac3efd3a5c1ff99c33b9) ([merge request](gitlab-org/gitlab!81436)) +- [Add analytics to detect deployment jobs being executed](gitlab-org/gitlab@95dd6e9eff1767ec6ffe8f7a59a04ab7d7889573) ([merge request](gitlab-org/gitlab!79272)) +- [Add filters and sorting to compliance violations GraphQL type](gitlab-org/gitlab@bf343e65f31ada9cd2d8249e0574e1f2f15a149f) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78681)) **GitLab Enterprise Edition** +- [Add encoding field to wiki API](gitlab-org/gitlab@05fd6cb19ed2dd7dade727d36eca0349948db16b) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81150)) +- [Add ingestion for Finding Evidence](gitlab-org/gitlab@855b613c0f62e6cfa67814c293151919663318d0) ([merge request](gitlab-org/gitlab!75287)) **GitLab Enterprise Edition** +- [Feat(Licensing): add Offline cloud type](gitlab-org/gitlab@aa32508aede618cc48540a162d0f00df8cc1ae9e) ([merge request](gitlab-org/gitlab!80833)) **GitLab Enterprise Edition** +- [Add webhook delivery method options to config/mail_room.yml](gitlab-org/gitlab@43165dd6bdd66f89bc4d4db5373f67ccb1254f04) ([merge request](gitlab-org/gitlab!80832)) +- [Improve strikethrough in Markdown editor](gitlab-org/gitlab@103a129e63677818ffc9c3c0eac160c9c3f564aa) by @smokris ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81092)) +- [Created compliance violation GraphQL type and added to Group type](gitlab-org/gitlab@7e69ac7f6f90209e364b5c46a4c927857b36013e) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80995)) **GitLab Enterprise Edition** +- [Implement colour attribute for epics](gitlab-org/gitlab@c428bacd9c61ab4387423586253d8f1a7ca5744c) by @espadav8 ([merge request](gitlab-org/gitlab!79940)) +- [Add basic FIPS class](gitlab-org/gitlab@360940b1e162c7b10e18de46bade2a81b80629ae) ([merge request](gitlab-org/gitlab!81418)) +- [Add Dark Mode support to the image_tag helper](gitlab-org/gitlab@c6fde03a5158a9f42d8c00082766c767f22a5551) ([merge request](gitlab-org/gitlab!81219)) +- [Add upload & update endpoints for alert metrics](gitlab-org/gitlab@829f9695ae7ded05c276f9ae3b6f6d3ea6fc3c53) ([merge request](gitlab-org/gitlab!80982)) **GitLab Enterprise Edition** +- [API: Add endpoint to reset runner token with old token](gitlab-org/gitlab@f027a6f2f1db7c91e2823f3400892b730ecc0a67) by @KyleFromKitware ([merge request](gitlab-org/gitlab!74336)) +- [Added updated_state_by_user to reviewers and assignees](gitlab-org/gitlab@d2cacb034a5b21ce02a1441905bc54aa9869ca3c) ([merge request](gitlab-org/gitlab!75927)) +- [Swapable cleaner/raw diffs for Notebooks](gitlab-org/gitlab@4677ac06d61e19f0f64a6b0559df72f809996b7f) ([merge request](gitlab-org/gitlab!75500)) +- [Upgrade GitLab Pages to 1.55.0](gitlab-org/gitlab@e2cde448a6180d2bb91900c2ce3aa7a0d1dfc14f) ([merge request](gitlab-org/gitlab!81261)) +- [Enable pending builds table queuing strategy](gitlab-org/gitlab@65e3bb48e1dd06235ef435f8318ca1787053831a) ([merge request](gitlab-org/gitlab!81238)) +- [Add a timeline event pipeline filter to TimelineEvent](gitlab-org/gitlab@a9fb9fdc81d6ddc2c9fe231d80b2fecb32ccebcc) ([merge request](gitlab-org/gitlab!79852)) **GitLab Enterprise Edition** +- [Add read API for Alert Metric Images](gitlab-org/gitlab@8adf04476edf0895406e0b3a3c9e0d75a0b083bd) ([merge request](gitlab-org/gitlab!80442)) **GitLab Enterprise Edition** +- [Support scoped iteration report](gitlab-org/gitlab@5267e55682c71ff60ad818a54123d53d868b7313) ([merge request](gitlab-org/gitlab!81216)) **GitLab Enterprise Edition** +- [Add mutation to promote timeline event from a note](gitlab-org/gitlab@72201bf665c68b0c1bd864068d5cd387eec50f5b) ([merge request](gitlab-org/gitlab!80633)) **GitLab Enterprise Edition** +- [Add active and passive profiles](gitlab-org/gitlab@7907d2f76d4cb7274fbf4e6252a938e9d5cc17a2) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/78492)) **GitLab Enterprise Edition** +- [Support scoping for timebox report via GraphQL](gitlab-org/gitlab@00c656261a7bbb23913947366be3aab7641d4083) ([merge request](gitlab-org/gitlab!79327)) **GitLab Enterprise Edition** +- [Add aggregated VSA consistency check service](gitlab-org/gitlab@19fecb63b6492ca434199ada710c619b6d973689) ([merge request](gitlab-org/gitlab!79942)) +- [Return runner editUrl via GraphQL API](gitlab-org/gitlab@4f27ed7c775586a2618f9b301343262406c0f8c9) ([merge request](gitlab-org/gitlab!80926)) +- [Add the total time chart to each VSA stage](gitlab-org/gitlab@9c048ea7b6b8034f9ade0209eb69553a1aee5a01) ([merge request](gitlab-org/gitlab!80255)) **GitLab Enterprise Edition** +- [Workhorse: Allow HTTPS for backends](gitlab-org/gitlab@24fbcde50729bd9a58634b0aceb5d3756e5d3302) ([merge request](gitlab-org/gitlab!81061)) +- [Adds cross_project_pipeline_available to NamespaceType](gitlab-org/gitlab@bf83faf50fea5b43af2b627f5aee86a5dfb5389e) ([merge request](gitlab-org/gitlab!80381)) +- [Add readme in repo creation for reg flow](gitlab-org/gitlab@d51b0c899f14c5ea2fdbb0387f9311d2de8753f4) ([merge request](gitlab-org/gitlab!79770)) **GitLab Enterprise Edition** +- [Hide markdown preview tab if editing non-markdown formats](gitlab-org/gitlab@596d3f204316790ea2ac19a11be0a0b14ceeaa34) by @espadav8 ([merge request](gitlab-org/gitlab!80178)) +- [Log CI runner unregistration audit events](gitlab-org/gitlab@aa9612f1bb8ea820a7490e80290ce2bc77a05200) ([merge request](gitlab-org/gitlab!79754)) **GitLab Enterprise Edition** +- [Add a consolidated button to edit blobs](gitlab-org/gitlab@02314fd77728f731dc55b22033fa6c8a5b766613) ([merge request](gitlab-org/gitlab!80715)) +- [Calculate storage statistics for dependency proxy](gitlab-org/gitlab@b8c1f4d851aa72ed144bed44fc233dde43e1be4a) ([merge request](gitlab-org/gitlab!79358)) +- [Latest release badge documentation inclusion](gitlab-org/gitlab@8572186d5a8b192edf218bb2c266a1d0fc0adbf8) ([merge request](gitlab-org/gitlab!80897)) +- [Add slash command to page incident](gitlab-org/gitlab@f0a8c6f5c5f1835dd8ec97de9fb72156e947cde2) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/79977)) **GitLab Enterprise Edition** +- [Expose container repository sizes](gitlab-org/gitlab@d964a1d7acaf7a851d9ffeac5cf4373ccc52fde9) ([merge request](gitlab-org/gitlab!80412)) +- [Create RelatedEpic table and model](gitlab-org/gitlab@f2a49bb242f103503011bad7c8acfb77375298ff) ([merge request](gitlab-org/gitlab!80499)) + +### Fixed (132 changes) + +- [Cleaned up clusters_helper and cluster index haml](gitlab-org/gitlab@02e3bcc76b763124ce50ce869978e1011ffd43bd) ([merge request](gitlab-org/gitlab!82637)) +- [Update holder name column to 50 limit constraint](gitlab-org/gitlab@5901bc8701c3bb2ca6f7fc21487013d59302a517) ([merge request](gitlab-org/gitlab!82587)) +- [Improve wording for vulnerabilities_allowed](gitlab-org/gitlab@d4242b41a8668fa0da779a5addba281cebd9be7e) ([merge request](gitlab-org/gitlab!82742)) **GitLab Enterprise Edition** +- [Add missing input box for search rate limiting configuration](gitlab-org/gitlab@635d4811cc2613b5299ffc96bf27725c935faa1b) ([merge request](gitlab-org/gitlab!82944)) +- [Handle Jira Connect installation updates](gitlab-org/gitlab@19722d41355992ee56a3f045f70b93b957249658) ([merge request](gitlab-org/gitlab!83038)) +- [Return a 422 error for Changelog::Error exception](gitlab-org/gitlab@896a7c1de30abb1329d4e6bcb92ceebad6317632) ([merge request](gitlab-org/gitlab!80850)) +- [Fix empty state pipelines page](gitlab-org/gitlab@a638ee1aa98d05b2cc5d63c19a4aff8061c1f609) ([merge request](gitlab-org/gitlab!83030)) +- [Update attribute indirection](gitlab-org/gitlab@9bf63a5b2bab3d8c93a967a13348bc9853870fa9) ([merge request](gitlab-org/gitlab!82932)) **GitLab Enterprise Edition** +- [Fixed incorrect minimum number of users on subscription purchase flow](gitlab-org/gitlab@db461b03c91a6c6a8f32724dff19cb74933572ad) ([merge request](gitlab-org/gitlab!82480)) **GitLab Enterprise Edition** +- [Refactor remove topic avatar](gitlab-org/gitlab@136b739fcc5b04ed76f4c94d2305c77af0cc8ba5) ([merge request](gitlab-org/gitlab!82894)) +- [Fix default Ci config path](gitlab-org/gitlab@03dd150afcb7353fd4d4903a9ca59705b2b109d9) ([merge request](gitlab-org/gitlab!82827)) +- [Fix ci.json: Remove Nesting from Secrets Rule](gitlab-org/gitlab@ee33d4da70cc300335192cdaaca3a20260d4cca3) ([merge request](gitlab-org/gitlab!82484)) +- [Fix DevopsAdoption usage metric gathering](gitlab-org/gitlab@47676bd58f6463bcb265ead7eaf737fb921d5c66) ([merge request](gitlab-org/gitlab!82904)) **GitLab Enterprise Edition** +- [Fix Epic and Label != filtered search suggestions not showing](gitlab-org/gitlab@c9b18202657080149c72fc317be64dfe10f11ca1) ([merge request](gitlab-org/gitlab!82814)) +- [Handle recursion when creating ApplicationSettings](gitlab-org/gitlab@4b59d55ada4b0212e2aece9f3c52ec9281739ebf) ([merge request](gitlab-org/gitlab!82930)) +- [Fall back to avaiable scope if scope is invalid](gitlab-org/gitlab@b9da1851edf685a39e58c6b5bfbd6a169cad1378) ([merge request](gitlab-org/gitlab!82847)) +- [Fix sourcegraph breaking on projects/:id](gitlab-org/gitlab@248ab5c8b02e3e21a1a206b4032653afbb065c90) ([merge request](gitlab-org/gitlab!82447)) +- [Find or initialize Scanners using project_id](gitlab-org/gitlab@8090f3da0944805673ac8189c3fcfe43591573cc) ([merge request](gitlab-org/gitlab!82923)) **GitLab Enterprise Edition** +- [Add responsive property to area charts in CI minutes](gitlab-org/gitlab@a97e275af9ba3405862792ad1ab252e5fe980b98) ([merge request](gitlab-org/gitlab!82741)) **GitLab Enterprise Edition** +- [Additional spec to capture bug in latest release permalink and fix same](gitlab-org/gitlab@f9f9f8300d8565e4315bb4c0cb4d54dccf522d60) ([merge request](gitlab-org/gitlab!82896)) +- [Global Search - Fix ref based searches](gitlab-org/gitlab@08e0800ee2cc9ee85709f1689b212b4d028cd822) ([merge request](gitlab-org/gitlab!80857)) +- [Remove duplicate new cluster button](gitlab-org/gitlab@e43022603d6c7bb7243d7444816c8cb190559192) ([merge request](gitlab-org/gitlab!82654)) +- [Increase token preview length in runner audit logs](gitlab-org/gitlab@68acf3dbd2705bc8a640643a97254e25c6059316) ([merge request](gitlab-org/gitlab!82523)) **GitLab Enterprise Edition** +- [Fix unexpected height stretch of CI job duration badge](gitlab-org/gitlab@0b9adf4ae7c163bf0ab691306e4f068562231b66) by @nanmu42 ([merge request](gitlab-org/gitlab!82670)) +- [Allow setting push events branch filter for group hooks](gitlab-org/gitlab@9f3ad7d9753a989ad5b532ffd947687b6c647eef) ([merge request](gitlab-org/gitlab!82531)) **GitLab Enterprise Edition** +- [Support CRM contacts only in root groups](gitlab-org/gitlab@227c3221888c925d21d8a7d17f8d552384e07e1d) by @leetickett ([merge request](gitlab-org/gitlab!78959)) +- [UI Bug Fix: Expand the early checks when using /merge quick action](gitlab-org/gitlab@513a636c4327658243c64e1380babb565f8259d9) ([merge request](gitlab-org/gitlab!82170)) **GitLab Enterprise Edition** +- [Fix an inaccurate help page link](gitlab-org/gitlab@4cbaffb4f06699ba295af31a4c0d7a11d5a71d30) ([merge request](gitlab-org/gitlab!82147)) +- [Add validation for rule/yaml modes switch](gitlab-org/gitlab@1a87f7fbe9544c9bd17abc82fa3f84acfa2a95cd) ([merge request](gitlab-org/gitlab!82451)) **GitLab Enterprise Edition** +- [Fix namespace usage quotas storage pagination](gitlab-org/gitlab@bd5c66fcfa06c7ebd74937efea3b14cb339d9082) ([merge request](gitlab-org/gitlab!80752)) +- [Replace applications destroy alert with GlModal](gitlab-org/gitlab@6b4cd07d9724821d20c8e546926703ad97030394) ([merge request](gitlab-org/gitlab!80799)) +- [Don't allow filtering by `in` alone on issue/MR dashboard](gitlab-org/gitlab@138f3d1a76ab05f9e73db667eafd3e94bbe70e19) ([merge request](gitlab-org/gitlab!82664)) +- [Allow invite group modal to render when membership is locked](gitlab-org/gitlab@8d2ebd4d78459c48cf95a6b597886aaf0756e9e5) ([merge request](gitlab-org/gitlab!82636)) **GitLab Enterprise Edition** +- [Scan MR description when syncing builds with Jira](gitlab-org/gitlab@9db551e82528eaac1645f2acc7561441473b4c17) ([merge request](gitlab-org/gitlab!82204)) +- [Set resoure_iteration_events to ghost user](gitlab-org/gitlab@004f78ac56a0f3a4303f6b93fc44059902c5343a) ([merge request](gitlab-org/gitlab!82060)) **GitLab Enterprise Edition** +- [Update BulkImports Export to handle unexpected failure](gitlab-org/gitlab@3fba81a5bf6cc47722a5d8f2e63b4026b81a4d30) ([merge request](gitlab-org/gitlab!82221)) +- [Fix UsageDataQueries API not returning a query](gitlab-org/gitlab@7467adf89b4f5ef47eb9054a40e19b3de1eb7117) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81823)) **GitLab Enterprise Edition** +- [Fixed user cap evaluation for all OAuth login](gitlab-org/gitlab@0938f9f1c9b5a19cf107aa9e198505dc8cfb9fd2) ([merge request](gitlab-org/gitlab!81272)) **GitLab Enterprise Edition** +- [Fix retrying of batched background migrations](gitlab-org/gitlab@80c517ffc5f2a9724e2614d70f1540a95718955f) ([merge request](gitlab-org/gitlab!82387)) +- [Allow merge commits for SD](gitlab-org/gitlab@ce04cea13b325aa7f0399b721f96842d93bb0ea0) ([merge request](gitlab-org/gitlab!82546)) +- [Fix startup crash in Puma single mode](gitlab-org/gitlab@076ac5bba2eda70f13bccd892549f40a6e09d380) ([merge request](gitlab-org/gitlab!81983)) +- [Decouple policy name update from yaml/rule modes](gitlab-org/gitlab@b98c6a483022199e8f3927726bca893c79ac72c6) ([merge request](gitlab-org/gitlab!82337)) **GitLab Enterprise Edition** +- [Poll folder for changes in new environments page](gitlab-org/gitlab@0ac66e447cb52f0228d67fbf58dda419f4b01fda) ([merge request](gitlab-org/gitlab!81043)) +- [Remove empty approvers in regards to](gitlab-org/gitlab@7b9b2ddc71543f932750279bb8c052fb5614dc3a) ([merge request](gitlab-org/gitlab!82338)) **GitLab Enterprise Edition** +- [Check authorization to view billableMembersCount](gitlab-org/gitlab@1a23f5e64e33527163dcb5e5b546a9f30108ced5) ([merge request](gitlab-org/gitlab!82479)) **GitLab Enterprise Edition** +- [Refactor repo deletion existence checking](gitlab-org/gitlab@86e7d744aa5cd08a9e8312b4c464ac19bcb20fa6) ([merge request](gitlab-org/gitlab!81799)) +- [Make hr in markdown visible in darkmode](gitlab-org/gitlab@78d9d3c983e670f6832916e1749ce3e2fb7cbc99) by @dianapaula19 ([merge request](gitlab-org/gitlab!81559)) +- [Fix filters presence check to take value into consideration](gitlab-org/gitlab@1b9dbdc99817b0dc7a516fcf46c1bf9b18e0b539) ([merge request](gitlab-org/gitlab!82462)) +- [Param requires_python is optional for pypi](gitlab-org/gitlab@22a7e20d06e2ab32bf3c947763ea8b1fa03a1417) ([merge request](gitlab-org/gitlab!81946)) +- [Ensure that the spaces between frontmatter are kept](gitlab-org/gitlab@aa1c697b288e4205301f0d3e7dec04533cba49f0) by @tchandelle ([merge request](gitlab-org/gitlab!81470)) +- [Fix sourcemap recovery error in Content Editor](gitlab-org/gitlab@2e46ff7fa3332bec0fc7a7f9053904b34762bf89) ([merge request](gitlab-org/gitlab!82040)) +- [Users who can read group should read group token](gitlab-org/gitlab@7fa729107e73f0a80de96afbd356372a36ce06a0) ([merge request](gitlab-org/gitlab!81843)) +- [Fix bot token name in issues](gitlab-org/gitlab@86a01c368b981ac8848f211a90b9d479e79985e7) ([merge request](gitlab-org/gitlab!81843)) +- [Allow inherited members of groups to deploy protected environments](gitlab-org/gitlab@decab235e844088309bdefbd8d2fbddbe61cb90b) ([merge request](gitlab-org/gitlab!82415)) +- [Update group bulk edit issues user docs](gitlab-org/gitlab@eb943abc5618acedd482edc31da655b5a2e72831) ([merge request](gitlab-org/gitlab!82406)) +- [Fix variable in _prometheus.html.haml so it shows as a code block](gitlab-org/gitlab@3c8716d9c4e0edd10b808837934a0fe0a0f8b1f0) ([merge request](gitlab-org/gitlab!82395)) +- [Project settings: fix semi-linear merge description](gitlab-org/gitlab@7e2b13257ec62cb41324c3c0835f7a201f897a9f) by @trakos ([merge request](gitlab-org/gitlab!82261)) +- [Fix rake task to seed Geo tracking database](gitlab-org/gitlab@7b55621331c7c42b9bf460a9e83ada9a908db714) ([merge request](gitlab-org/gitlab!82340)) **GitLab Enterprise Edition** +- [Fix remove button overlap with other components](gitlab-org/gitlab@4974a54bb041930f9b7a8c5fc1124d87abdf1519) ([merge request](gitlab-org/gitlab!82346)) **GitLab Enterprise Edition** +- [Include merge-requests in RESERVED_REFS_NAMES](gitlab-org/gitlab@f610f865f1dd92f0408c12d9a97590f5f9892744) ([merge request](gitlab-org/gitlab!82326)) +- [Pass issue ID to merge request creation form](gitlab-org/gitlab@1e72978788cc1a439c54c070f2f64101b642957b) ([merge request](gitlab-org/gitlab!81886)) +- [Apply omniauth defaults when no arguments are given](gitlab-org/gitlab@07fba40d80f502ac1aa7adaa99e8dcbac603dccc) ([merge request](gitlab-org/gitlab!81752)) +- [Fix `Verify SAML Configuration` button](gitlab-org/gitlab@910f9a47af94165c587d19c83e55ca97df2316ac) ([merge request](gitlab-org/gitlab!80978)) **GitLab Enterprise Edition** +- [Replace success variant with the confirm](gitlab-org/gitlab@0b3828cdbd96a4a2159ef1f95abf257dac16f9c3) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82207)) **GitLab Enterprise Edition** +- [Modify Union sql construction](gitlab-org/gitlab@5ca65cb8298ab3627a4f014105dcae660b267832) ([merge request](gitlab-org/gitlab!82077)) +- [Restart Action Cable server when Redis disconnects](gitlab-org/gitlab@12b8a5635b97629ccab4ac6529747e418e975c42) ([merge request](gitlab-org/gitlab!80822)) +- [Cache namespace first Auto DevOps config](gitlab-org/gitlab@9579939d83b350e06129b4501dc87e944a32bc07) ([merge request](gitlab-org/gitlab!80937)) +- [Global Search - Header Search Snippets](gitlab-org/gitlab@2e9739f18020efa33a5bec6b2e818b5c120c67de) ([merge request](gitlab-org/gitlab!80844)) +- [Fix NoMethodError when visiting repo analytics](gitlab-org/gitlab@afcedad0eaca6cfb3a3878e24af3c9d488286b3b) ([merge request](gitlab-org/gitlab!81988)) **GitLab Enterprise Edition** +- [Skip navigation modal for cancel button](gitlab-org/gitlab@554492fd1323a1da69f890828a2db167be777efb) ([merge request](gitlab-org/gitlab!81516)) +- [Handle not existing training ID for securityTrainingUpdate mutation](gitlab-org/gitlab@af4ec86a05cbef3991af0c787177b7ff204d54c7) ([merge request](gitlab-org/gitlab!81023)) **GitLab Enterprise Edition** +- [Fix VSA error with scoped labels](gitlab-org/gitlab@565294145c7b2864fdc169e383973e85ee42938e) ([merge request](gitlab-org/gitlab!82083)) **GitLab Enterprise Edition** +- [Fix markdown serialization in content editor](gitlab-org/gitlab@b9713c00a9bf76fb1eebc22b5a57a629063fc7ad) ([merge request](gitlab-org/gitlab!81849)) +- [Fix the month view on CI usage by minutes bar chart](gitlab-org/gitlab@c45a93a7654eb2473b3557a3a8f075763084c69e) by @parkourkarthik ([merge request](gitlab-org/gitlab!81185)) +- [Hard delete bulk snippets](gitlab-org/gitlab@2e739ceeac54f28092b9520aa7022e51f6359c1f) ([merge request](gitlab-org/gitlab!82020)) +- [Allow popups and links within mermaid diagrams](gitlab-org/gitlab@2dd16c32ddde176ee6dda228cd88f4df770b01b7) ([merge request](gitlab-org/gitlab!82012)) +- [Fixed bug preventing agent creation from agent tab](gitlab-org/gitlab@bfb1a0030de1724b75fcd5b5bf085524ee802029) ([merge request](gitlab-org/gitlab!81071)) +- [Prevent database deadlocks when deleting projects](gitlab-org/gitlab@b8c771578a6592f698cef25a8770ea3539f3f18b) ([merge request](gitlab-org/gitlab!81266)) +- [Fix mermaid background in dark mode](gitlab-org/gitlab@68cb78b22268fada1f9f2a8c96793dd347130612) ([merge request](gitlab-org/gitlab!81865)) +- [Change Edit to Open in Blob view to maintain consistency](gitlab-org/gitlab@a02c14952dc6069a5ff8e6be395318f15cfbcf26) by @rajanamistry ([merge request](gitlab-org/gitlab!81759)) +- [Fix loading spinner for legacy Filtered search dropdown](gitlab-org/gitlab@ebf450dac0b54bffb836bf9afcf7a4ab9520bad2) ([merge request](gitlab-org/gitlab!81953)) +- [Replace RegistrySearch component with PersistedSearch](gitlab-org/gitlab@ec1ee3e62af68ff5d2bdc992b1a2756d4ede261a) by @orozot ([merge request](gitlab-org/gitlab!80994)) +- [Fix sending BlobContent query with empty variables](gitlab-org/gitlab@91a808af620b1d6101312e19a83b7740ec648952) ([merge request](gitlab-org/gitlab!81156)) +- [Add container to qrtly reconciliation banner](gitlab-org/gitlab@4b01e28713a34d780a83ef11df574bded2b8d48d) ([merge request](gitlab-org/gitlab!81517)) **GitLab Enterprise Edition** +- [Add container for manual renewal banner](gitlab-org/gitlab@20b95750bfed341e801ff6c8552a36417a2778f5) ([merge request](gitlab-org/gitlab!81517)) **GitLab Enterprise Edition** +- [Make loading spinner Pajamas compliant](gitlab-org/gitlab@6010b760f886993f808b846add835d8354eeaba4) ([merge request](gitlab-org/gitlab!81801)) +- [Reset paging when sort is changed on vulnerability report](gitlab-org/gitlab@8e98a4469d7ddad22acb35af8d0644195617ec83) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81870)) **GitLab Enterprise Edition** +- [Fix job page copy source branch button](gitlab-org/gitlab@6aa1d555c347d5d73b4cdb9d56ce7fa6c5d512a3) by @leetickett ([merge request](gitlab-org/gitlab!76022)) +- [Raise error when diff note import fails](gitlab-org/gitlab@9490ef6ead244cc457975c1bb9e8afcd5dc6d2d1) ([merge request](gitlab-org/gitlab!81014)) +- [Fix group members tooltip label](gitlab-org/gitlab@01969906f1f7cc158167d3734768324a8e51437d) by @ali_o_kan ([merge request](gitlab-org/gitlab!81210)) +- [Fix loading icon in activity calendar](gitlab-org/gitlab@4c63009b296e536cc281b79bc0f0195267a2f91a) ([merge request](gitlab-org/gitlab!81552)) +- [Fix rendering vulnerability markdown description](gitlab-org/gitlab@5c3ee8d41673c80f25834d475da23b4b6a38f00a) ([merge request](gitlab-org/gitlab!77958)) **GitLab Enterprise Edition** +- [Filter commented_approvers for user note authors](gitlab-org/gitlab@5ce58821fc246927747faa0f76f6ac7e632d9c15) ([merge request](gitlab-org/gitlab!81563)) +- [Remove fix_comment_scroll feature flag](gitlab-org/gitlab@af6bf959fd86a248f093c7399b9764e3111bb6ed) ([merge request](gitlab-org/gitlab!79835)) +- [Fix error from invalid sha for `include` files](gitlab-org/gitlab@32fe798699dd18681ac9cb6ad5348e2fe50909c1) ([merge request](gitlab-org/gitlab!81036)) +- [Fix GRPC 500 from BlobsResolver](gitlab-org/gitlab@8eb9f47a6e67b37747c6204a57928c10cb7baa66) ([merge request](gitlab-org/gitlab!80747)) +- [Add error for cross pipeline dependencies](gitlab-org/gitlab@2d2ff9dc0f974a47d729f51623204cb86882d2a0) ([merge request](gitlab-org/gitlab!80513)) +- [Handle received header fallback for missing Delivered-To](gitlab-org/gitlab@8eeeb3d78921b7ec073c70a55aaa76364c395b42) ([merge request](gitlab-org/gitlab!81489)) +- [Fix erroneous all warning from race condition](gitlab-org/gitlab@3e4134e69afe27c3c820a0fe7c32b2cb9e3956e4) ([merge request](gitlab-org/gitlab!81224)) +- [Remove unnecessary margin to the right of the Show comment only dropdown](gitlab-org/gitlab@b5ae5cce465f9cd653a5f240a29c997f47301ce7) by @rajanamistry ([merge request](gitlab-org/gitlab!81449)) +- [Expose merge request flag as boolean in the pipeline entity](gitlab-org/gitlab@c27f9a675dc567726c49fb10fe9446f36682b071) ([merge request](gitlab-org/gitlab!81431)) +- [Fix pull/push mirror authentication fields](gitlab-org/gitlab@c8ce96c6d6126ab591d0e598efb1993e39eb77dc) ([merge request](gitlab-org/gitlab!81419)) +- [Allow admin to register group runners at all times](gitlab-org/gitlab@71ba4d375cfb322e968cc4ceaeaa591f50d2531d) ([merge request](gitlab-org/gitlab!81297)) +- [Fix cross-database modification when resetting CI minutes](gitlab-org/gitlab@5f21e7cc3d0bfc52ff82bbce1d1f47ee0dd8a84b) ([merge request](gitlab-org/gitlab!80161)) +- [Ensures audit events are visible to auditor](gitlab-org/gitlab@0afc16252ce6b95af2464e59d278db9ffcba9f1b) ([merge request](gitlab-org/gitlab!81497)) **GitLab Enterprise Edition** +- [Enable removing import data on failure by default](gitlab-org/gitlab@440e3962fd4d44097a104602d540bc54d5e02aae) ([merge request](gitlab-org/gitlab!81404)) +- [Fix flash color when there is an error](gitlab-org/gitlab@cf6420d41734cee464cb0fd549169cf0a32fa682) by @ali_o_kan ([merge request](gitlab-org/gitlab!81052)) +- [Allow assigning users with private profiles](gitlab-org/gitlab@f13ca808192ef98097c0fee739ad38cc555cad7d) ([merge request](gitlab-org/gitlab!81099)) +- [Fix multiple modals showing when canceling note](gitlab-org/gitlab@30fb9b9699b84b57550a4758b882d65b1fd8fc0b) ([merge request](gitlab-org/gitlab!81310)) +- [Allow admin to register project runners at all times](gitlab-org/gitlab@3d8c4f488b08fdab1908031b4b9546e8b67fc1f9) ([merge request](gitlab-org/gitlab!81298)) +- [Block execution of cyclical pipelines](gitlab-org/gitlab@12f9e6dbc07baaa297e80b5562bc5612a0589bb4) ([merge request](gitlab-org/gitlab!81287)) +- [Ensures audit events are visible to auditor](gitlab-org/gitlab@662a01dcb9d26d916b8186957e3a4c9dd8640075) ([merge request](gitlab-org/gitlab!81267)) **GitLab Enterprise Edition** +- [Truncate Jira app key to be no longer than 64](gitlab-org/gitlab@084ec2d644f453f2bae0970c9fe2d1642d0e1835) ([merge request](gitlab-org/gitlab!80922)) +- [Ensure cleanup job artifacts task does not include pipeline artifacts](gitlab-org/gitlab@1a36a02ce63d4001b105705690ee8da77ee892bb) ([merge request](gitlab-org/gitlab!81022)) +- [Avoid idling in transaction when fetching source for merge requests](gitlab-org/gitlab@1349b8cf09bdc0396522ff10aee04124ec86fa40) ([merge request](gitlab-org/gitlab!80876)) +- [Fix response of `securityTrainingUpdate` mutation](gitlab-org/gitlab@a9fcbb72f1449357a5692b04818b8b983ce287e4) ([merge request](gitlab-org/gitlab!80731)) **GitLab Enterprise Edition** +- [Remove CachingArrayResolver from epic issues](gitlab-org/gitlab@ba02cfd09d56bdc87e42c7c6cfaa0a9ddf0a37e2) ([merge request](gitlab-org/gitlab!80635)) **GitLab Enterprise Edition** +- [Do not mirror protected tags restricted for a creation](gitlab-org/gitlab@e72300fca11097a0c244795b06e43130348eb3b7) ([merge request](gitlab-org/gitlab!80388)) **GitLab Enterprise Edition** +- [Hide white box at bottom of MR diff page](gitlab-org/gitlab@7dc62567ce0d6ec5e650e0538a39e8bde1bece27) ([merge request](gitlab-org/gitlab!81117)) +- [Stop backup files from requiring directories to exist when skipped](gitlab-org/gitlab@e2541c622021b709013d915a283920ec4173691c) ([merge request](gitlab-org/gitlab!81098)) +- [Fix the Content Editor strikethrough shortcut docs](gitlab-org/gitlab@bd689aafcd91ea64742b4a25d0528b8ab602397a) by @smokris ([merge request](gitlab-org/gitlab!81091)) +- [Fix TypeError from Tags::Reference](gitlab-org/gitlab@9a2ee6777644e2dd5d81ea843ea46f69561b241d) ([merge request](gitlab-org/gitlab!80845)) +- [Fix copy button in Enable Review App modal](gitlab-org/gitlab@11d275b36d9c7da44946365bfa51e7ebaf319640) by @aeboyaci ([merge request](gitlab-org/gitlab!80561)) +- [Pass all options from member entity](gitlab-org/gitlab@d8b7136c5f930b7db6d261d462df46b48db93fdc) ([merge request](gitlab-org/gitlab!81046)) +- [Automatically adapt the CSP when snowplow is enabled](gitlab-org/gitlab@7f73ea342359eb628117f332e59263bb79bc617c) ([merge request](gitlab-org/gitlab!78624)) +- [Fix toolbar buttons in Markdown field](gitlab-org/gitlab@bd6522df2cb9019276204da7e6ccc1f052b2678f) ([merge request](gitlab-org/gitlab!80919)) +- [Fix Replace button form path](gitlab-org/gitlab@5c6ac77fad63912a2254aba9b2c48f8aeabe5c5a) ([merge request](gitlab-org/gitlab!80953)) +- [Allow project admin to read project approvals](gitlab-org/gitlab@b103c49e3c200bc9cce0615a1a55427501bd0dd7) ([merge request](gitlab-org/gitlab!80652)) **GitLab Enterprise Edition** +- [Dynamically add AWS URLs to CSP on EKS auth page](gitlab-org/gitlab@6f448c0396315ddda967ed55dd9feefd11c6011e) ([merge request](gitlab-org/gitlab!80576)) +- [Do not count group bot users from shared group towards seat usage](gitlab-org/gitlab@dabae884b2f1afaa37213689568811c4bdd0d79d) ([merge request](gitlab-org/gitlab!80889)) **GitLab Enterprise Edition** +- [Make contribution graph email grouping ignore case](gitlab-org/gitlab@c524cfacbd2a3be25d303c503e34a7be4bf8a9b1) ([merge request](gitlab-org/gitlab!80701)) +- [Don't return 500 error in Commits API when repository is missing](gitlab-org/gitlab@95177859a3421535adc36fa5bb190069d7fbd233) ([merge request](gitlab-org/gitlab!80410)) + +### Changed (194 changes) + +- [Add iteration selector to board scope](gitlab-org/gitlab@ed7049fb25e7d4bebc6d74a980d2bd58255c6666) ([merge request](gitlab-org/gitlab!69052)) **GitLab Enterprise Edition** +- [Block limited broadcast address (255.255.255.255) in UrlBlocker](gitlab-org/gitlab@9ba2dfbeb1e21540e9350859eec6823e73700468) ([merge request](gitlab-org/gitlab!82571)) +- [Migrate to unique indices in projects runners tokens](gitlab-org/gitlab@66c9c3b9e1f1828431119ab3f282495c058d4b1f) ([merge request](gitlab-org/gitlab!81991)) +- [Track git blame clicks from code search results](gitlab-org/gitlab@cbf4c4c64a68e5e8a65e5bc4d46ae7a5bf44adf5) ([merge request](gitlab-org/gitlab!82533)) +- [Split cluster creation page into two pages](gitlab-org/gitlab@d6e1b58f7547f40db9b53f1c27c7eb12d7b178e0) ([merge request](gitlab-org/gitlab!80730)) +- [Prevent group owners from deleting certain project runners](gitlab-org/gitlab@4b488c3049ac9318bdf58ce424a405acc14c99b7) ([merge request](gitlab-org/gitlab!82023)) +- [Remove unnecessary Edit tab in WebIDE](gitlab-org/gitlab@578ef1438606d0e3c2b8e7e288f4fea744361756) by @Bisht13 ([merge request](gitlab-org/gitlab!81366)) +- [Switch AWS "easy button" icons with radio buttons](gitlab-org/gitlab@5e1115f55e58e059af361c097aaad71bbba8d953) ([merge request](gitlab-org/gitlab!82203)) +- [Update error message with importing container repository](gitlab-org/gitlab@fbe5608fae60004a06e0a2855988dbe769cd3948) ([merge request](gitlab-org/gitlab!82730)) +- [Update runner Pause/Resume button labels](gitlab-org/gitlab@6963d4a34f79d659b05a7235c0d655d1ae0f9a51) ([merge request](gitlab-org/gitlab!82702)) +- [Update Jira integration form to have sections](gitlab-org/gitlab@fc40199266c55b6c50ba3a6af5995ad8803dca7f) ([merge request](gitlab-org/gitlab!82970)) +- [Set geo_job_artifact_replication default to true](gitlab-org/gitlab@4bc1a37e76291b5b84eae9243b3ee35fe5c3e650) ([merge request](gitlab-org/gitlab!82906)) **GitLab Enterprise Edition** +- [Use checkboxes to select target roles for broadcast messages](gitlab-org/gitlab@bb22d0083401a8d3964924194b3e3b812ccc502b) ([merge request](gitlab-org/gitlab!80131)) +- [Add frontend validation to avoid duplicate asset link names](gitlab-org/gitlab@965d07d9966853d3f95905af134932ba0d0b60ae) by @emanuelfarias ([merge request](gitlab-org/gitlab!81591)) +- [Adding Secure Files upload limit](gitlab-org/gitlab@3710372c3530bea064640204e57fdc7562d19c65) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82858)) +- [Promote exp: change_continuous_onboarding_link_urls](gitlab-org/gitlab@4c43e3cef10f11ec69962da60db3f4bfcd466605) ([merge request](gitlab-org/gitlab!80906)) +- [Move two-factor authentication callout to the todo-list page](gitlab-org/gitlab@16f27135ede22584735d57fe9f1d32c6a485808d) ([merge request](gitlab-org/gitlab!82612)) +- [Use new vulnerability report for pipeline security tab](gitlab-org/gitlab@b4551ff88a5eef51c653554f9c4aee621ff5ebc2) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81760)) **GitLab Enterprise Edition** +- [Update job page for blocked deployments](gitlab-org/gitlab@e56c04cb5db42f4b43f716b91ff71192308f5b75) ([merge request](gitlab-org/gitlab!82456)) **GitLab Enterprise Edition** +- [Remove block_project_serialization feature flag](gitlab-org/gitlab@2912ac093f963107630ba4e7b1788d9a473bafa1) ([merge request](gitlab-org/gitlab!82866)) +- [Migrate two-factor auth error message to shared HAML partial](gitlab-org/gitlab@65604eaf0ce4be6ee88316d6cd013dded62a994c) ([merge request](gitlab-org/gitlab!82753)) +- [Enable the `geo_token_user_authentication` FF by default](gitlab-org/gitlab@33378ee41d6c487eb688aaf438c0e04dfd070a45) ([merge request](gitlab-org/gitlab!82835)) +- [Do not ensure HEAD is default_branch on snippets](gitlab-org/gitlab@81f2238ec2d21bfa8d6e34214474d0b5f9fd2feb) ([merge request](gitlab-org/gitlab!82731)) +- [Project authorization is unique per user, project](gitlab-org/gitlab@7fc54b1ca86c382662c389ddece169c7cbb0a407) ([merge request](gitlab-org/gitlab!82460)) +- [Change CI lint primary button style](gitlab-org/gitlab@186169740baf93a12bf9bff4ba78496fd18adbfe) by @gtsiolis ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81611)) +- [Add pipeline editor walkthrough feature permanently](gitlab-org/gitlab@4efb2b11021600a0f895c59d78f9bb0584933717) ([merge request](gitlab-org/gitlab!82682)) +- [Add error when acccess denied due to credit card](gitlab-org/gitlab@f2344f3820cf62ab475598c61041d56903a7ab7e) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80657)) **GitLab Enterprise Edition** +- [Turn the subscribable banner into an alert](gitlab-org/gitlab@2e1ea8ecd8963778cfe84334bca000f1ad127ac6) ([merge request](gitlab-org/gitlab!81236)) **GitLab Enterprise Edition** +- [Add configurable search rate limits](gitlab-org/gitlab@803ba15846843113f7eda03dd6d062f413074f9d) ([merge request](gitlab-org/gitlab!80631)) +- [Improve email notification styling](gitlab-org/gitlab@5e88a2bcedc112c83fe6f7321f7c67fd3008432c) by @smokris ([merge request](gitlab-org/gitlab!78604)) +- [Enable API kaminari count with limit](gitlab-org/gitlab@2b8dcb45a380ee40c2a3760ec89afa03c4fa8cc4) by @jaspreet-3911 ([merge request](gitlab-org/gitlab!82003)) +- [Bump GITLAB_KAS_VERSION to 14.9.0](gitlab-org/gitlab@4f09d013774b45590f3dab71faba2e0fb3b79aef) ([merge request](gitlab-org/gitlab!82765)) +- [Revise merge-conflict modal text](gitlab-org/gitlab@b6fa39a018486ee93bf450e21d257bba6eeba8dd) ([merge request](gitlab-org/gitlab!80666)) +- [Rename remove user action](gitlab-org/gitlab@af0a2866bddb68f56ef2812ac00f87e6a296ead5) ([merge request](gitlab-org/gitlab!82109)) +- [Search presenter is a noop when given empty results](gitlab-org/gitlab@2b309e390b2474358908d6799ada2fee0b5969ae) ([merge request](gitlab-org/gitlab!82619)) +- [Restyle project deletion and restoration containers](gitlab-org/gitlab@05503faf43544769f53497b9e2f0effa0dfb11a6) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82313)) **GitLab Enterprise Edition** +- [Remove new environments table feature flag](gitlab-org/gitlab@2a7690c59e83439f1133d7c34f63578deb5e8771) ([merge request](gitlab-org/gitlab!80948)) +- [Add link to incident title](gitlab-org/gitlab@32642d5e4cbb3a564df265791e1ba7a2f7553ef3) ([merge request](gitlab-org/gitlab!82373)) +- [Remove type from ruby template](gitlab-org/gitlab@5c928b128332cbd18e1e4fef3af2bf05bb374681) ([merge request](gitlab-org/gitlab!82686)) +- [Enable feature flags to resume artifact removal](gitlab-org/gitlab@818e748f7e56f56cba0f13ebc8a3b8a64643af61) ([merge request](gitlab-org/gitlab!82681)) +- [Validate urls before attempting to download](gitlab-org/gitlab@bf1443c0bc54a0b2fff8f8594eeb35cedb28cc7a) ([merge request](gitlab-org/gitlab!80700)) +- [Parse Snowplow value as Number](gitlab-org/gitlab@da274cf499696aa40bcfec54e4f30ba5148fdf40) ([merge request](gitlab-org/gitlab!81928)) +- [Remove placeholder and move error message in the form](gitlab-org/gitlab@6eb7350a58ec89904db0442ed5606a908d8471ab) ([merge request](gitlab-org/gitlab!82404)) +- [Update auto-build-image to v1.9.1](gitlab-org/gitlab@b0f44e42e5b6593317cd7083619b8b4412d42e00) ([merge request](gitlab-org/gitlab!80289)) +- [Remove feature flag to read finding evidence model](gitlab-org/gitlab@73b17f4fdeccefecef074d2026279d0c89e8d1bf) ([merge request](gitlab-org/gitlab!82450)) **GitLab Enterprise Edition** +- [Removed compliance_violations_graphql_type feature flag](gitlab-org/gitlab@085a7f27317fdb41eabfad27e6483388c2ddb909) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82603)) **GitLab Enterprise Edition** +- [Enable show_report_validation_warnings by default](gitlab-org/gitlab@94a9eb8f03d636b79c0629752f1ac335c1e9ba47) ([merge request](gitlab-org/gitlab!82520)) +- [Use follow redirects middleware in the Container Registry clients](gitlab-org/gitlab@ffb7697483299fc496affc694e9a0884051a64f5) ([merge request](gitlab-org/gitlab!82614)) +- [Use SAX parser for cobertura coverage reports](gitlab-org/gitlab@6dc4483658c6183db12877fe34ab2014b8322343) ([merge request](gitlab-org/gitlab!82610)) +- [Migrate spinners in approver suggestion partial](gitlab-org/gitlab@e65ad1e60e1975cf7706d6f5477024820bd1c418) ([merge request](gitlab-org/gitlab!82503)) **GitLab Enterprise Edition** +- [Release chat notification branch filter for deployments](gitlab-org/gitlab@ad9573df04405d5577cf68dd7df52a52f34fb1ee) ([merge request](gitlab-org/gitlab!82583)) +- [Add no-sort-reset prop to vulnerability list](gitlab-org/gitlab@43e72012072b081bdde47af1729c077daa6bac05) ([merge request](gitlab-org/gitlab!82588)) **GitLab Enterprise Edition** +- [Update placeholder text in import projects table](gitlab-org/gitlab@80c5f0dce139cb17347379078667849685a54096) ([merge request](gitlab-org/gitlab!82575)) +- [Reduce the number of buckets in Sidekiq histograms](gitlab-org/gitlab@7c912e143b6ea039ce58ee023cc9991e8d52136b) ([merge request](gitlab-org/gitlab!82509)) +- [Wrap alert in a DIV](gitlab-org/gitlab@eddeceff21fa85221d0b8b4deb3f00a582586cfe) by @gitlab-dependency-update-bot ([merge request](gitlab-org/gitlab!81282)) **GitLab Enterprise Edition** +- [Remove vulnerability_finding_replace_metadata flag](gitlab-org/gitlab@0a84a07e9c995f60cef7e6bc0e0687105dae1727) ([merge request](gitlab-org/gitlab!82440)) **GitLab Enterprise Edition** +- [Update group-level compliance framework to match project settings](gitlab-org/gitlab@7f68de064f68e9e9e0c4b7c420d8cce2ac43c1e9) ([merge request](gitlab-org/gitlab!82492)) **GitLab Enterprise Edition** +- [Merge injected KUBECONFIGs for clusters and agents](gitlab-org/gitlab@bc2b67cf6e88f6afb241dd9861c60795c38fccc5) ([merge request](gitlab-org/gitlab!82246)) +- [Fallback to basic search on archived projects](gitlab-org/gitlab@5ba09f808887fc96b91d18aac18341d5353d0885) ([merge request](gitlab-org/gitlab!82517)) **GitLab Enterprise Edition** +- [Added cluster Actions menu to group and admin view](gitlab-org/gitlab@cfe32c2fe7e9c119cfc3b392adbb8778521ce57c) ([merge request](gitlab-org/gitlab!81846)) +- [Remove feature flags for runner token prefix](gitlab-org/gitlab@29bbf97e2bc9b22ef35cc92fb076c14cf2f3fb57) ([merge request](gitlab-org/gitlab!81839)) +- [Fix RSpec/TimecopTravel offenses (Part 2/2)](gitlab-org/gitlab@6a092c053c6195c187afe6589ea52ee6152ee2d4) by @KevSlashNull ([merge request](gitlab-org/gitlab!76034)) +- [Disallow integrated error tracking by default](gitlab-org/gitlab@99ebbe65a746cf04c0eeccc7b93a815f87b4ba64) ([merge request](gitlab-org/gitlab!81767)) +- [Improve and internationalize Deployment Approval error messages](gitlab-org/gitlab@3dbac553b737cee798eaec5f3394661fb7a890fa) ([merge request](gitlab-org/gitlab!82454)) **GitLab Enterprise Edition** +- [Update new issue form to match Pajamas specs](gitlab-org/gitlab@8832a74998ba32b3be15e2bef8ba4a5b157540c7) ([merge request](gitlab-org/gitlab!82425)) +- [Refactor(Groups SSO): migrate to gl-tabs](gitlab-org/gitlab@bde7a342ac79b1c9d0490677cbad7996a8930f42) ([merge request](gitlab-org/gitlab!82512)) **GitLab Enterprise Edition** +- [Enable cleanup policies throttling by default](gitlab-org/gitlab@3cd38afaf2cb736d424e0dec41d481ceeb6109ee) ([merge request](gitlab-org/gitlab!80815)) +- [Global Search - Support non-js searches](gitlab-org/gitlab@65317192013f24f8374e9ba06720cdad00265208) ([merge request](gitlab-org/gitlab!80964)) +- [Update icon, remove text, and switch](gitlab-org/gitlab@f46ec577443c20f1267838234af83e565743cc22) ([merge request](gitlab-org/gitlab!80395)) +- [Allow to hide deployment target on New Project page](gitlab-org/gitlab@31e632190cb09ca72392a731601ff20ad3714d6f) by @wwwjon ([merge request](gitlab-org/gitlab!82485)) +- [Support GraphQL authentication with project tokens](gitlab-org/gitlab@16913601c1852fd09fc6bdc89cd4263fc1e6b1e8) ([merge request](gitlab-org/gitlab!82316)) +- [Migrate Epic Tabs to use Button Group](gitlab-org/gitlab@5f12034bb14cdb1968c3636f4f0db4a388859e82) ([merge request](gitlab-org/gitlab!81978)) **GitLab Enterprise Edition** +- [Extend billable members count to accept requested hosted plan parameter](gitlab-org/gitlab@7703838094e42a16a950aaa3674fe31544bbd0a7) ([merge request](gitlab-org/gitlab!82049)) **GitLab Enterprise Edition** +- [Bump Auto Deploy Image verion to v2.22.0](gitlab-org/gitlab@28e8783ce990ddf443c25e8ab39c38f75a08c6d9) ([merge request](gitlab-org/gitlab!82461)) +- [Consider non-default config files for Security UI](gitlab-org/gitlab@9a74d9ba9bf2a68dde0149aaa3c8c4992b409e5f) ([merge request](gitlab-org/gitlab!81027)) +- [Migrate loading spinners](gitlab-org/gitlab@0e22efabb4ca4ffa3077130c9d0fb4ccc310eefd) ([merge request](gitlab-org/gitlab!82236)) +- [Update project compliance frameworks settings](gitlab-org/gitlab@c1aec2f8a65f1d012cfc2e9aae429eab38d4c3a1) ([merge request](gitlab-org/gitlab!81889)) **GitLab Enterprise Edition** +- [Issue 349398 - Update search field in Global Search](gitlab-org/gitlab@c7720cb353ff473821a5cf17500fe7bc72531822) ([merge request](gitlab-org/gitlab!80916)) +- [Header Search Refactor - Handle Errors in the component](gitlab-org/gitlab@f0d356994a99ad4bb6ad938bcb085fd17be7b714) ([merge request](gitlab-org/gitlab!80746)) +- [Migrate spinners in archived projects partial](gitlab-org/gitlab@223b665a5985429409fa2d229ca925eeb65b3167) ([merge request](gitlab-org/gitlab!82385)) +- [Migrate spinners in user's overview](gitlab-org/gitlab@9a365876efc4bd00e195833667c3736249cdf6ab) ([merge request](gitlab-org/gitlab!82379)) +- [Migrate spinners in explore groups partial](gitlab-org/gitlab@b3e58fccee2018a3326c3ea4e16ea8bd0eb1fa47) ([merge request](gitlab-org/gitlab!82377)) +- [Creates audit event when approval rule is deleted](gitlab-org/gitlab@1f1d3801c8648ba4e5491364bcb9f924a05dc155) ([merge request](gitlab-org/gitlab!82297)) **GitLab Enterprise Edition** +- [Creates audit event on approval rule creation](gitlab-org/gitlab@adcddf4419f946b1f31449300149f919508efd2a) ([merge request](gitlab-org/gitlab!81973)) **GitLab Enterprise Edition** +- [Update Auto DevOps docker versions to 20.x](gitlab-org/gitlab@f71efa773512bda0430400817ff0f22fd906a156) ([merge request](gitlab-org/gitlab!82353)) +- [Remove constraints from sprints table](gitlab-org/gitlab@444a02c30a39a844e40bcc0ab9b00fde2c835013) ([merge request](gitlab-org/gitlab!82169)) +- [Move Geo repository updated event creation into a worker](gitlab-org/gitlab@d12d94cc3e35d6e0593e5639d2628a6f1d8b4f5d) ([merge request](gitlab-org/gitlab!80971)) **GitLab Enterprise Edition** +- [Migrate loading icon to be Pajamas compliant](gitlab-org/gitlab@9b70879b5dd948fdcacddb91a720658995cab83c) ([merge request](gitlab-org/gitlab!81985)) +- [Migrate loading spinners](gitlab-org/gitlab@0382386fc0c5eb3f67bcd4ffc3c21ca85a5cb6b3) ([merge request](gitlab-org/gitlab!82334)) +- [Move default branch protection to repository settings](gitlab-org/gitlab@1a8206261fbda415a12792893cf6e6277fd84bae) ([merge request](gitlab-org/gitlab!81012)) +- [Migrate loading spinners](gitlab-org/gitlab@dc0024941f8766631a88768c206ccc19c51658d7) ([merge request](gitlab-org/gitlab!82324)) +- [Update registration enabled callout](gitlab-org/gitlab@bb5253b2516dc17578d9bb05cf5e04d44028a547) ([merge request](gitlab-org/gitlab!80972)) +- [Migrate loading spinners](gitlab-org/gitlab@a14c08ae439075b20874fdaa874812bfda4f2198) ([merge request](gitlab-org/gitlab!82238)) +- [Iteration search uses cadence and iteration titles](gitlab-org/gitlab@2ef936654487e08fe3944bb5548302e3867253d5) ([merge request](gitlab-org/gitlab!81615)) **GitLab Enterprise Edition** +- [Display license ID retrieved from CustomersDot](gitlab-org/gitlab@6d9df1c3c44ca74bd8e4d23a7ed48f34dd898da0) ([merge request](gitlab-org/gitlab!82112)) **GitLab Enterprise Edition** +- [Re-introduce role-targeted broadcast messages](gitlab-org/gitlab@c7a8a89c7513b0951f6b0994fe7505b3a9100810) ([merge request](gitlab-org/gitlab!81232)) +- [Use GlAvatar in security dashboard](gitlab-org/gitlab@c5ac6e5ea076ab5451c6a62cf9a3cc30fc0c665e) ([merge request](gitlab-org/gitlab!82172)) **GitLab Enterprise Edition** +- [Remove personal_project_owner_with_owner_access feature flag](gitlab-org/gitlab@ad3f27b2a70e29c026d5a92e834ec72462a1182a) ([merge request](gitlab-org/gitlab!82088)) +- [Use the environment tier for jira connect deployment environment type](gitlab-org/gitlab@87a9dfa80b339fa71db4838fc76696b420c4dbff) by @alanandrade ([merge request](gitlab-org/gitlab!80539)) +- [Add unique index for security training providers](gitlab-org/gitlab@8cfba7dbb1a7203de0b4998b14976e67e7753e75) ([merge request](gitlab-org/gitlab!82235)) +- [Allow tags as target of pipeline scheduled](gitlab-org/gitlab@f6e9762d39ab883f33853a107057b5ed370e630b) by @KevSlashNull ([merge request](gitlab-org/gitlab!81476)) +- [Migrate group/project member spinners](gitlab-org/gitlab@bfa13484ec47ece14aff14f0e3fba4b7c5f478a0) ([merge request](gitlab-org/gitlab!82225)) +- [Migrate legacy spinner](gitlab-org/gitlab@02e6cb553e7338ca40d5e05f3c49593a201e5d4e) ([merge request](gitlab-org/gitlab!81840)) +- [Disable multi-project viz for free users](gitlab-org/gitlab@d362c451cfeeca06ec04ba6f5d8c731a9a391f89) ([merge request](gitlab-org/gitlab!79889)) +- [Update Import object persistence approach](gitlab-org/gitlab@489555c94e0e24467e12b5a2ef5b9375800d2e78) ([merge request](gitlab-org/gitlab!79963)) +- [Correct text of Banner message label](gitlab-org/gitlab@24ed46db54b5196442e3742f91485d0ebc3c8437) ([merge request](gitlab-org/gitlab!81221)) **GitLab Enterprise Edition** +- [Remove non-human created tokens from PAT list](gitlab-org/gitlab@7b893669b389b340759877d11c329dbff305759c) ([merge request](gitlab-org/gitlab!80716)) **GitLab Enterprise Edition** +- [Remove non-human created tokens from PAT list](gitlab-org/gitlab@34ded80954ee5e3c966c6602bb24b6feb00d0555) ([merge request](gitlab-org/gitlab!80716)) **GitLab Enterprise Edition** +- [Update maximum allowable lifetime message for PAT](gitlab-org/gitlab@5c71c8adc2c36c47fbc4303e9a89d95c27a85807) ([merge request](gitlab-org/gitlab!81949)) **GitLab Enterprise Edition** +- [Disable the PA commit button when there are no changes](gitlab-org/gitlab@632aefed5070daeb034e127c2df5edf27d59e633) ([merge request](gitlab-org/gitlab!81531)) +- [Add the "Support Ukraine" tanuki](gitlab-org/gitlab@72585cf30f5ef613bb3056e93e12985a69f82e3b) ([merge request](gitlab-org/gitlab!82050)) +- [Link new issue to original via checkbox](gitlab-org/gitlab@4c30e09e1b3b8b84bce36770ce59a351bd87fedb) by @smokris ([merge request](gitlab-org/gitlab!80556)) +- [Migrate gfm loading spinner](gitlab-org/gitlab@f79d23fc39b1e83211ae426d28c10ac40dc5b743) ([merge request](gitlab-org/gitlab!82111)) +- [Use report-declared version of the schema](gitlab-org/gitlab@0ecb51dee1eae742f8c0e294f1ef68468fb37324) ([merge request](gitlab-org/gitlab!81907)) **GitLab Enterprise Edition** +- [Migrate MAINTAINER access memberships to OWNER](gitlab-org/gitlab@0ff770b001fe3c6f3766a8fd32bbdcac17c70439) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80146)) +- [Surface validation errors as warnings](gitlab-org/gitlab@855c036adebba757cdbc928259288d6b66521867) ([merge request](gitlab-org/gitlab!80930)) **GitLab Enterprise Edition** +- [Migrate loading icon](gitlab-org/gitlab@a66ddd653a41b6e549a590218d004b7f1399e744) ([merge request](gitlab-org/gitlab!82042)) +- [Geo secondary proxying: serve assets locally](gitlab-org/gitlab@c350122401906ee1c74066b96f71b721b72dd222) ([merge request](gitlab-org/gitlab!79761)) **GitLab Enterprise Edition** +- [Replace n/a with a hyphen in the runners table](gitlab-org/gitlab@69ac20935dd4ed56e8b9a5fedd56f2d013bf7fa7) ([merge request](gitlab-org/gitlab!81904)) +- [Update Secret Detection template](gitlab-org/gitlab@ef2904cd4e61c386fc6c8a040e6a806e23c7a9f8) ([merge request](gitlab-org/gitlab!80326)) +- [Add alert and disable active checkbox](gitlab-org/gitlab@fd5388c670b38f483d9458cf9a9300b60f6c072a) ([merge request](gitlab-org/gitlab!81896)) +- [Improve UI text of sign-in restrictions](gitlab-org/gitlab@9a1f8721ed0b8c87258194323d5d4b443b0e92f2) ([merge request](gitlab-org/gitlab!81776)) +- [Put deprecated serverless features behind feature flag](gitlab-org/gitlab@ef88f5c53871d6c7ad795887751381f0276de1ea) ([merge request](gitlab-org/gitlab!81493)) +- [Add BlocksUnsafeSerialization to Project](gitlab-org/gitlab@9b3f3d30f385f6fe1c972a5b91b8d6bda9dc7426) ([merge request](gitlab-org/gitlab!81900)) +- [Add default_branch to KAS responses](gitlab-org/gitlab@73788fa265be7c6bcc2852e64ee07f4e7f3b06af) ([merge request](gitlab-org/gitlab!81950)) +- [Use GlButtonGroup instead of GlSegmentedControl](gitlab-org/gitlab@4f5a1079ea2b6c96c5d62dd3a8b7323e927b103a) ([merge request](gitlab-org/gitlab!81278)) **GitLab Enterprise Edition** +- [Change loading state jobs tab](gitlab-org/gitlab@a1dcec6771d3d65c477b94e7fa8d9425e40db8c7) ([merge request](gitlab-org/gitlab!81568)) +- [Increase pipeline editor debounce to 500ms](gitlab-org/gitlab@c6de5d893856852b8ea23c38199eb6e63c42a3e1) ([merge request](gitlab-org/gitlab!81534)) +- [Set danger variant and label to delete WA Device](gitlab-org/gitlab@5a2e927aed0c8ad2d30d1b02fee19dceec5dd850) ([merge request](gitlab-org/gitlab!81868)) +- [Set danger variant and label to destroy oauth app](gitlab-org/gitlab@45ced1f5836302b14801af57624058ed71c241d0) ([merge request](gitlab-org/gitlab!81854)) +- [Set variants and labels to abuse report buttons](gitlab-org/gitlab@fce6201af9a961ecafa023b07b21665bfbde3228) ([merge request](gitlab-org/gitlab!81871)) +- [Set danger variant to delete artifact button](gitlab-org/gitlab@94a283f6447149ed9bae4c81f7d21966f86959c5) ([merge request](gitlab-org/gitlab!81877)) +- [Set danger variant & labels for appearance buttons](gitlab-org/gitlab@8c3b077aee8e6f1270a07f8f721d44b3dde21cf8) ([merge request](gitlab-org/gitlab!81878)) +- [Improve Sourcegraph settings text](gitlab-org/gitlab@da795bdf58234910ce2c3a1339cf1dfe863292d6) ([merge request](gitlab-org/gitlab!81223)) +- [Remove pipeline editor button from blob view](gitlab-org/gitlab@932a7de395f0ed97d2e9545677e591040aad99a4) ([merge request](gitlab-org/gitlab!81903)) +- [Refine copy for Jira integration](gitlab-org/gitlab@c9e336f4811de2e32ca79f3bf2ada1996a1fb259) ([merge request](gitlab-org/gitlab!81819)) +- [Project quality summary: add test runs empty state](gitlab-org/gitlab@bbe504d8f0b499f1b21e22ed60e112078141465f) ([merge request](gitlab-org/gitlab!78498)) +- [Backfill `member_namespace_id` for `GroupMember`](gitlab-org/gitlab@019e70a88d1abddc2b590eb6ba7e9cb0b95c1370) ([merge request](gitlab-org/gitlab!78715)) +- [Merge branch 'user-validation-failed-message' into 'master'](gitlab-org/gitlab@6d582ea07e7b560945f4d89b56802f62920d5657) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80304)) +- [Improve user validation failed message](gitlab-org/gitlab@8a37bdae51be4f7c283bf37e2d984f948e020c3c) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/80304)) +- [Remove releases with NULL tags and add not-NULL constraint](gitlab-org/gitlab@9896cafbbcbb9ca8dc8febe96d1ad14d636d1279) ([merge request](gitlab-org/gitlab!80664)) +- [Replace success with confim variant](gitlab-org/gitlab@3f0c7a8e2a5f7c1580cbbcb34e7deb274572fdab) ([merge request](gitlab-org/gitlab!81837)) +- [Suggest backend reviewer for erb and haml files](gitlab-org/gitlab@0ef97f29b696626cdd380e56f67a52d35878c9e3) ([merge request](gitlab-org/gitlab!81542)) +- [Add Gitlab.revision to Gitlab::JsonCache cache_key by default](gitlab-org/gitlab@5cd29114c5846471e053577198cb9ad5942a3e1a) ([merge request](gitlab-org/gitlab!81413)) +- [Replace window.confirm with GlModa in environment actions](gitlab-org/gitlab@94ec1ed345e5db641956a33b2cc97bb618f38203) ([merge request](gitlab-org/gitlab!80425)) +- [Use instrumentation classes for Service Ping generation](gitlab-org/gitlab@22174f888e7cc8853bf698d413a9585b81d151ad) ([merge request](gitlab-org/gitlab!81520)) +- [Remove null constraint from security_scan_succeeded column](gitlab-org/gitlab@cc442d0ddbb132fe2b7ac52105ac7e54379b9bd0) by @svdj ([merge request](gitlab-org/gitlab!81322)) +- [Improve the labels on Kubernetes Agent UI](gitlab-org/gitlab@7a78b512e7f825dd31cef0e429669c93e7fb4584) ([merge request](gitlab-org/gitlab!81606)) +- [Expose created_at when serializing Deployment Approvals](gitlab-org/gitlab@428038a04d30bf048b10de1a2acae4e913a1069a) ([merge request](gitlab-org/gitlab!81487)) **GitLab Enterprise Edition** +- [Split rebase action buttons into two separate buttons](gitlab-org/gitlab@696f7462255c2604f97a46ab6472b895aadd4465) by @KevSlashNull ([merge request](gitlab-org/gitlab!81335)) +- [Reword 'build' to 'pipeline' in todos](gitlab-org/gitlab@fee372c20e83539ae5e9b41ce03181eb87a9fc9f) by @KevSlashNull ([merge request](gitlab-org/gitlab!75901)) +- [Update pipeline labels](gitlab-org/gitlab@ad48c74a8b0542b0db3f74aeff1eb32c9e48df89) ([merge request](gitlab-org/gitlab!81032)) +- [Re-position the erase log button](gitlab-org/gitlab@54003d98518906d74c9b0f3484f695a631a78f19) ([merge request](gitlab-org/gitlab!81049)) +- [Adjust incident list column widths and truncation ](gitlab-org/gitlab@b1b639c986813bfe9ee8e819156671c1a1ab6fdf) ([merge request](gitlab-org/gitlab!80645)) +- [Replace the gitlab import haml modal with a GlModal](gitlab-org/gitlab@42bcf23bdcc38cfbc14ae1296aff949721df6689) ([merge request](gitlab-org/gitlab!80863)) +- [Adds a notification for a future dated license](gitlab-org/gitlab@7fa25e26d01c92b7af3c731e4d494dc80ee4d2ab) ([merge request](gitlab-org/gitlab!77304)) **GitLab Enterprise Edition** +- [Use strong params for ProjectsController by default](gitlab-org/gitlab@8dc1b646fe9da7a95f74cfb2d9d51b72bdbed619) ([merge request](gitlab-org/gitlab!81392)) +- [Update iteration lists](gitlab-org/gitlab@d72a96bf2bb35dd8a80bc674f1770500bcc84c20) ([merge request](gitlab-org/gitlab!78039)) **GitLab Enterprise Edition** +- [Improve accessibility on empty project page](gitlab-org/gitlab@747130b16d92231a506c86b1b7d46eac7f5dafa1) ([merge request](gitlab-org/gitlab!81265)) +- [Use GlAvatar in operations dashboard](gitlab-org/gitlab@22b275427d636ae0b5ff3333ec5a660e62e02454) ([merge request](gitlab-org/gitlab!81233)) **GitLab Enterprise Edition** +- [Update trial status reminder design](gitlab-org/gitlab@2ef8e7b8049bf059241280b3906814a56120acd8) ([merge request](gitlab-org/gitlab!80611)) **GitLab Enterprise Edition** +- [Hide issue header dropdown button if there are no actions](gitlab-org/gitlab@e09446bbd1179cf7b9ad6d316d065e23a4bc2c77) by @KevSlashNull ([merge request](gitlab-org/gitlab!76055)) +- [Use groups API for Approvals form by default](gitlab-org/gitlab@1722e7adc88ff3abe51fcf287f91dc293aa2dcd3) ([merge request](gitlab-org/gitlab!80933)) **GitLab Enterprise Edition** +- [Remove the VSA duration chart stage dropdown](gitlab-org/gitlab@a5a58e7e7aeb329ed261897c999817cc77b47816) ([merge request](gitlab-org/gitlab!80365)) **GitLab Enterprise Edition** +- [Introduce new jobs tab](gitlab-org/gitlab@573741bcde8a1e62231c820f8fe992f5ca01363a) ([merge request](gitlab-org/gitlab!79631)) +- [Rate limit epic create service](gitlab-org/gitlab@de97dfabebb77f1cbcccc28f2217e92a9e8fbe55) ([merge request](gitlab-org/gitlab!80909)) **GitLab Enterprise Edition** +- [Use sentence case for trigger events](gitlab-org/gitlab@73c8339829e3004dcd7e951ebdf7f8e188a2002f) ([merge request](gitlab-org/gitlab!80899)) +- [Remove GlAlert contained prop](gitlab-org/gitlab@4d4ae050480e41cc796908879c08bd02f53e8c7b) ([merge request](gitlab-org/gitlab!81167)) **GitLab Enterprise Edition** +- [Switched title to h1 on issues](gitlab-org/gitlab@62fe29f4c160b8b439503b1acc26fe44a2e17ad4) ([merge request](gitlab-org/gitlab!75248)) +- [Improve Amazon EKS settings text](gitlab-org/gitlab@111b8f2c031b6bebd348682641112b02698960b3) ([merge request](gitlab-org/gitlab!81114)) +- [Stop using type, and use type_new instead](gitlab-org/gitlab@3e6da3aaa23204f45b35b3698d07b984b9ed76ce) ([merge request](gitlab-org/gitlab!80065)) +- [Drop show_diff_preview_in_email column](gitlab-org/gitlab@8395ee778260fa68fd4e6f956b4bcb3e9e064d55) ([merge request](gitlab-org/gitlab!81200)) +- [Add aria-label and tooltip to the emoji picker](gitlab-org/gitlab@a59272bceca5f866fbb43dd02da1daa01b8c7d42) ([merge request](gitlab-org/gitlab!68297)) +- [Update cleanup policy parameters](gitlab-org/gitlab@40398dffd2b17b93f8dca1807de08e12b9049f51) ([merge request](gitlab-org/gitlab!80809)) +- [Increase text limit of maintainer_note field](gitlab-org/gitlab@9e754ee50718ccc95f4e28ec1f8509a20088e27e) ([merge request](gitlab-org/gitlab!81137)) +- [Clear future subscriptions info on license destroy](gitlab-org/gitlab@80b5526d8fb38198773f41e9afc7d1f6b5714822) ([merge request](gitlab-org/gitlab!80330)) **GitLab Enterprise Edition** +- [Change button variant to confirm in Web IDE modals](gitlab-org/gitlab@b4603317985e5ec556bbd92f66f1f47f3418e0ee) ([merge request](gitlab-org/gitlab!80780)) +- [Allow only topic names that are case insensitive unique](gitlab-org/gitlab@c98cb46f3378ebf7405a3e99f434ed8fb0fba271) by @wwwjon ([merge request](gitlab-org/gitlab!79826)) +- [Return project delete errors](gitlab-org/gitlab@72d3dcf6c382c060ec0ac0cf376ff05eda8d355c) ([merge request](gitlab-org/gitlab!78500)) +- [Replace GlSegmentedControl with GlDropdown](gitlab-org/gitlab@6d20f713f7a37fddc869b486ca0e543f71470441) ([merge request](gitlab-org/gitlab!81113)) +- [Change the order column of topics to non_private_projects_count](gitlab-org/gitlab@99f6dfc88b70a531b695d9d54df2c6bb28ac293e) by @wwwjon ([merge request](gitlab-org/gitlab!80478)) +- [Removed rate_limited_service_issues_create flag](gitlab-org/gitlab@e2e94cce73d89d27f11403eaa5bdce6f90ed59a4) ([merge request](gitlab-org/gitlab!80990)) +- [Migrate create protected branch form to GlToggle](gitlab-org/gitlab@66ed251bb9dbe7defbec50f600a82855b084b6b1) ([merge request](gitlab-org/gitlab!80548)) +- [Deprecate test reports relationship with requirements](gitlab-org/gitlab@bd97abee754fb3acd64a18845d77332df9c31ab7) ([merge request](gitlab-org/gitlab!78120)) **GitLab Enterprise Edition** +- [Update registry regex to allow 4 levels](gitlab-org/gitlab@410c970974170522ba87fc5b0cd52f00ce72863c) ([merge request](gitlab-org/gitlab!80929)) +- [Validate NOT NULL on security_findings.uuid column](gitlab-org/gitlab@e0e968681363a80e1e17146aa6f073643d72eafc) ([merge request](gitlab-org/gitlab!80912)) +- [Migrate edit protected branch form to GlToggle](gitlab-org/gitlab@1648af2459591cb3f86b4a2862feb4b94bc70b3c) ([merge request](gitlab-org/gitlab!80549)) +- [Clean up feature flag publish_project_deleted_event to enable by default](gitlab-org/gitlab@4d49dff5001aa842e250bb42aa55dfd16154e63b) ([merge request](gitlab-org/gitlab!80875)) +- [Default to delayed deletion for projects not in personal namespace](gitlab-org/gitlab@b420e180be529965e6e6111aa06be187d46d4cec) ([merge request](gitlab-org/gitlab!80139)) +- [Enable scan_result_policy by default](gitlab-org/gitlab@d39e2c8a0756d2fc520e668137267aa021bde65e) ([merge request](gitlab-org/gitlab!80831)) **GitLab Enterprise Edition** +- [Append URL issue description to template](gitlab-org/gitlab@3a6ed05de16d6e5e0d705973785db400750dbd4e) by @smokris ([merge request](gitlab-org/gitlab!80554)) +- [Remove fork_project_form feature flag](gitlab-org/gitlab@9e2d32da4ae18da3b441583c0b36e04726e536ae) ([merge request](gitlab-org/gitlab!77181)) +- [Add SUPPORTED_VERSIONS and DEPRECATED_VERSIONS to SchemaValidator](gitlab-org/gitlab@d79f6b5bfbdac89e4d375e8fe5f76d22f39513c3) ([merge request](gitlab-org/gitlab!80498)) +- [Update documentation for Usage quota](gitlab-org/gitlab@e039019fc82f899cb950dc7d12d398f17adceb93) ([merge request](gitlab-org/gitlab!80182)) + +### Deprecated (3 changes) + +- [Deprecate VALIDATE_SCHEMA configuration variable](gitlab-org/gitlab@959c1422f429f8e7411a89eaff9119ffdd3b7159) ([merge request](gitlab-org/gitlab!82449)) +- [Add deprecation notice to NetworkPolicyConnection](gitlab-org/gitlab@8337c8bb4da57a543c9a1312e4e7d953d870dfbb) ([merge request](gitlab-org/gitlab!82441)) **GitLab Enterprise Edition** +- [feat: Update SECURE_ANALYZER_PREFIX in all Sec Section templates](gitlab-org/gitlab@382bd94d9ef13b07603f29ce39b54b4699cf8f77) ([merge request](gitlab-org/gitlab!80342)) + +### Removed (10 changes) + +- [Clean up import and other invite members modal rollout pieces](gitlab-org/gitlab@20f015094137ad2703d5116afbd55e7bf3cbb500) ([merge request](gitlab-org/gitlab!82821)) +- [Untrack external_pull_requests row deletions](gitlab-org/gitlab@75ac2ecd0935b2969650bbff52c7fbc8eb343364) ([merge request](gitlab-org/gitlab!82476)) +- [Remove support for unsafe regular expressions](gitlab-org/gitlab@4c75b10e3c9c7a0740d99dae0d4fea20bf48868e) ([merge request](gitlab-org/gitlab!79611)) +- [Drop unused partitioned_foreign_keys table](gitlab-org/gitlab@42913c5ab28e980c244bbd42bfba4dd34bb4c2b1) ([merge request](gitlab-org/gitlab!82215)) +- [Cleanup Code Quality Walkthrough experiment](gitlab-org/gitlab@2333b6ecc57cbdd95e69a7c30b254e7ba3ac44c0) ([merge request](gitlab-org/gitlab!82106)) +- [Cleanup Ci Runner Templates experiment](gitlab-org/gitlab@6634d3a35dfd7bd3d5220de859f50b06e5a99f19) ([merge request](gitlab-org/gitlab!81168)) +- [Remove :cluster_vulnerabilities feature flag](gitlab-org/gitlab@e7b5b39bbb1ebfe8012de88222c88b1fef4aa00a) ([merge request](gitlab-org/gitlab!81462)) **GitLab Enterprise Edition** +- [Clean up forcibly_show_trial_status_popover experiment](gitlab-org/gitlab@1b93b0c39b65422c07807b4f849778cbd0834efb) ([merge request](gitlab-org/gitlab!80413)) +- [Remove `security_report_ingestion_framework` feature flag](gitlab-org/gitlab@db93cc96fe2ef4478531f7f27b212500b0b98df1) ([merge request](gitlab-org/gitlab!81021)) **GitLab Enterprise Edition** +- [Remove cache_shared_runners_enabled FF](gitlab-org/gitlab@ed2cd31564381453db86800027e5ff823fd53602) ([merge request](gitlab-org/gitlab!81143)) + +### Security (16 changes) + +- [Set nosniff header on assets requests](gitlab-org/gitlab@72b2cb327beba926ad3a62af525521820d79f7a7) ([merge request](gitlab-org/gitlab!82563)) +- [Default enable header_read_timeout_buffered_io](gitlab-org/gitlab@4dde99e1d90e7cb115d113a6cc132d11b7b65488) ([merge request](gitlab-org/gitlab!81910)) +- [Escape branch names in push instructions](gitlab-org/gitlab@e1f3fd2be8b76cdd45e6f44615f5eed185a0844b) ([merge request](gitlab-org/gitlab!82448)) +- [Create Error.rb, update ProcessPolicyService](gitlab-org/gitlab@e2250af72ad76e736d3adc5977a97af346570094) by @FacVain ([merge request](gitlab-org/gitlab!79667)) **GitLab Enterprise Edition** +- [Add Integration.encrypted_properties](gitlab-org/gitlab@0ee6c61d8051661ffbc789f1af81a5c63c412fed) ([merge request](gitlab-org/gitlab!80219)) +- [Warn when snippet contains unretrievable files](gitlab-org/gitlab@f9dc8a613d6fe05c55f9384141597a2664210c24) +- [Change runners_token prefix for Group and Project](gitlab-org/gitlab@08873630734bdd1efbcf7eb9b0e334c7b3babcb0) +- [Add runners_token prefix to Group and Project](gitlab-org/gitlab@518468d38df9bf0d62ede1f70f383d495ed333a0) +- [Only expose `id` and `name` attributes when serializing deploy token](gitlab-org/gitlab@b893d583b15e68ed8065148773165d79c5fce7ec) ([merge request](gitlab-org/gitlab!81587)) +- [Prevent DOS when rendering math markdown](gitlab-org/gitlab@40b1b67a4c437304ab4646207cb5bbb420ce9ec8) +- [Limit commands_changes to certain keys](gitlab-org/gitlab@ae5a7735ffebfeed8d99e266a41a196eca0d60c2) +- [Reset password field on page load](gitlab-org/gitlab@76b35cdba11c280a29f89af3dfbb395a9af44f99) +- [Check permission when creating members through service](gitlab-org/gitlab@2063a3b626e9927380633603719a3c6bbe9dc447) +- [Check for unsafe characters in email addresses before sending](gitlab-org/gitlab@97f804b394ee1e2b36972b12240d27c7ad1bc671) +- [Anonymous user can enumerate all users through GraphQL endpoint](gitlab-org/gitlab@8e550ad519d1c74f82b8e3f900a212ffb495e626) +- [Exif metadata not stripped when uploading image attachments via Emails](gitlab-org/gitlab@5dd9cc8fe85e0435db0891e22b22dc58ebb824d7) ([merge request](gitlab-org/gitlab!80735)) + +### Performance (10 changes) + +- [Improve performance of group releases endpoints](gitlab-org/gitlab@c259d6af344b1016cb332f1683d24fcba4353125) ([merge request](gitlab-org/gitlab!80093)) +- [Load highlight.js languages asynchronously](gitlab-org/gitlab@6b881013f3b8152d2a10138118eef91f6d872595) ([merge request](gitlab-org/gitlab!82638)) +- [Add index on releases table to resolve cicd settings page timeout](gitlab-org/gitlab@74e0a1394f144ed0e4cf2c2000574ee8a0f3cfc9) ([merge request](gitlab-org/gitlab!82506)) +- [Fix slow query for "All" tabs in "Your projects" activity page](gitlab-org/gitlab@c12eb806b05da2abfd282e3c9fd5bf7058b4e7cf) ([merge request](gitlab-org/gitlab!82296)) +- [Drop old index for security ci builds on name and id parser](gitlab-org/gitlab@7e03d6ad1bbbcc861f8e5e4a6ec815db7c1c5c3f) ([merge request](gitlab-org/gitlab!82354)) +- [Create new index for security ci builds with new features](gitlab-org/gitlab@fdd7c1db3d5b1086a72e29b0f5bd1b202d121637) ([merge request](gitlab-org/gitlab!82047)) +- [Recreate index for security builds to include fuzzing jobs](gitlab-org/gitlab@c49556695136d525f05bc4eef0c9af1146d9d958) ([merge request](gitlab-org/gitlab!81586)) +- [Schedule async weekend build of index for job traces](gitlab-org/gitlab@1487cf22f9cc62cd872b4f34584fe5feba6daca3) ([merge request](gitlab-org/gitlab!81341)) +- [Decrease the default fast statement timeout](gitlab-org/gitlab@f4590fd25760f9a2faa3f83b8d8364b85404a1a3) ([merge request](gitlab-org/gitlab!81270)) +- [GlTableLite in favor of GlTable for runners list](gitlab-org/gitlab@eff40efc7d434ae03a57b348a8cd8b4d78591750) ([merge request](gitlab-org/gitlab!80928)) + +### Other (82 changes) + +- [Adjust NullifyOrphanRunnerIdOnCiBuilds batch parameters](gitlab-org/gitlab@4c0efcd32868b6bdb156f3d692a3ed9bf2388a72) ([merge request](gitlab-org/gitlab!83094)) +- [Remove duplicate releases from projects](gitlab-org/gitlab@81a5a6f417922316a4a9d45fe8f6d22b34be3ae3) ([merge request](gitlab-org/gitlab!82335)) +- [Pass formats explicitly when rendering .html format](gitlab-org/gitlab@0481fdffaa0f0b591f4c4513976ab9b5350e7e92) by @edith007 ([merge request](gitlab-org/gitlab!75784)) +- [Complete environments `GET` API docs](gitlab-org/gitlab@dd75643207db136116dce6d969710e4f6adf95cc) by @tuxtimo ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82980)) +- [Add statistics seats card](gitlab-org/gitlab@b7e33581018e9ffa955a250a77a9d43394c1b069) ([merge request](gitlab-org/gitlab!80260)) **GitLab Enterprise Edition** +- [Remove `maxlength` limit from the project description textarea](gitlab-org/gitlab@8089d69fd4dcab624b39e5c05b35de37c0834f62) ([merge request](gitlab-org/gitlab!82812)) +- [Add support for relating epics](gitlab-org/gitlab@0a36bbc54b9db652e4f9a3d2b6d770936371f6b8) ([merge request](gitlab-org/gitlab!82128)) **GitLab Enterprise Edition** +- [Revert changes about moving methods to base class](gitlab-org/gitlab@88ad6814dfd0c17c1ea78609de30fd6897957e9a) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82849)) **GitLab Enterprise Edition** +- [Add list related epic links API documentation](gitlab-org/gitlab@709930602b75acce740056bfefb806ce2ad4e208) ([merge request](gitlab-org/gitlab!82628)) +- [Remove restrict_special_characters_in_project_path feature flag](gitlab-org/gitlab@9aa12e3b7d5e485fd94fcec3b06cbb4906b52480) ([merge request](gitlab-org/gitlab!82807)) +- [Update import manifest alert](gitlab-org/gitlab@a15c7181b47acdc661a29e34690d9908ba2ae440) ([merge request](gitlab-org/gitlab!82761)) +- [Update gcp signup offer to alert partial](gitlab-org/gitlab@f05cb91d5142b1d699e8e0f9bb5876fb8e61100e) ([merge request](gitlab-org/gitlab!82759)) +- [Update runner edit alert to use partial](gitlab-org/gitlab@b661d85b502b634f331d9175b2b5d40737abe90d) ([merge request](gitlab-org/gitlab!82758)) +- [Fix GraphQL/FieldMethod offense (Part 1/2)](gitlab-org/gitlab@ff8b0e5be942f5b8d1de67e19ac28d2180d10c3e) by @KevSlashNull ([merge request](gitlab-org/gitlab!76020)) +- [Remove dependency list usage data from Redis](gitlab-org/gitlab@91b4a64615b667331cc1ee8407e623c2e520103e) ([merge request](gitlab-org/gitlab!82604)) **GitLab Enterprise Edition** +- [Remove corpus management feature flags](gitlab-org/gitlab@b504880a7f839d48025938fe632269a1be926cc8) ([merge request](gitlab-org/gitlab!82463)) **GitLab Enterprise Edition** +- [Fix artifacts with wrong expire_at date](gitlab-org/gitlab@bbc5329a58bd25c629ac9f318b92e3b37c16db08) ([merge request](gitlab-org/gitlab!82084)) +- [Update data in batches while deleting a user](gitlab-org/gitlab@049a428c8e008f822d79011cbd978456a40a9751) ([merge request](gitlab-org/gitlab!81429)) **GitLab Enterprise Edition** +- [Document performance implication of the feature flags](gitlab-org/gitlab@bfce1da9a755c3a62844cc62022a27d65be23464) ([merge request](gitlab-org/gitlab!81880)) +- [Remove real-time feature flags](gitlab-org/gitlab@ea7853ac062b234a13444b0a92da773ce1b2f0b4) ([merge request](gitlab-org/gitlab!82378)) +- [Move reactive cache methods to base class](gitlab-org/gitlab@0e91a796b8ca11be25284a12cfceb8f19ade63e9) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82442)) **GitLab Enterprise Edition** +- [This enables the pipeline_schedules_with_tags feature flag](gitlab-org/gitlab@ed19925c1b86a58044047fe721e7aedd5ec95171) ([merge request](gitlab-org/gitlab!82428)) +- [Remove the invite members modal feature flag](gitlab-org/gitlab@f953bfffaa7c46aa0cb0d3d7ed1b63df0f2e7be3) ([merge request](gitlab-org/gitlab!81940)) **GitLab Enterprise Edition** +- [Remove feature flag `project_owners_list_project_pending_deletion`](gitlab-org/gitlab@323e070bb6208855509c87f5c894c5e105b0141b) ([merge request](gitlab-org/gitlab!82372)) **GitLab Enterprise Edition** +- [Update Web IDE copy](gitlab-org/gitlab@0b8d1bae9702cc0be39ccb4715f31c5c0585a050) ([merge request](gitlab-org/gitlab!82256)) +- [Add dispensable_render methods](gitlab-org/gitlab@1780145c511648bd7811e0f617a14d98f1e37be9) ([merge request](gitlab-org/gitlab!81546)) +- [Remove ci_pipeline_merge_request_presence_check feature flag](gitlab-org/gitlab@3b06ee0014336480b7c180a1821b2b964db9250b) ([merge request](gitlab-org/gitlab!82107)) +- [Remove default_merge_ref_for_diffs feature fflag](gitlab-org/gitlab@2608f81c4d52d751c4390b33fd7042292d622765) ([merge request](gitlab-org/gitlab!82069)) +- [Remove rearrange_pipeline_table feature flag](gitlab-org/gitlab@6ace75f59f3c42abdfdf8a9078e02308a097a914) ([merge request](gitlab-org/gitlab!81924)) +- [Add RelatedEpicsLinks::DestroyService](gitlab-org/gitlab@b6da269cf095fdd82dcd56a1e1a0f469caf5e80d) ([merge request](gitlab-org/gitlab!81610)) **GitLab Enterprise Edition** +- [Ignore requirements_management_test_reports.requirement_id column](gitlab-org/gitlab@778ffb36ec8eaa10ec9791aadc7806b707dcdb5d) ([merge request](gitlab-org/gitlab!82134)) **GitLab Enterprise Edition** +- [Add nullify job for orphan runner_id columns of ci_builds](gitlab-org/gitlab@b44fac47468e79efb2ec92a4dd0326ef9a489d11) ([merge request](gitlab-org/gitlab!81410)) +- [Rerun ConvertStringifiedRawMetadataHashToJson inline](gitlab-org/gitlab@1e4c6529f3d862b830e5ce524ba27ffee80e4617) ([merge request](gitlab-org/gitlab!80768)) +- [Update GlAlert in security dashboard table](gitlab-org/gitlab@f9211802661ed7de62113dfb7cc3983dee402975) ([merge request](gitlab-org/gitlab!82014)) **GitLab Enterprise Edition** +- [Fix GraphQL/OrderedFields offenses](gitlab-org/gitlab@321b3ca23e7efb069ecd6346da6e0684b1f68de7) by @edith007 ([merge request](gitlab-org/gitlab!81469)) +- [Remove context_commits feature flag](gitlab-org/gitlab@960ccee0fc4962bb2c0cfb88fd94313366b5b710) ([merge request](gitlab-org/gitlab!80881)) +- [Remove deprecated package application setting](gitlab-org/gitlab@e3e1cdd682037dd65b34e7ef84b42332510a2adc) ([merge request](gitlab-org/gitlab!80842)) +- [Remove feature flag for bulk inserting job tags](gitlab-org/gitlab@f78b53e0fb59848b54b89cce8025963a1d5cca87) ([merge request](gitlab-org/gitlab!79243)) +- [Cleanup back-filling CI queuing tables migration](gitlab-org/gitlab@af8fa00f4ceb2fb2e02658a2715c059136a5a3f7) ([merge request](gitlab-org/gitlab!81602)) +- [Fix GraphQL/OrderedFields offenses](gitlab-org/gitlab@868a9d2575c2883f32e2ae5cf419ace538cc7bec) by @edith007 ([merge request](gitlab-org/gitlab!81474)) +- [Fix GraphQL/OrderedFields offenses](gitlab-org/gitlab@0ec8ab44613d558ead33856d283d2d902ccf0eb0) by @edith007 ([merge request](gitlab-org/gitlab!81466)) +- [Fix GraphQL/OrderedFields offenses](gitlab-org/gitlab@def8caf919ad9712b43d2047e74934f821624db2) by @edith007 ([merge request](gitlab-org/gitlab!81478)) +- [Remove snippets_binary_blob FF](gitlab-org/gitlab@ca06b30a7eaa1629a87535084d3a8759c55e9c91) ([merge request](gitlab-org/gitlab!81827)) +- [Remove usage_data_i_snippets_show FF](gitlab-org/gitlab@32ae392e789989f35f30b8288b51ca5d6b5ade61) ([merge request](gitlab-org/gitlab!81822)) +- [Implement Gitlab mirror scheduling tracker](gitlab-org/gitlab@b1194aa8a9af09e9eb6e6f0bc84d3654754232e8) ([merge request](gitlab-org/gitlab!81249)) +- [Add certificate_based_clusters FF to Service Ping](gitlab-org/gitlab@33601c638476cbb671f46dde724939dda85c20e6) ([merge request](gitlab-org/gitlab!81311)) +- [danger: Use changelog rule from gitlab-dangerfiles](gitlab-org/gitlab@59d5f1b34b23fd573ce1d506cc8e98ab34a61c57) ([merge request](gitlab-org/gitlab!81290)) +- [Resolve Rails/LinkToBlank rubocop offenses](gitlab-org/gitlab@04fd3292dfdd8764e8503639ddb09572b5a321ec) by @edith007 ([merge request](gitlab-org/gitlab!81397)) **GitLab Enterprise Edition** +- [Resolve Rails/IndexBy rubocop offenses](gitlab-org/gitlab@6ad4f10a77aa5b3c422f6dc38278125b37f08641) by @edith007 ([merge request](gitlab-org/gitlab!81391)) **GitLab Enterprise Edition** +- [Fix Rails/SaveBang offenses](gitlab-org/gitlab@36fc826acad51070955162828969bcd39a058f60) by @edith007 ([merge request](gitlab-org/gitlab!81246)) **GitLab Enterprise Edition** +- [Remove feature flag `group_merge_request_approval_settings_feature_flag`](gitlab-org/gitlab@ef2be58240abeb54263d31696844b614ecb4ba37) ([merge request](gitlab-org/gitlab!81252)) **GitLab Enterprise Edition** +- [Move shared code for related epic links](gitlab-org/gitlab@1881821dbcccac5eecd9ea7f3c57d5dedfb03fca) ([merge request](gitlab-org/gitlab!81320)) **GitLab Enterprise Edition** +- [Remove the `container_expiration_policies_historic_entry` feature flag](gitlab-org/gitlab@2a1259f2137db65b3e068cccafa9c8c182fe1dcc) ([merge request](gitlab-org/gitlab!80826)) +- [Fix GraphQL/OrderedFields offenses](gitlab-org/gitlab@1c211096525e7bde3f65e2cace007e2ec47d00ca) by @edith007 ([merge request](gitlab-org/gitlab!81481)) +- [Fix GraphQL/OrderedFields offenses](gitlab-org/gitlab@a39986e8dda55b1ee8c7c797245b60eb07a02974) by @edith007 ([merge request](gitlab-org/gitlab!81471)) +- [Fix GraphQL/OrderedFields offenses](gitlab-org/gitlab@5f9d3afd383f43e9870b3943371e41c0c65e540c) by @edith007 ([merge request](gitlab-org/gitlab!81467)) +- [Fix GraphQL/OrderedFields offenses](gitlab-org/gitlab@aea3aec7de86702e490a7e3a2acbdc7c35bbbfe7) by @edith007 ([merge request](gitlab-org/gitlab!81414)) **GitLab Enterprise Edition** +- [Fix GraphQL/OrderedFields offenses](gitlab-org/gitlab@a7b989d814f7851aec719ace35665dbd9c63c06a) by @edith007 ([merge request](gitlab-org/gitlab!81428)) +- [Fix GraphQL/OrderedFields offenses](gitlab-org/gitlab@85c0032cbb3f94370d4498814f177d7224838bef) by @edith007 ([merge request](gitlab-org/gitlab!81425)) **GitLab Enterprise Edition** +- [Support load timings for non-Chromium browsers](gitlab-org/gitlab@fdbde7c998b42d8622c0dfe7ce3c5f1da2c09600) by @davebarr ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81260)) +- [Resolve Rails/ShortI18n rubocop offenses](gitlab-org/gitlab@481b3bc0b13ca8e7d50cc142de4186aa572dff2c) by @edith007 ([merge request](gitlab-org/gitlab!81399)) +- [Migrate projects create from template page to GlTabs](gitlab-org/gitlab@a607d8131003415c479e74ec2ded124ea2d252b8) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/81254)) +- [Memoize group secret variables on the variables builder](gitlab-org/gitlab@669cedbbd7e4d0f6e55ca4dc5ed30767db35b065) ([merge request](gitlab-org/gitlab!79936)) +- [Resolve Performance/Sum rubocop offenses](gitlab-org/gitlab@c223a6021f565fea96b3fbae4ee7c59b2b1738b5) by @edith007 ([merge request](gitlab-org/gitlab!81350)) **GitLab Enterprise Edition** +- [Resolve Performance/DeleteSuffix rubocop offenses](gitlab-org/gitlab@fd5987e7ff762dacc6a78f8b025635bd9058ae4c) by @edith007 ([merge request](gitlab-org/gitlab!81344)) +- [Remove feature flag for Group Projects API Plan Preloading](gitlab-org/gitlab@79469788adb49b64cc6bcb09c1f3ac8aac7b3e67) ([merge request](gitlab-org/gitlab!81324)) **GitLab Enterprise Edition** +- [Show an IPv6 sample in placeholder text](gitlab-org/gitlab@3f626453daca70c0df3a2b28708545c93302f61e) ([merge request](gitlab-org/gitlab!80792)) **GitLab Enterprise Edition** +- [Fix GraphQL/OrderedArguments offense (Part 6/6)](gitlab-org/gitlab@8d7a0608a4be68f3f650c9ea986427d869f4cb40) by @KevSlashNull ([merge request](gitlab-org/gitlab!76028)) +- [Add advanced_search metrics to the dictionary](gitlab-org/gitlab@66057046f073a33b9f9c618e6fc5dee7dbb4af53) ([merge request](gitlab-org/gitlab!81003)) **GitLab Enterprise Edition** +- [Rename usage column in storage projects-list](gitlab-org/gitlab@eb69a2db015389981355328a52e572f64c9b484e) ([merge request](gitlab-org/gitlab!81144)) **GitLab Enterprise Edition** +- [Set worker resource boundary for ImportRequirementsCsvWorker](gitlab-org/gitlab@5f23bc1dced38334e2a14de7232dfcb805c48b7c) by @edith007 ([merge request](gitlab-org/gitlab!81229)) **GitLab Enterprise Edition** +- [Clean up roadmap_settings feature flag](gitlab-org/gitlab@fb7bd832a5c9bdbd6318c744a1d6618b209e6481) ([merge request](gitlab-org/gitlab!80975)) +- [Fix GraphQL/FieldDefinitions offense (Part 4/4)](gitlab-org/gitlab@f06a2c460efb3cebf087be61c8393b8e49c05137) by @KevSlashNull ([merge request](gitlab-org/gitlab!76017)) +- [Fix GraphQL/OrderedArguments offense (Part 5/6)](gitlab-org/gitlab@210baf44a6eb8c254261119b30022d3f30f5734c) by @KevSlashNull ([merge request](gitlab-org/gitlab!76027)) +- [Simplify container repository delete tags services](gitlab-org/gitlab@67e8cf3f8308b14615d1f30d8afdca973f4f8b9b) by @edith007 ([merge request](gitlab-org/gitlab!81187)) +- [Make labels sort dropdown pajamas compliant](gitlab-org/gitlab@47dee9f25e1e7cb23fb0fb4863465a8fc35ac81c) ([merge request](gitlab-org/gitlab!80702)) +- [Fix Style/OpenStructUse offenses in auth provider specs](gitlab-org/gitlab@cad9f4cccf016bbabcbbef18d042ee4a0bb079f8) by @edith007 ([merge request](gitlab-org/gitlab!75277)) +- [Remove the generic_packages feature flag](gitlab-org/gitlab@a6b06521df3d9beffdfbdb02146990c4c813da0e) ([merge request](gitlab-org/gitlab!80886)) +- [Remove delegate as it's redundant due to SimpleDelegator](gitlab-org/gitlab@46d5c76e0b953bc004cb6a4656a8e0f8dd8842ee) by @edith007 ([merge request](gitlab-org/gitlab!75883)) +- [Remove unneeded override in Ci::PipelinePresenter](gitlab-org/gitlab@35ae95950999d2efbbc35fc9076335ed2afffd3f) by @edith007 ([merge request](gitlab-org/gitlab!75854)) +- [Clean up issue_boards_filtered_search feature flag](gitlab-org/gitlab@a97ed09ffb0d88007b21a314ab48b2e50d7c4bfa) ([merge request](gitlab-org/gitlab!80771)) +- [Add table for storing issue tsvector](gitlab-org/gitlab@ceabf5a8ad0d67768b05a58a84b242495645a57c) ([merge request](gitlab-org/gitlab!71913)) ## 14.8.4 (2022-03-16) @@ -762,6 +1373,29 @@ entry. - [Use `ssh_data` gem instead of `net-ssh` and `sshkey` where possible](gitlab-org/gitlab@59a0ee8605d509753c9aec719f8e0da77bcc679d) ([merge request](gitlab-org/gitlab!77424)) - [Remove feature flag already default enabled](gitlab-org/gitlab@9b7059a4bf9dc2ecdce1910a931cc6967d05b5ad) ([merge request](gitlab-org/gitlab!78238)) **GitLab Enterprise Edition** +## 14.7.5 (2022-03-09) + +### Fixed (1 change) + +- [Ensure cleanup job artifacts task does not include pipeline artifacts](gitlab-org/gitlab@7b5e91bc78c46109e48537b20239d4ab649a971a) ([merge request](gitlab-org/gitlab!82430)) + +### Other (1 change) + +- [Change to truncate table before adding finding_link_url_idx](gitlab-org/gitlab@6411ec61f40cb8648cea24ed26c1d69c8b910891) ([merge request](gitlab-org/gitlab!82430)) + +## 14.7.4 (2022-02-25) + +### Security (8 changes) + +- [Limit commands_changes to certain keys](gitlab-org/security/gitlab@59351be8d1d868e31bc849482b266e4047710eeb) ([merge request](gitlab-org/security/gitlab!2226)) +- [Add runners_token prefix to Group and Project](gitlab-org/security/gitlab@74615b7fd5359c4da7f1a3ca9052685e81e1690f) ([merge request](gitlab-org/security/gitlab!2249)) +- [Anonymous user can enumerate all users through GraphQL endpoint](gitlab-org/security/gitlab@e213dfc546020d3f88b40cdfc0f877138b0aaef5) ([merge request](gitlab-org/security/gitlab!2119)) +- [Check for unsafe characters in email addresses before sending](gitlab-org/security/gitlab@395385ffccfd9d25063531ea955b179d9bc4f0c5) ([merge request](gitlab-org/security/gitlab!2207)) +- [Warn when snippet contains unretrievable files](gitlab-org/security/gitlab@dc4b3c00284e17bcbf20ec2ae1ee7e8a7efae9b2) ([merge request](gitlab-org/security/gitlab!2204)) +- [Prevent DOS when rendering math markdown](gitlab-org/security/gitlab@f01674f210dee4c803b4850292d16412463b18e3) ([merge request](gitlab-org/security/gitlab!2200)) +- [Check permission when creating members through service](gitlab-org/security/gitlab@4f9b302511ddfaf07af8d08d848252e0c64ff307) ([merge request](gitlab-org/security/gitlab!2210)) +- [Reset password field on page load](gitlab-org/security/gitlab@1a6541462e1ddd58ea9a172fbd3c0b9026760784) ([merge request](gitlab-org/security/gitlab!2193)) + ## 14.7.3 (2022-02-15) ### Fixed (2 changes) @@ -1237,6 +1871,27 @@ See https://about.gitlab.com/releases/2022/02/03/security-release-gitlab-14-7-1- - [Fix Gitlab/DelegatePredicateMethods offenses](gitlab-org/gitlab@518700a11025b0000ff3ce011638417a882612b0) by @edith007 ([merge request](gitlab-org/gitlab!76001)) - [Fix Rails/SaveBang offenses](gitlab-org/gitlab@513b0e1dbdf95ea595e7548ff26929e0be30ce29) by @edith007 ([merge request](gitlab-org/gitlab!75894)) **GitLab Enterprise Edition** +## 14.6.6 (2022-03-01) + +### Fixed (3 changes) + +- [Ensure cleanup job artifacts task does not include pipeline artifacts](gitlab-org/gitlab@3fc3472de8bfa971985d122573e9896b17606678) ([merge request](gitlab-org/gitlab!81885)) +- [Fix Geo checksummable check failing when file is nil](gitlab-org/gitlab@38b55f334c558377de0b1b0d7f853e62723d9791) ([merge request](gitlab-org/gitlab!81885)) **GitLab Enterprise Edition** +- [Resolve "Imports fail in 14.5.2 fail with HTTParty::UnsupportedURIScheme error"](gitlab-org/gitlab@b7cbf0c19d9702a0db3ee9a8f8897df5d7da72f1) ([merge request](gitlab-org/gitlab!81885)) + +## 14.6.5 (2022-02-25) + +### Security (8 changes) + +- [Limit commands_changes to certain keys](gitlab-org/security/gitlab@138c437f2819d62ce4750fb84399d8868c844b01) ([merge request](gitlab-org/security/gitlab!2227)) +- [Add runners_token prefix to Group and Project](gitlab-org/security/gitlab@682d4e9b63d3d36901638edc75c1b265460d42dc) ([merge request](gitlab-org/security/gitlab!2250)) +- [Anonymous user can enumerate all users through GraphQL endpoint](gitlab-org/security/gitlab@2b00a8036b291d3ad5de551a5e13c2a0a39d0234) ([merge request](gitlab-org/security/gitlab!2102)) +- [Check for unsafe characters in email addresses before sending](gitlab-org/security/gitlab@6bc653b3dadefb3d2c80823786d43e6b7f8c4620) ([merge request](gitlab-org/security/gitlab!2208)) +- [Warn when snippet contains unretrievable files](gitlab-org/security/gitlab@f9ae9515ec98ab934f4aa3a35af0aca806bbe21d) ([merge request](gitlab-org/security/gitlab!2203)) +- [Prevent DOS when rendering math markdown](gitlab-org/security/gitlab@fd6d496df6f4b5eb3da0b851f9ff8ebb1d68d3f2) ([merge request](gitlab-org/security/gitlab!2201)) +- [Check permission when creating members through service](gitlab-org/security/gitlab@948e5103285de2a6cdb5152ff2c13ae4db2f4cda) ([merge request](gitlab-org/security/gitlab!2211)) +- [Reset password field on page load](gitlab-org/security/gitlab@1417b463f2771a4b17e068dea9de3aa6c4540962) ([merge request](gitlab-org/security/gitlab!2194)) + ## 14.6.4 (2022-02-03) ### Security diff --git a/Dangerfile b/Dangerfile index ca729f1b94..aaa1aae813 100644 --- a/Dangerfile +++ b/Dangerfile @@ -24,24 +24,3 @@ return if helper.release_automation? project_helper.rule_names.each do |rule| danger.import_dangerfile(path: File.join('danger', rule)) end - -anything_to_post = status_report.values.any? { |data| data.any? } - -return unless helper.ci? - -def post_labels - gitlab.api.update_merge_request(gitlab.mr_json['project_id'], - gitlab.mr_json['iid'], - add_labels: project_helper.labels_to_add.join(',')) -rescue Gitlab::Error::Forbidden - labels = project_helper.labels_to_add.map { |label| %Q(~"#{label}") } - warn("This Merge Request needs to be labelled with #{labels.join(' ')}. Please request a reviewer or maintainer to add them.") -end - -if project_helper.labels_to_add.any? - post_labels -end - -if anything_to_post - markdown("**If needed, you can retry the [`danger-review` job](#{ENV['CI_JOB_URL']}) that generated this comment.**") -end diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index a40c7d8994..4a99c04565 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -14.8.6 \ No newline at end of file +14.9.4 \ No newline at end of file diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION index 6ebe0c0b05..44a5e718d5 100644 --- a/GITLAB_KAS_VERSION +++ b/GITLAB_KAS_VERSION @@ -1 +1 @@ -14.8.1 +14.9.0 diff --git a/GITLAB_PAGES_VERSION b/GITLAB_PAGES_VERSION index ae07da081d..43c989b553 100644 --- a/GITLAB_PAGES_VERSION +++ b/GITLAB_PAGES_VERSION @@ -1 +1 @@ -1.54.1 +1.56.1 diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION index bb13322902..7e13e2ba8d 100644 --- a/GITLAB_SHELL_VERSION +++ b/GITLAB_SHELL_VERSION @@ -1 +1 @@ -13.23.2 +13.24.0 diff --git a/Gemfile b/Gemfile index 31683e8552..86e3a9ad6a 100644 --- a/Gemfile +++ b/Gemfile @@ -11,6 +11,8 @@ gem 'responders', '~> 3.0' gem 'sprockets', '~> 3.7.0' +gem 'view_component', '~> 2.50.0' + # Default values for AR models gem 'default_value_for', '~> 3.4.0' @@ -290,7 +292,7 @@ gem 'autoprefixer-rails', '10.2.5.1' gem 'terser', '1.0.2' gem 'addressable', '~> 2.8' -gem 'tanuki_emoji', '~> 0.5' +gem 'tanuki_emoji', '~> 0.6' gem 'gon', '~> 6.4.0' gem 'request_store', '~> 1.5' gem 'base32', '~> 0.3.0' @@ -302,6 +304,9 @@ gem 'rack-attack', '~> 6.3.0' # Sentry integration gem 'sentry-raven', '~> 3.1' +gem 'sentry-ruby', '~> 5.1.1' +gem 'sentry-rails', '~> 5.1.1' +gem 'sentry-sidekiq', '~> 5.1.1' # PostgreSQL query parsing # @@ -374,7 +379,7 @@ group :development, :test do gem 'spring', '~> 2.1.0' gem 'spring-commands-rspec', '~> 1.0.4' - gem 'gitlab-styles', '~> 6.6.0', require: false + gem 'gitlab-styles', '~> 7.0.0', require: false gem 'haml_lint', '~> 0.36.0', require: false gem 'bundler-audit', '~> 0.7.0.1', require: false @@ -393,14 +398,16 @@ group :development, :test do gem 'parallel', '~> 1.19', require: false gem 'test_file_finder', '~> 0.1.3' + + gem 'sigdump', '~> 0.2.4', require: 'sigdump/setup' end group :development, :test, :danger do - gem 'gitlab-dangerfiles', '~> 2.8.0', require: false + gem 'gitlab-dangerfiles', '~> 2.11.0', require: false end group :development, :test, :coverage do - gem 'simplecov', '~> 0.18.5', require: false + gem 'simplecov', '~> 0.21', require: false gem 'simplecov-lcov', '~> 0.8.0', require: false gem 'simplecov-cobertura', '~> 1.3.1', require: false gem 'undercover', '~> 0.4.4', require: false @@ -418,6 +425,7 @@ group :test do gem 'fuubar', '~> 2.2.0' gem 'rspec-retry', '~> 0.6.1' gem 'rspec_profiling', '~> 0.0.6' + gem 'rspec-benchmark', '~> 0.6.0' gem 'rspec-parameterized', require: false gem 'capybara', '~> 3.35.3' @@ -473,7 +481,7 @@ gem 'ssh_data', '~> 1.2' gem 'spamcheck', '~> 0.1.0' # Gitaly GRPC protocol definitions -gem 'gitaly', '~> 14.8.0.pre.rc1' +gem 'gitaly', '~> 14.9.0.pre.rc4' # KAS GRPC protocol definitions gem 'kas-grpc', '~> 0.0.2' @@ -534,4 +542,4 @@ gem 'ipaddress', '~> 0.8.3' gem 'parslet', '~> 1.8' -gem 'ipynbdiff', '0.3.8' +gem 'ipynbdiff', '0.4.5' diff --git a/Gemfile.lock b/Gemfile.lock index 7fc880f6c9..4e798d08c4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -139,8 +139,11 @@ GEM bcrypt (3.1.16) benchmark (0.1.1) benchmark-ips (2.3.0) + benchmark-malloc (0.2.0) benchmark-memory (0.1.2) memory_profiler (~> 0.9) + benchmark-perf (0.6.0) + benchmark-trend (0.4.0) better_errors (2.9.1) coderay (>= 1.0.0) erubi (>= 1.0.0) @@ -221,7 +224,7 @@ GEM css_parser (1.7.0) addressable daemons (1.3.1) - danger (8.4.2) + danger (8.4.5) claide (~> 1.0) claide-plugins (>= 0.9.2) colored2 (~> 3.1) @@ -238,6 +241,7 @@ GEM danger gitlab (~> 4.2, >= 4.2.0) database_cleaner (1.7.0) + dead_end (3.1.1) deckar01-task_list (2.3.1) html-pipeline declarative (0.0.20) @@ -247,13 +251,15 @@ GEM activerecord (>= 3.2.0, < 7.0) deprecation_toolkit (1.5.1) activesupport (>= 4.2) - derailed_benchmarks (1.8.1) + derailed_benchmarks (2.1.1) benchmark-ips (~> 2) + dead_end get_process_mem (~> 0) heapy (~> 0) - memory_profiler (~> 0) - mini_histogram (>= 0.2.1) + memory_profiler (>= 0, < 2) + mini_histogram (>= 0.3.0) rack (>= 1) + rack-test rake (> 10, < 14) ruby-statistics (>= 2.1) thor (>= 0.19, < 2) @@ -275,7 +281,7 @@ GEM diffy (3.3.0) discordrb-webhooks (3.4.2) rest-client (>= 2.0.0) - docile (1.3.2) + docile (1.4.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) doorkeeper (5.5.0.rc2) @@ -372,7 +378,7 @@ GEM fast_blank (1.0.0) fast_gettext (2.1.0) ffaker (2.10.0) - ffi (1.15.3) + ffi (1.15.5) ffi-compiler (1.0.1) ffi (>= 1.0.0) rake @@ -435,7 +441,7 @@ GEM ruby-progressbar (~> 1.4) fuzzyurl (0.9.0) gemoji (3.0.1) - get_process_mem (0.2.5) + get_process_mem (0.2.7) ffi (~> 1.0) gettext (3.3.6) locale (>= 2.0.5) @@ -449,7 +455,7 @@ GEM rails (>= 3.2.0) git (1.7.0) rchardet (~> 1.8) - gitaly (14.8.0.pre.rc1) + gitaly (14.9.0.pre.rc4) grpc (~> 1.0) github-markup (1.7.0) gitlab (4.16.1) @@ -457,8 +463,8 @@ GEM terminal-table (~> 1.5, >= 1.5.1) gitlab-chronic (0.10.5) numerizer (~> 0.2) - gitlab-dangerfiles (2.8.0) - danger (>= 8.3.1) + gitlab-dangerfiles (2.11.0) + danger (>= 8.4.5) danger-gitlab (>= 8.0.0) gitlab-experiment (0.7.0) activesupport (>= 3.0) @@ -495,7 +501,7 @@ GEM openid_connect (~> 1.2) gitlab-sidekiq-fetcher (0.8.0) sidekiq (~> 6.1) - gitlab-styles (6.6.0) + gitlab-styles (7.0.0) rubocop (~> 0.91, >= 0.91.1) rubocop-gitlab-security (~> 0.1.1) rubocop-graphql (~> 0.10) @@ -639,7 +645,7 @@ GEM mime-types (~> 3.0) multi_xml (>= 0.5.2) httpclient (2.8.3) - i18n (1.9.1) + i18n (1.10.0) concurrent-ruby (~> 1.0) i18n_data (0.8.0) icalendar (2.4.1) @@ -648,9 +654,9 @@ GEM invisible_captcha (1.1.0) rails (>= 4.2) ipaddress (0.8.3) - ipynbdiff (0.3.8) - diffy (= 3.3.0) - json (= 2.5.1) + ipynbdiff (0.4.5) + diffy (~> 3.3) + json (~> 2.5, >= 2.5.1) jaeger-client (1.1.0) opentracing (~> 0.3) thrift @@ -1059,6 +1065,11 @@ GEM rspec-core (~> 3.10.0) rspec-expectations (~> 3.10.0) rspec-mocks (~> 3.10.0) + rspec-benchmark (0.6.0) + benchmark-malloc (~> 0.2) + benchmark-perf (~> 0.6) + benchmark-trend (~> 0.4) + rspec (>= 3.0) rspec-core (3.10.1) rspec-support (~> 3.10.0) rspec-expectations (3.10.1) @@ -1104,7 +1115,7 @@ GEM parser (>= 2.7.1.5) rubocop-gitlab-security (0.1.1) rubocop (>= 0.51) - rubocop-graphql (0.10.3) + rubocop-graphql (0.13.0) rubocop (>= 0.87, < 2) rubocop-performance (1.9.2) rubocop (>= 0.90.0, < 2.0) @@ -1125,7 +1136,7 @@ GEM ruby-saml (1.13.0) nokogiri (>= 1.10.5) rexml - ruby-statistics (2.1.2) + ruby-statistics (3.0.0) ruby2_keywords (0.0.4) ruby_parser (3.15.0) sexp_processor (~> 4.9) @@ -1163,8 +1174,19 @@ GEM selenium-webdriver (3.142.7) childprocess (>= 0.5, < 4.0) rubyzip (>= 1.2.2) + sentry-rails (5.1.1) + railties (>= 5.0) + sentry-ruby-core (~> 5.1.1) sentry-raven (3.1.2) faraday (>= 1.0) + sentry-ruby (5.1.1) + concurrent-ruby (~> 1.0, >= 1.0.2) + sentry-ruby-core (= 5.1.1) + sentry-ruby-core (5.1.1) + concurrent-ruby + sentry-sidekiq (5.1.1) + sentry-ruby-core (~> 5.1.1) + sidekiq (>= 3.0) set (1.0.1) settingslogic (2.0.9) sexp_processor (4.15.1) @@ -1178,19 +1200,22 @@ GEM sidekiq-cron (1.2.0) fugit (~> 1.1) sidekiq (>= 4.2.1) + sigdump (0.2.4) signet (0.14.0) addressable (~> 2.3) faraday (>= 0.17.3, < 2.0) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) simple_po_parser (1.1.2) - simplecov (0.18.5) + simplecov (0.21.2) docile (~> 1.1) simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) simplecov-cobertura (1.3.1) simplecov (~> 0.8) simplecov-html (0.12.3) simplecov-lcov (0.8.0) + simplecov_json_formatter (0.1.4) sixarm_ruby_unaccent (1.2.0) slack-messenger (2.3.4) snowplow-tracker (0.6.1) @@ -1249,7 +1274,7 @@ GEM sys-filesystem (1.4.3) ffi (~> 1.1) sysexits (1.2.0) - tanuki_emoji (0.5.0) + tanuki_emoji (0.6.0) temple (0.8.2) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) @@ -1263,7 +1288,7 @@ GEM daemons (~> 1.0, >= 1.0.9) eventmachine (~> 1.0, >= 1.0.4) rack (>= 1, < 3) - thor (1.1.0) + thor (1.2.1) thrift (0.14.0) tilt (2.0.10) timecop (0.9.1) @@ -1337,6 +1362,9 @@ GEM activerecord (>= 3.0) activesupport (>= 3.0) version_sorter (2.2.4) + view_component (2.50.0) + activesupport (>= 5.0.0, < 8.0) + method_source (~> 1.0) vmstat (2.3.0) warden (1.2.8) rack (>= 2.0.6) @@ -1463,10 +1491,10 @@ DEPENDENCIES gettext (~> 3.3) gettext_i18n_rails (~> 1.8.0) gettext_i18n_rails_js (~> 1.3) - gitaly (~> 14.8.0.pre.rc1) + gitaly (~> 14.9.0.pre.rc4) github-markup (~> 1.7.0) gitlab-chronic (~> 0.10.5) - gitlab-dangerfiles (~> 2.8.0) + gitlab-dangerfiles (~> 2.11.0) gitlab-experiment (~> 0.7.0) gitlab-fog-azure-rm (~> 1.2.0) gitlab-labkit (~> 0.22.0) @@ -1477,7 +1505,7 @@ DEPENDENCIES gitlab-net-dns (~> 0.9.1) gitlab-omniauth-openid-connect (~> 0.9.0) gitlab-sidekiq-fetcher (= 0.8.0) - gitlab-styles (~> 6.6.0) + gitlab-styles (~> 7.0.0) gitlab_chronic_duration (~> 0.10.6.2) gitlab_omniauth-ldap (~> 2.1.1) gon (~> 6.4.0) @@ -1507,7 +1535,7 @@ DEPENDENCIES icalendar invisible_captcha (~> 1.1.0) ipaddress (~> 0.8.3) - ipynbdiff (= 0.3.8) + ipynbdiff (= 0.4.5) jira-ruby (~> 2.1.4) js_regex (~> 3.7) json (~> 2.5.1) @@ -1596,6 +1624,7 @@ DEPENDENCIES rexml (~> 3.2.5) rouge (~> 3.27.0) rqrcode-rails3 (~> 0.1.7) + rspec-benchmark (~> 0.6.0) rspec-parameterized rspec-rails (~> 5.0.1) rspec-retry (~> 0.6.1) @@ -1614,13 +1643,17 @@ DEPENDENCIES sd_notify (~> 0.1.0) seed-fu (~> 2.3.7) selenium-webdriver (~> 3.142) + sentry-rails (~> 5.1.1) sentry-raven (~> 3.1) + sentry-ruby (~> 5.1.1) + sentry-sidekiq (~> 5.1.1) settingslogic (~> 2.0.9) shoulda-matchers (~> 4.0.1) sidekiq (~> 6.4) sidekiq-cron (~> 1.2) + sigdump (~> 0.2.4) simple_po_parser (~> 1.1.2) - simplecov (~> 0.18.5) + simplecov (~> 0.21) simplecov-cobertura (~> 1.3.1) simplecov-lcov (~> 0.8.0) slack-messenger (~> 2.3.4) @@ -1635,7 +1668,7 @@ DEPENDENCIES stackprof (~> 0.2.15) state_machines-activerecord (~> 0.8.0) sys-filesystem (~> 1.4.3) - tanuki_emoji (~> 0.5) + tanuki_emoji (~> 0.6) terser (= 1.0.2) test-prof (~> 1.0.7) test_file_finder (~> 0.1.3) @@ -1652,6 +1685,7 @@ DEPENDENCIES valid_email (~> 0.1) validates_hostname (~> 1.0.11) version_sorter (~> 2.2.4) + view_component (~> 2.50.0) vmstat (~> 2.3.0) warning (~> 1.2.0) webauthn (~> 2.3) diff --git a/Rakefile b/Rakefile index eb2f158972..9545516d2a 100755 --- a/Rakefile +++ b/Rakefile @@ -11,6 +11,8 @@ require File.expand_path('config/application', __dir__) relative_url_conf = File.expand_path('config/initializers/relative_url', __dir__) require relative_url_conf if File.exist?("#{relative_url_conf}.rb") +require File.expand_path('config/initializers/01_active_record_database_tasks_configuration_flag.rb', __dir__) + Gitlab::Application.load_tasks Knapsack.load_tasks if defined?(Knapsack) diff --git a/VERSION b/VERSION index a40c7d8994..4a99c04565 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -14.8.6 \ No newline at end of file +14.9.4 \ No newline at end of file diff --git a/app/assets/images/aws-cloud-formation.png b/app/assets/images/aws-cloud-formation.png deleted file mode 100644 index 1d078309d8..0000000000 Binary files a/app/assets/images/aws-cloud-formation.png and /dev/null differ diff --git a/app/assets/images/vulnerability/kontra-logo.svg b/app/assets/images/vulnerability/kontra-logo.svg new file mode 100644 index 0000000000..e12e2545e7 --- /dev/null +++ b/app/assets/images/vulnerability/kontra-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/vulnerability/scw-logo.svg b/app/assets/images/vulnerability/scw-logo.svg new file mode 100644 index 0000000000..6d160ddc49 --- /dev/null +++ b/app/assets/images/vulnerability/scw-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/javascripts/access_tokens/components/expires_at_field.vue b/app/assets/javascripts/access_tokens/components/expires_at_field.vue index 1fec186f2f..561b2617c5 100644 --- a/app/assets/javascripts/access_tokens/components/expires_at_field.vue +++ b/app/assets/javascripts/access_tokens/components/expires_at_field.vue @@ -1,15 +1,31 @@ diff --git a/app/assets/javascripts/access_tokens/components/tokens_app.vue b/app/assets/javascripts/access_tokens/components/tokens_app.vue index 755991f64e..10d4d62d80 100644 --- a/app/assets/javascripts/access_tokens/components/tokens_app.vue +++ b/app/assets/javascripts/access_tokens/components/tokens_app.vue @@ -100,6 +100,7 @@ export default { {{ content }} diff --git a/app/assets/javascripts/access_tokens/index.js b/app/assets/javascripts/access_tokens/index.js index 9a1e7d877f..c59bd44553 100644 --- a/app/assets/javascripts/access_tokens/index.js +++ b/app/assets/javascripts/access_tokens/index.js @@ -17,6 +17,7 @@ export const initExpiresAtField = () => { } const { expiresAt: inputAttrs } = parseRailsFormFields(el); + const { maxDate } = el.dataset; return new Vue({ el, @@ -24,6 +25,7 @@ export const initExpiresAtField = () => { return h(ExpiresAtField, { props: { inputAttrs, + maxDate: maxDate ? new Date(maxDate) : undefined, }, }); }, diff --git a/app/assets/javascripts/activities.js b/app/assets/javascripts/activities.js index 74e0e1b622..7a78ccdb0c 100644 --- a/app/assets/javascripts/activities.js +++ b/app/assets/javascripts/activities.js @@ -33,7 +33,7 @@ export default class Activities { errorCallback: () => createFlash({ message: s__( - 'Activity|An error occured while retrieving activity. Reload the page to try again.', + 'Activity|An error occurred while retrieving activity. Reload the page to try again.', ), parent: this.containerEl, }), diff --git a/app/assets/javascripts/admin/applications/components/delete_application.vue b/app/assets/javascripts/admin/applications/components/delete_application.vue new file mode 100644 index 0000000000..77694296b0 --- /dev/null +++ b/app/assets/javascripts/admin/applications/components/delete_application.vue @@ -0,0 +1,84 @@ + + diff --git a/app/assets/javascripts/admin/applications/index.js b/app/assets/javascripts/admin/applications/index.js new file mode 100644 index 0000000000..5875fd1872 --- /dev/null +++ b/app/assets/javascripts/admin/applications/index.js @@ -0,0 +1,15 @@ +import Vue from 'vue'; +import DeleteApplication from './components/delete_application.vue'; + +export default () => { + const el = document.querySelector('.js-application-delete-modal'); + + if (!el) return false; + + return new Vue({ + el, + render(h) { + return h(DeleteApplication); + }, + }); +}; diff --git a/app/assets/javascripts/admin/topics/components/remove_avatar.vue b/app/assets/javascripts/admin/topics/components/remove_avatar.vue new file mode 100644 index 0000000000..5e94d6185e --- /dev/null +++ b/app/assets/javascripts/admin/topics/components/remove_avatar.vue @@ -0,0 +1,67 @@ + + diff --git a/app/assets/javascripts/admin/topics/index.js b/app/assets/javascripts/admin/topics/index.js new file mode 100644 index 0000000000..8fbcadf336 --- /dev/null +++ b/app/assets/javascripts/admin/topics/index.js @@ -0,0 +1,22 @@ +import Vue from 'vue'; +import RemoveAvatar from './components/remove_avatar.vue'; + +export default () => { + const el = document.querySelector('.js-remove-topic-avatar'); + + if (!el) { + return false; + } + + const { path } = el.dataset; + + return new Vue({ + el, + provide: { + path, + }, + render(h) { + return h(RemoveAvatar); + }, + }); +}; diff --git a/app/assets/javascripts/admin/users/components/user_actions.vue b/app/assets/javascripts/admin/users/components/user_actions.vue index f5d21ece13..829174d759 100644 --- a/app/assets/javascripts/admin/users/components/user_actions.vue +++ b/app/assets/javascripts/admin/users/components/user_actions.vue @@ -69,7 +69,6 @@ export default { editButtonAttrs() { return { 'data-testid': 'edit', - icon: 'pencil-square', href: this.userPaths.edit, }; }, @@ -101,6 +100,7 @@ export default { @@ -108,10 +108,9 @@ export default {
{}) { const url = Api.buildUrl(Api.groupPath).replace(':id', groupId); @@ -957,6 +958,13 @@ const Api = { return axios.get(url, { params: { per_page: DEFAULT_PER_PAGE, ...params } }); }, + // TODO: replace this when GraphQL support has been added https://gitlab.com/gitlab-org/gitlab/-/issues/352184 + projectSecureFiles(projectId, options = {}) { + const url = Api.buildUrl(this.secureFilesPath).replace(':project_id', projectId); + + return axios.get(url, { params: { per_page: DEFAULT_PER_PAGE, ...options } }); + }, + async updateNotificationSettings(projectId, groupId, data = {}) { let url = Api.buildUrl(this.notificationSettingsPath); diff --git a/app/assets/javascripts/attention_requests/components/navigation_popover.vue b/app/assets/javascripts/attention_requests/components/navigation_popover.vue new file mode 100644 index 0000000000..1542bc9a7e --- /dev/null +++ b/app/assets/javascripts/attention_requests/components/navigation_popover.vue @@ -0,0 +1,120 @@ + + + diff --git a/app/assets/javascripts/attention_requests/index.js b/app/assets/javascripts/attention_requests/index.js new file mode 100644 index 0000000000..2a142ab46e --- /dev/null +++ b/app/assets/javascripts/attention_requests/index.js @@ -0,0 +1,73 @@ +import Vue from 'vue'; +import VueApollo from 'vue-apollo'; +import { __ } from '~/locale'; +import createDefaultClient from '~/lib/graphql'; +import NavigationPopover from './components/navigation_popover.vue'; + +Vue.use(VueApollo); + +const apolloProvider = new VueApollo({ + defaultClient: createDefaultClient(), +}); + +export const initTopNavPopover = () => { + const el = document.getElementById('js-need-attention-nav-onboarding'); + + if (!el) return; + + // eslint-disable-next-line no-new + new Vue({ + el, + apolloProvider, + provide: { + observerElSelector: '.user-counter.dropdown', + observerElToggledClass: 'show', + message: [ + __( + '%{strongStart}Need your attention%{strongEnd} are the merge requests that need your help to move forward, as an assignee or reviewer.', + ), + ], + featureName: 'attention_requests_top_nav', + popoverTarget: '#js-need-attention-nav', + }, + render(h) { + return h(NavigationPopover); + }, + }); +}; + +export const initSideNavPopover = () => { + const el = document.getElementById('js-need-attention-sidebar-onboarding'); + + if (!el) return; + + // eslint-disable-next-line no-new + new Vue({ + el, + apolloProvider, + provide: { + observerElSelector: '.js-right-sidebar', + observerElToggledClass: 'right-sidebar-expanded', + message: [ + __( + 'To ask someone to look at a merge request, select %{strongStart}Request attention%{strongEnd}. Select again to remove the request.', + ), + __( + 'Some actions remove attention requests, like a reviewer approving or anyone merging the merge request.', + ), + ], + featureName: 'attention_requests_side_nav', + popoverTarget: '.js-attention-request-toggle', + showAttentionIcon: true, + delay: 500, + popoverCssClass: 'attention-request-sidebar-popover', + }, + render(h) { + return h(NavigationPopover); + }, + }); +}; + +export default () => { + initTopNavPopover(); +}; diff --git a/app/assets/javascripts/authentication/webauthn/util.js b/app/assets/javascripts/authentication/webauthn/util.js index eeda2bfaea..2a0740cf48 100644 --- a/app/assets/javascripts/authentication/webauthn/util.js +++ b/app/assets/javascripts/authentication/webauthn/util.js @@ -45,6 +45,17 @@ export const bufferToBase64 = (input) => { return btoa(String.fromCharCode(...arr)); }; +/** + * Return a URL-safe base64 string. + * + * RFC: https://datatracker.ietf.org/doc/html/rfc4648#section-5 + * @param {String} base64Str + * @returns {String} + */ +export const base64ToBase64Url = (base64Str) => { + return base64Str.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); +}; + /** * Returns a copy of the given object with the id property converted to buffer * diff --git a/app/assets/javascripts/behaviors/markdown/editor_extensions.js b/app/assets/javascripts/behaviors/markdown/editor_extensions.js index b512e4dbc8..165031c3e7 100644 --- a/app/assets/javascripts/behaviors/markdown/editor_extensions.js +++ b/app/assets/javascripts/behaviors/markdown/editor_extensions.js @@ -48,54 +48,48 @@ import Video from './nodes/video'; // from GFM should have a node or mark here. // The GFM-to-HTML-to-GFM cycle is tested in spec/features/markdown/copy_as_gfm_spec.rb. -export default [ - new Doc(), - new Paragraph(), - new Text(), +export default { + nodes: [ + Doc(), + Paragraph(), + Text(), - new Blockquote(), - new CodeBlock(), - new HardBreak(), - new Heading({ maxLevel: 6 }), - new HorizontalRule(), - new Image(), + Blockquote(), + CodeBlock(), + HardBreak(), + Heading(), + HorizontalRule(), + Image(), - new Table(), - new TableHead(), - new TableBody(), - new TableHeaderRow(), - new TableRow(), - new TableCell(), + Table(), + TableHead(), + TableBody(), + TableHeaderRow(), + TableRow(), + TableCell(), - new Emoji(), - new Reference(), + Emoji(), + Reference(), - new TableOfContents(), - new Video(), - new Audio(), + TableOfContents(), + Video(), + Audio(), - new BulletList(), - new OrderedList(), - new ListItem(), + BulletList(), + OrderedList(), + ListItem(), - new DescriptionList(), - new DescriptionTerm(), - new DescriptionDetails(), + DescriptionList(), + DescriptionTerm(), + DescriptionDetails(), - new TaskList(), - new OrderedTaskList(), - new TaskListItem(), + TaskList(), + OrderedTaskList(), + TaskListItem(), - new Summary(), - new Details(), + Summary(), + Details(), + ], - new Bold(), - new Italic(), - new Strike(), - new InlineDiff(), - - new Link(), - new Code(), - new MathMark(), - new InlineHTML(), -]; + marks: [Bold(), Italic(), Strike(), InlineDiff(), Link(), Code(), MathMark(), InlineHTML()], +}; diff --git a/app/assets/javascripts/behaviors/markdown/marks/bold.js b/app/assets/javascripts/behaviors/markdown/marks/bold.js index 89e373220a..dd730947a5 100644 --- a/app/assets/javascripts/behaviors/markdown/marks/bold.js +++ b/app/assets/javascripts/behaviors/markdown/marks/bold.js @@ -1,11 +1,17 @@ -/* eslint-disable class-methods-use-this */ - -import { Bold as BaseBold } from 'tiptap-extensions'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class Bold extends BaseBold { - get toMarkdown() { - return defaultMarkdownSerializer.marks.strong; - } -} +export default () => { + return { + name: 'bold', + schema: { + parseDOM: [ + { + tag: 'strong', + }, + ], + toDOM: () => ['strong', 0], + }, + toMarkdown: defaultMarkdownSerializer.marks.strong, + }; +}; diff --git a/app/assets/javascripts/behaviors/markdown/marks/code.js b/app/assets/javascripts/behaviors/markdown/marks/code.js index 68368dec67..ea5af8b4a1 100644 --- a/app/assets/javascripts/behaviors/markdown/marks/code.js +++ b/app/assets/javascripts/behaviors/markdown/marks/code.js @@ -1,11 +1,12 @@ -/* eslint-disable class-methods-use-this */ - -import { Code as BaseCode } from 'tiptap-extensions'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class Code extends BaseCode { - get toMarkdown() { - return defaultMarkdownSerializer.marks.code; - } -} +export default () => ({ + name: 'code', + schema: { + excludes: '_', + parseDOM: [{ tag: 'code' }], + toDOM: () => ['code', 0], + }, + toMarkdown: defaultMarkdownSerializer.marks.code, +}); diff --git a/app/assets/javascripts/behaviors/markdown/marks/inline_diff.js b/app/assets/javascripts/behaviors/markdown/marks/inline_diff.js index 7f1506cd5d..69d345c81e 100644 --- a/app/assets/javascripts/behaviors/markdown/marks/inline_diff.js +++ b/app/assets/javascripts/behaviors/markdown/marks/inline_diff.js @@ -1,41 +1,29 @@ -/* eslint-disable class-methods-use-this */ - -import { Mark } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::InlineDiffFilter -export default class InlineDiff extends Mark { - get name() { - return 'inline_diff'; - } - - get schema() { - return { - attrs: { - addition: { - default: true, - }, +export default () => ({ + name: 'inline_diff', + schema: { + attrs: { + addition: { + default: true, }, - parseDOM: [ - { tag: 'span.idiff.addition', attrs: { addition: true } }, - { tag: 'span.idiff.deletion', attrs: { addition: false } }, - ], - toDOM: (node) => [ - 'span', - { class: `idiff left right ${node.attrs.addition ? 'addition' : 'deletion'}` }, - 0, - ], - }; - } - - get toMarkdown() { - return { - mixable: true, - open(state, mark) { - return mark.attrs.addition ? '{+' : '{-'; - }, - close(state, mark) { - return mark.attrs.addition ? '+}' : '-}'; - }, - }; - } -} + }, + parseDOM: [ + { tag: 'span.idiff.addition', attrs: { addition: true } }, + { tag: 'span.idiff.deletion', attrs: { addition: false } }, + ], + toDOM: (node) => [ + 'span', + { class: `idiff left right ${node.attrs.addition ? 'addition' : 'deletion'}` }, + 0, + ], + }, + toMarkdown: { + mixable: true, + open(_, mark) { + return mark.attrs.addition ? '{+' : '{-'; + }, + close(_, mark) { + return mark.attrs.addition ? '+}' : '-}'; + }, + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/marks/inline_html.js b/app/assets/javascripts/behaviors/markdown/marks/inline_html.js index e957f81b77..4520598e0a 100644 --- a/app/assets/javascripts/behaviors/markdown/marks/inline_html.js +++ b/app/assets/javascripts/behaviors/markdown/marks/inline_html.js @@ -1,46 +1,35 @@ -/* eslint-disable class-methods-use-this */ - import { escape } from 'lodash'; -import { Mark } from 'tiptap'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class InlineHTML extends Mark { - get name() { - return 'inline_html'; - } - - get schema() { - return { - excludes: '', - attrs: { - tag: {}, - title: { default: null }, +export default () => ({ + name: 'inline_html', + schema: { + excludes: '', + attrs: { + tag: {}, + title: { default: null }, + }, + parseDOM: [ + { + tag: 'sup, sub, kbd, q, samp, var', + getAttrs: (el) => ({ tag: el.nodeName.toLowerCase() }), }, - parseDOM: [ - { - tag: 'sup, sub, kbd, q, samp, var', - getAttrs: (el) => ({ tag: el.nodeName.toLowerCase() }), - }, - { - tag: 'abbr', - getAttrs: (el) => ({ tag: 'abbr', title: el.getAttribute('title') }), - }, - ], - toDOM: (node) => [node.attrs.tag, { title: node.attrs.title }, 0], - }; - } - - get toMarkdown() { - return { - mixable: true, - open(state, mark) { - return `<${mark.attrs.tag}${ - mark.attrs.title ? ` title="${state.esc(escape(mark.attrs.title))}"` : '' - }>`; + { + tag: 'abbr', + getAttrs: (el) => ({ tag: 'abbr', title: el.getAttribute('title') }), }, - close(state, mark) { - return ``; - }, - }; - } -} + ], + toDOM: (node) => [node.attrs.tag, { title: node.attrs.title }, 0], + }, + toMarkdown: { + mixable: true, + open(state, mark) { + return `<${mark.attrs.tag}${ + mark.attrs.title ? ` title="${state.esc(escape(mark.attrs.title))}"` : '' + }>`; + }, + close(_, mark) { + return ``; + }, + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/marks/italic.js b/app/assets/javascripts/behaviors/markdown/marks/italic.js index 7dc86102f1..3ec8f0071e 100644 --- a/app/assets/javascripts/behaviors/markdown/marks/italic.js +++ b/app/assets/javascripts/behaviors/markdown/marks/italic.js @@ -1,11 +1,11 @@ -/* eslint-disable class-methods-use-this */ - -import { Italic as BaseItalic } from 'tiptap-extensions'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class Italic extends BaseItalic { - get toMarkdown() { - return defaultMarkdownSerializer.marks.em; - } -} +export default () => ({ + name: 'italic', + schema: { + parseDOM: [{ tag: 'em' }], + toDOM: () => ['em', 0], + }, + toMarkdown: defaultMarkdownSerializer.marks.em, +}); diff --git a/app/assets/javascripts/behaviors/markdown/marks/link.js b/app/assets/javascripts/behaviors/markdown/marks/link.js index b5e09017d8..977453fee0 100644 --- a/app/assets/javascripts/behaviors/markdown/marks/link.js +++ b/app/assets/javascripts/behaviors/markdown/marks/link.js @@ -1,21 +1,47 @@ -/* eslint-disable class-methods-use-this */ - -import { Link as BaseLink } from 'tiptap-extensions'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class Link extends BaseLink { - get toMarkdown() { - return { - mixable: true, - open(state, mark, parent, index) { - const open = defaultMarkdownSerializer.marks.link.open(state, mark, parent, index); - return open === '<' ? '' : open; +export default () => ({ + name: 'link', + schema: { + attrs: { + href: { + default: null, }, - close(state, mark, parent, index) { - const close = defaultMarkdownSerializer.marks.link.close(state, mark, parent, index); - return close === '>' ? '' : close; + target: { + default: null, }, - }; - } -} + }, + inclusive: false, + parseDOM: [ + { + tag: 'a[href]', + getAttrs: (dom) => ({ + href: dom.getAttribute('href'), + target: dom.getAttribute('target'), + }), + }, + ], + toDOM: (node) => [ + 'a', + { + ...node.attrs, + // eslint-disable-next-line @gitlab/require-i18n-strings + rel: 'noopener noreferrer nofollow', + target: node.attrs.target, + }, + 0, + ], + }, + toMarkdown: { + mixable: true, + open(state, mark, parent, index) { + const open = defaultMarkdownSerializer.marks.link.open(state, mark, parent, index); + return open === '<' ? '' : open; + }, + close(state, mark, parent, index) { + const close = defaultMarkdownSerializer.marks.link.close(state, mark, parent, index); + return close === '>' ? '' : close; + }, + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/marks/math.js b/app/assets/javascripts/behaviors/markdown/marks/math.js index ca25ff7d07..a50a649b6e 100644 --- a/app/assets/javascripts/behaviors/markdown/marks/math.js +++ b/app/assets/javascripts/behaviors/markdown/marks/math.js @@ -1,42 +1,31 @@ -/* eslint-disable class-methods-use-this */ - -import { Mark } from 'tiptap'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::MathFilter -export default class MathMark extends Mark { - get name() { - return 'math'; - } - - get schema() { - return { - parseDOM: [ - // Matches HTML generated by Banzai::Filter::MathFilter - { - tag: 'code.code.math[data-math-style=inline]', - priority: HIGHER_PARSE_RULE_PRIORITY, - }, - // Matches HTML after being transformed by app/assets/javascripts/behaviors/markdown/render_math.js - { - tag: 'span.katex', - contentElement: 'annotation[encoding="application/x-tex"]', - }, - ], - toDOM: () => ['code', { class: 'code math', 'data-math-style': 'inline' }, 0], - }; - } - - get toMarkdown() { - return { - escape: false, - open(state, mark, parent, index) { - return `$${defaultMarkdownSerializer.marks.code.open(state, mark, parent, index)}`; +export default () => ({ + name: 'math', + schema: { + parseDOM: [ + // Matches HTML generated by Banzai::Filter::MathFilter + { + tag: 'code.code.math[data-math-style=inline]', + priority: HIGHER_PARSE_RULE_PRIORITY, }, - close(state, mark, parent, index) { - return `${defaultMarkdownSerializer.marks.code.close(state, mark, parent, index)}$`; + // Matches HTML after being transformed by app/assets/javascripts/behaviors/markdown/render_math.js + { + tag: 'span.katex', + contentElement: 'annotation[encoding="application/x-tex"]', }, - }; - } -} + ], + toDOM: () => ['code', { class: 'code math', 'data-math-style': 'inline' }, 0], + }, + toMarkdown: { + escape: false, + open(state, mark, parent, index) { + return `$${defaultMarkdownSerializer.marks.code.open(state, mark, parent, index)}`; + }, + close(state, mark, parent, index) { + return `${defaultMarkdownSerializer.marks.code.close(state, mark, parent, index)}$`; + }, + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/marks/strike.js b/app/assets/javascripts/behaviors/markdown/marks/strike.js index c2951a40a4..967c0a120c 100644 --- a/app/assets/javascripts/behaviors/markdown/marks/strike.js +++ b/app/assets/javascripts/behaviors/markdown/marks/strike.js @@ -1,15 +1,18 @@ -/* eslint-disable class-methods-use-this */ - -import { Strike as BaseStrike } from 'tiptap-extensions'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class Strike extends BaseStrike { - get toMarkdown() { - return { - open: '~~', - close: '~~', - mixable: true, - expelEnclosingWhitespace: true, - }; - } -} +export default () => ({ + name: 'strike', + schema: { + parseDOM: [ + { + tag: 'del', + }, + ], + toDOM: () => ['s', 0], + }, + toMarkdown: { + open: '~~', + close: '~~', + mixable: true, + expelEnclosingWhitespace: true, + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/audio.js b/app/assets/javascripts/behaviors/markdown/nodes/audio.js index 146349b118..97ab86c6d2 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/audio.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/audio.js @@ -1,9 +1,4 @@ -import Playable from './playable'; +import playable from './playable'; // Transforms generated HTML back to GFM for Banzai::Filter::AudioLinkFilter -export default class Audio extends Playable { - constructor() { - super(); - this.mediaType = 'audio'; - } -} +export default () => playable({ mediaType: 'audio' }); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/blockquote.js b/app/assets/javascripts/behaviors/markdown/nodes/blockquote.js index 8b14a04e2f..6a4552d47e 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/blockquote.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/blockquote.js @@ -1,13 +1,19 @@ -/* eslint-disable class-methods-use-this */ - -import { Blockquote as BaseBlockquote } from 'tiptap-extensions'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class Blockquote extends BaseBlockquote { +export default () => ({ + name: 'blockquote', + schema: { + content: 'block*', + group: 'block', + defining: true, + draggable: false, + parseDOM: [{ tag: 'blockquote' }], + toDOM: () => ['blockquote', 0], + }, toMarkdown(state, node) { if (!node.childCount) return; defaultMarkdownSerializer.nodes.blockquote(state, node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/bullet_list.js b/app/assets/javascripts/behaviors/markdown/nodes/bullet_list.js index ef1eafaa41..95cd3605da 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/bullet_list.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/bullet_list.js @@ -1,11 +1,15 @@ -/* eslint-disable class-methods-use-this */ - -import { BulletList as BaseBulletList } from 'tiptap-extensions'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class BulletList extends BaseBulletList { +export default () => ({ + name: 'bullet_list', + schema: { + content: 'list_item+', + group: 'block', + parseDOM: [{ tag: 'ul' }], + toDOM: () => ['ul', 0], + }, toMarkdown(state, node) { defaultMarkdownSerializer.nodes.bullet_list(state, node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/code_block.js b/app/assets/javascripts/behaviors/markdown/nodes/code_block.js index cd90d67c60..0ff59779e7 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/code_block.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/code_block.js @@ -1,7 +1,3 @@ -/* eslint-disable class-methods-use-this */ - -import { CodeBlock as BaseCodeBlock } from 'tiptap-extensions'; - const PLAINTEXT_LANG = 'plaintext'; // Transforms generated HTML back to GFM for: @@ -9,68 +5,67 @@ const PLAINTEXT_LANG = 'plaintext'; // - Banzai::Filter::MathFilter // - Banzai::Filter::MermaidFilter // - Banzai::Filter::SuggestionFilter -export default class CodeBlock extends BaseCodeBlock { - get schema() { - return { - content: 'text*', - marks: '', - group: 'block', - code: true, - defining: true, - attrs: { - lang: { default: PLAINTEXT_LANG }, - }, - parseDOM: [ - // Matches HTML generated by Banzai::Filter::SyntaxHighlightFilter, Banzai::Filter::MathFilter, Banzai::Filter::MermaidFilter, or Banzai::Filter::SuggestionFilter - { - tag: 'pre.code.highlight', - preserveWhitespace: 'full', - getAttrs: (el) => { - const lang = el.getAttribute('lang'); - if (!lang || lang === '') return {}; +export default () => ({ + name: 'code_block', + schema: { + content: 'text*', + marks: '', + group: 'block', + code: true, + defining: true, + attrs: { + lang: { default: PLAINTEXT_LANG }, + }, + parseDOM: [ + // Matches HTML generated by Banzai::Filter::SyntaxHighlightFilter, Banzai::Filter::MathFilter, Banzai::Filter::MermaidFilter, or Banzai::Filter::SuggestionFilter + { + tag: 'pre.code.highlight', + preserveWhitespace: 'full', + getAttrs: (el) => { + const lang = el.getAttribute('lang'); + if (!lang || lang === '') return {}; - return { lang }; - }, + return { lang }; }, - // Matches HTML generated by Banzai::Filter::MathFilter, - // after being transformed by app/assets/javascripts/behaviors/markdown/render_math.js - { - tag: 'span.katex-display', - preserveWhitespace: 'full', - contentElement: 'annotation[encoding="application/x-tex"]', - attrs: { lang: 'math' }, - }, - // Matches HTML generated by Banzai::Filter::MermaidFilter, - // after being transformed by app/assets/javascripts/behaviors/markdown/render_mermaid.js - { - tag: 'svg.mermaid', - preserveWhitespace: 'full', - contentElement: 'text.source', - attrs: { lang: 'mermaid' }, - }, - // Matches HTML generated by Banzai::Filter::SuggestionFilter, - // after being transformed by app/assets/javascripts/vue_shared/components/markdown/suggestions.vue - { - tag: '.md-suggestion', - skip: true, - }, - { - tag: '.md-suggestion-header', - ignore: true, - }, - { - tag: '.md-suggestion-diff', - preserveWhitespace: 'full', - getContent: (el, schema) => - [...el.querySelectorAll('.line_content.new span')].map((span) => - schema.text(span.innerText), - ), - attrs: { lang: 'suggestion' }, - }, - ], - toDOM: (node) => ['pre', { class: 'code highlight', lang: node.attrs.lang }, ['code', 0]], - }; - } + }, + // Matches HTML generated by Banzai::Filter::MathFilter, + // after being transformed by app/assets/javascripts/behaviors/markdown/render_math.js + { + tag: 'span.katex-display', + preserveWhitespace: 'full', + contentElement: 'annotation[encoding="application/x-tex"]', + attrs: { lang: 'math' }, + }, + // Matches HTML generated by Banzai::Filter::MermaidFilter, + // after being transformed by app/assets/javascripts/behaviors/markdown/render_mermaid.js + { + tag: 'svg.mermaid', + preserveWhitespace: 'full', + contentElement: 'text.source', + attrs: { lang: 'mermaid' }, + }, + // Matches HTML generated by Banzai::Filter::SuggestionFilter, + // after being transformed by app/assets/javascripts/vue_shared/components/markdown/suggestions.vue + { + tag: '.md-suggestion', + skip: true, + }, + { + tag: '.md-suggestion-header', + ignore: true, + }, + { + tag: '.md-suggestion-diff', + preserveWhitespace: 'full', + getContent: (el, schema) => + [...el.querySelectorAll('.line_content.new span')].map((span) => + schema.text(span.innerText), + ), + attrs: { lang: 'suggestion' }, + }, + ], + toDOM: (node) => ['pre', { class: 'code highlight', lang: node.attrs.lang }, ['code', 0]], + }, toMarkdown(state, node) { if (!node.childCount) return; @@ -95,5 +90,5 @@ export default class CodeBlock extends BaseCodeBlock { state.write('```'); state.closeBlock(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/description_details.js b/app/assets/javascripts/behaviors/markdown/nodes/description_details.js index a4451d8ce8..2076028604 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/description_details.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/description_details.js @@ -1,22 +1,14 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class DescriptionDetails extends Node { - get name() { - return 'description_details'; - } +export default () => ({ + name: 'description_details', - get schema() { - return { - content: 'text*', - marks: '', - defining: true, - parseDOM: [{ tag: 'dd' }], - toDOM: () => ['dd', 0], - }; - } + schema: { + content: 'text*', + marks: '', + defining: true, + parseDOM: [{ tag: 'dd' }], + toDOM: () => ['dd', 0], + }, toMarkdown(state, node) { state.flushClose(1); @@ -24,5 +16,5 @@ export default class DescriptionDetails extends Node { state.text(node.textContent, false); state.write(''); state.closeBlock(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/description_list.js b/app/assets/javascripts/behaviors/markdown/nodes/description_list.js index 6aa1aca29d..c5305c4842 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/description_list.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/description_list.js @@ -1,21 +1,12 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class DescriptionList extends Node { - get name() { - return 'description_list'; - } - - get schema() { - return { - content: '(description_term+ description_details+)+', - group: 'block', - parseDOM: [{ tag: 'dl' }], - toDOM: () => ['dl', 0], - }; - } +export default () => ({ + name: 'description_list', + schema: { + content: '(description_term+ description_details+)+', + group: 'block', + parseDOM: [{ tag: 'dl' }], + toDOM: () => ['dl', 0], + }, toMarkdown(state, node) { state.write('
\n'); @@ -24,5 +15,5 @@ export default class DescriptionList extends Node { state.ensureNewLine(); state.write('
'); state.closeBlock(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/description_term.js b/app/assets/javascripts/behaviors/markdown/nodes/description_term.js index 89057ec644..f78f7f13fc 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/description_term.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/description_term.js @@ -1,28 +1,18 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class DescriptionTerm extends Node { - get name() { - return 'description_term'; - } - - get schema() { - return { - content: 'text*', - marks: '', - defining: true, - parseDOM: [{ tag: 'dt' }], - toDOM: () => ['dt', 0], - }; - } - +export default () => ({ + name: 'description_term', + schema: { + content: 'text*', + marks: '', + defining: true, + parseDOM: [{ tag: 'dt' }], + toDOM: () => ['dt', 0], + }, toMarkdown(state, node) { state.flushClose(state.closed && state.closed.type === node.type ? 1 : 2); state.write('
'); state.text(node.textContent, false); state.write('
'); state.closeBlock(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/details.js b/app/assets/javascripts/behaviors/markdown/nodes/details.js index 1c40dbb816..9fb0d60b93 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/details.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/details.js @@ -1,22 +1,12 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class Details extends Node { - get name() { - return 'details'; - } - - get schema() { - return { - content: 'summary block*', - group: 'block', - parseDOM: [{ tag: 'details' }], - toDOM: () => ['details', { open: true, onclick: 'return false', tabindex: '-1' }, 0], - }; - } - +export default () => ({ + name: 'details', + schema: { + content: 'summary block*', + group: 'block', + parseDOM: [{ tag: 'details' }], + toDOM: () => ['details', { open: true, onclick: 'return false', tabindex: '-1' }, 0], + }, toMarkdown(state, node) { state.write('
\n'); state.renderContent(node); @@ -24,5 +14,5 @@ export default class Details extends Node { state.ensureNewLine(); state.write('
'); state.closeBlock(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/doc.js b/app/assets/javascripts/behaviors/markdown/nodes/doc.js index 88b16fd85d..3101e6e0e3 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/doc.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/doc.js @@ -1,15 +1,6 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - -export default class Doc extends Node { - get name() { - return 'doc'; - } - - get schema() { - return { - content: 'block+', - }; - } -} +export default () => ({ + name: 'doc', + schema: { + content: 'block+', + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/emoji.js b/app/assets/javascripts/behaviors/markdown/nodes/emoji.js index 9d0890aa1b..086c277bad 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/emoji.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/emoji.js @@ -1,53 +1,43 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::EmojiFilter -export default class Emoji extends Node { - get name() { - return 'emoji'; - } - - get schema() { - return { - inline: true, - group: 'inline', - attrs: { - name: {}, - title: {}, - moji: {}, +export default () => ({ + name: 'emoji', + schema: { + inline: true, + group: 'inline', + attrs: { + name: {}, + title: {}, + moji: {}, + }, + parseDOM: [ + { + tag: 'gl-emoji', + getAttrs: (el) => ({ + name: el.dataset.name, + title: el.getAttribute('title'), + moji: el.textContent, + }), }, - parseDOM: [ - { - tag: 'gl-emoji', - getAttrs: (el) => ({ - name: el.dataset.name, - title: el.getAttribute('title'), - moji: el.textContent, - }), - }, - { - tag: 'img.emoji', - getAttrs: (el) => { - const name = el.getAttribute('title').replace(/^:|:$/g, ''); + { + tag: 'img.emoji', + getAttrs: (el) => { + const name = el.getAttribute('title').replace(/^:|:$/g, ''); - return { - name, - title: name, - moji: name, - }; - }, + return { + name, + title: name, + moji: name, + }; }, - ], - toDOM: (node) => [ - 'gl-emoji', - { 'data-name': node.attrs.name, title: node.attrs.title }, - node.attrs.moji, - ], - }; - } - + }, + ], + toDOM: (node) => [ + 'gl-emoji', + { 'data-name': node.attrs.name, title: node.attrs.title }, + node.attrs.moji, + ], + }, toMarkdown(state, node) { state.write(`:${node.attrs.name}:`); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/hard_break.js b/app/assets/javascripts/behaviors/markdown/nodes/hard_break.js index 59e5d8ab3e..1668af9c3f 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/hard_break.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/hard_break.js @@ -1,10 +1,14 @@ -/* eslint-disable class-methods-use-this */ - -import { HardBreak as BaseHardBreak } from 'tiptap-extensions'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class HardBreak extends BaseHardBreak { +export default () => ({ + name: 'hard_break', + schema: { + inline: true, + group: 'inline', + selectable: false, + parseDOM: [{ tag: 'br' }], + toDOM: () => ['br'], + }, toMarkdown(state) { if (!state.atBlank()) state.write(' \n'); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/heading.js b/app/assets/javascripts/behaviors/markdown/nodes/heading.js index 29967e61ff..21b4ec69b7 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/heading.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/heading.js @@ -1,13 +1,27 @@ -/* eslint-disable class-methods-use-this */ - -import { Heading as BaseHeading } from 'tiptap-extensions'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class Heading extends BaseHeading { +export default ({ levels = [1, 2, 3, 4, 5, 6] } = {}) => ({ + name: 'heading', + schema: { + attrs: { + level: { + default: 1, + }, + }, + content: 'inline*', + group: 'block', + defining: true, + draggable: false, + parseDOM: levels.map((level) => ({ + tag: `h${level}`, + attrs: { level }, + })), + toDOM: (node) => [`h${node.attrs.level}`, 0], + }, toMarkdown(state, node) { if (!node.childCount) return; defaultMarkdownSerializer.nodes.heading(state, node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/horizontal_rule.js b/app/assets/javascripts/behaviors/markdown/nodes/horizontal_rule.js index ee3aa145dc..2d7074e567 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/horizontal_rule.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/horizontal_rule.js @@ -1,11 +1,14 @@ -/* eslint-disable class-methods-use-this */ - -import { HorizontalRule as BaseHorizontalRule } from 'tiptap-extensions'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class HorizontalRule extends BaseHorizontalRule { +export default () => ({ + name: 'horizontal_rule', + schema: { + group: 'block', + parseDOM: [{ tag: 'hr' }], + toDOM: () => ['hr'], + }, toMarkdown(state, node) { defaultMarkdownSerializer.nodes.horizontal_rule(state, node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/image.js b/app/assets/javascripts/behaviors/markdown/nodes/image.js index 16647d2f96..370cc347a0 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/image.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/image.js @@ -1,53 +1,48 @@ -/* eslint-disable class-methods-use-this */ - -import { Image as BaseImage } from 'tiptap-extensions'; import { placeholderImage } from '~/lazy_loader'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; -export default class Image extends BaseImage { - get schema() { - return { - attrs: { - src: {}, - alt: { - default: null, - }, - title: { - default: null, +export default () => ({ + name: 'image', + schema: { + attrs: { + src: {}, + alt: { + default: null, + }, + title: { + default: null, + }, + }, + group: 'inline', + inline: true, + draggable: true, + parseDOM: [ + // Matches HTML generated by Banzai::Filter::ImageLinkFilter + { + tag: 'a.no-attachment-icon', + priority: HIGHER_PARSE_RULE_PRIORITY, + skip: true, + }, + // Matches HTML generated by Banzai::Filter::ImageLazyLoadFilter + { + tag: 'img[src]:not(.emoji)', + getAttrs: (el) => { + const imageSrc = el.src; + const imageUrl = + imageSrc && imageSrc !== placeholderImage ? imageSrc : el.dataset.src || ''; + + return { + src: imageUrl, + title: el.getAttribute('title'), + alt: el.getAttribute('alt'), + }; }, }, - group: 'inline', - inline: true, - draggable: true, - parseDOM: [ - // Matches HTML generated by Banzai::Filter::ImageLinkFilter - { - tag: 'a.no-attachment-icon', - priority: HIGHER_PARSE_RULE_PRIORITY, - skip: true, - }, - // Matches HTML generated by Banzai::Filter::ImageLazyLoadFilter - { - tag: 'img[src]:not(.emoji)', - getAttrs: (el) => { - const imageSrc = el.src; - const imageUrl = - imageSrc && imageSrc !== placeholderImage ? imageSrc : el.dataset.src || ''; - - return { - src: imageUrl, - title: el.getAttribute('title'), - alt: el.getAttribute('alt'), - }; - }, - }, - ], - toDOM: (node) => ['img', node.attrs], - }; - } - + ], + toDOM: (node) => ['img', node.attrs], + }, toMarkdown(state, node) { defaultMarkdownSerializer.nodes.image(state, node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/list_item.js b/app/assets/javascripts/behaviors/markdown/nodes/list_item.js index 7204b7c09b..97c1f07427 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/list_item.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/list_item.js @@ -1,11 +1,16 @@ -/* eslint-disable class-methods-use-this */ - -import { ListItem as BaseListItem } from 'tiptap-extensions'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class ListItem extends BaseListItem { +export default () => ({ + name: 'list_item', + schema: { + content: 'paragraph block*', + defining: true, + draggable: false, + parseDOM: [{ tag: 'li' }], + toDOM: () => ['li', 0], + }, toMarkdown(state, node) { defaultMarkdownSerializer.nodes.list_item(state, node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/ordered_list.js b/app/assets/javascripts/behaviors/markdown/nodes/ordered_list.js index 4c1542d14e..f2f3eff266 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/ordered_list.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/ordered_list.js @@ -1,10 +1,25 @@ -/* eslint-disable class-methods-use-this */ - -import { OrderedList as BaseOrderedList } from 'tiptap-extensions'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class OrderedList extends BaseOrderedList { +export default () => ({ + name: 'ordered_list', + schema: { + attrs: { + order: { + default: 1, + }, + }, + content: 'list_item+', + group: 'block', + parseDOM: [ + { + tag: 'ol', + getAttrs: (dom) => ({ + order: dom.hasAttribute('start') ? dom.getAttribute('start') + 1 : 1, + }), + }, + ], + toDOM: (node) => (node.attrs.order === 1 ? ['ol', 0] : ['ol', { start: node.attrs.order }, 0]), + }, toMarkdown(state, node) { state.renderList(node, ' ', () => '1. '); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/ordered_task_list.js b/app/assets/javascripts/behaviors/markdown/nodes/ordered_task_list.js index a28d7be375..53a6a0d9e0 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/ordered_task_list.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/ordered_task_list.js @@ -1,29 +1,21 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::TaskListFilter -export default class OrderedTaskList extends Node { - get name() { - return 'ordered_task_list'; - } - - get schema() { - return { - group: 'block', - content: '(task_list_item|list_item)+', - parseDOM: [ - { - priority: HIGHER_PARSE_RULE_PRIORITY, - tag: 'ol.task-list', - }, - ], - toDOM: () => ['ol', { class: 'task-list' }, 0], - }; - } +export default () => ({ + name: 'ordered_task_list', + schema: { + group: 'block', + content: '(task_list_item|list_item)+', + parseDOM: [ + { + priority: HIGHER_PARSE_RULE_PRIORITY, + tag: 'ol.task-list', + }, + ], + toDOM: () => ['ol', { class: 'task-list' }, 0], + }, toMarkdown(state, node) { state.renderList(node, ' ', () => '1. '); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/paragraph.js b/app/assets/javascripts/behaviors/markdown/nodes/paragraph.js index 5fd098cd46..310feebb39 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/paragraph.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/paragraph.js @@ -1,24 +1,15 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class Paragraph extends Node { - get name() { - return 'paragraph'; - } - - get schema() { - return { - content: 'inline*', - group: 'block', - parseDOM: [{ tag: 'p' }], - toDOM: () => ['p', 0], - }; - } - +export default () => ({ + name: 'paragraph', + schema: { + content: 'inline*', + group: 'block', + parseDOM: [{ tag: 'p' }], + toDOM: () => ['p', 0], + }, toMarkdown(state, node) { defaultMarkdownSerializer.nodes.paragraph(state, node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/playable.js b/app/assets/javascripts/behaviors/markdown/nodes/playable.js index 90cbaf9ef4..7559c2a6a8 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/playable.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/playable.js @@ -1,7 +1,3 @@ -/* eslint-disable class-methods-use-this */ -/* eslint-disable @gitlab/require-i18n-strings */ - -import { Node } from 'tiptap'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; /** @@ -10,62 +6,51 @@ import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer * the `mediaType` property in their constructors. * @abstract */ -export default class Playable extends Node { - constructor() { - super(); - this.mediaType = ''; - this.extraElementAttrs = {}; - } - - get name() { - return this.mediaType; - } - - get schema() { - const attrs = { - src: {}, - alt: { - default: null, - }, - }; - - const parseDOM = [ +export default ({ mediaType, extraElementAttrs = {} }) => { + const attrs = { + src: {}, + alt: { + default: null, + }, + }; + const parseDOM = [ + { + // eslint-disable-next-line @gitlab/require-i18n-strings + tag: `.${mediaType}-container`, + getAttrs: (el) => ({ + src: el.querySelector(mediaType).src, + alt: el.querySelector(mediaType).dataset.title, + }), + }, + ]; + const toDOM = (node) => [ + 'span', + { class: `media-container ${mediaType}-container` }, + [ + mediaType, { - tag: `.${this.mediaType}-container`, - getAttrs: (el) => ({ - src: el.querySelector(this.mediaType).src, - alt: el.querySelector(this.mediaType).dataset.title, - }), + src: node.attrs.src, + controls: true, + 'data-setup': '{}', + 'data-title': node.attrs.alt, + ...extraElementAttrs, }, - ]; + ], + ['a', { href: node.attrs.src }, node.attrs.alt], + ]; - const toDOM = (node) => [ - 'span', - { class: `media-container ${this.mediaType}-container` }, - [ - this.mediaType, - { - src: node.attrs.src, - controls: true, - 'data-setup': '{}', - 'data-title': node.attrs.alt, - ...this.extraElementAttrs, - }, - ], - ['a', { href: node.attrs.src }, node.attrs.alt], - ]; - - return { + return { + name: mediaType, + schema: { attrs, group: 'inline', inline: true, draggable: true, parseDOM, toDOM, - }; - } - - toMarkdown(state, node) { - defaultMarkdownSerializer.nodes.image(state, node); - } -} + }, + toMarkdown(state, node) { + defaultMarkdownSerializer.nodes.image(state, node); + }, + }; +}; diff --git a/app/assets/javascripts/behaviors/markdown/nodes/reference.js b/app/assets/javascripts/behaviors/markdown/nodes/reference.js index dd82ea58ea..9ae6ab0700 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/reference.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/reference.js @@ -1,53 +1,44 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::ReferenceFilter and subclasses -export default class Reference extends Node { - get name() { - return 'reference'; - } - - get schema() { - return { - inline: true, - group: 'inline', - atom: true, - attrs: { - className: {}, - referenceType: {}, - originalText: { default: null }, - href: {}, - text: {}, +export default () => ({ + name: 'reference', + schema: { + inline: true, + group: 'inline', + atom: true, + attrs: { + className: {}, + referenceType: {}, + originalText: { default: null }, + href: {}, + text: {}, + }, + parseDOM: [ + { + tag: 'a.gfm:not([data-link=true])', + priority: HIGHER_PARSE_RULE_PRIORITY, + getAttrs: (el) => ({ + className: el.className, + referenceType: el.dataset.referenceType, + originalText: el.dataset.original, + href: el.getAttribute('href'), + text: el.textContent, + }), }, - parseDOM: [ - { - tag: 'a.gfm:not([data-link=true])', - priority: HIGHER_PARSE_RULE_PRIORITY, - getAttrs: (el) => ({ - className: el.className, - referenceType: el.dataset.referenceType, - originalText: el.dataset.original, - href: el.getAttribute('href'), - text: el.textContent, - }), - }, - ], - toDOM: (node) => [ - 'a', - { - class: node.attrs.className, - href: node.attrs.href, - 'data-reference-type': node.attrs.referenceType, - 'data-original': node.attrs.originalText, - }, - node.attrs.text, - ], - }; - } - + ], + toDOM: (node) => [ + 'a', + { + class: node.attrs.className, + href: node.attrs.href, + 'data-reference-type': node.attrs.referenceType, + 'data-original': node.attrs.originalText, + }, + node.attrs.text, + ], + }, toMarkdown(state, node) { state.write(node.attrs.originalText || node.attrs.text); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/summary.js b/app/assets/javascripts/behaviors/markdown/nodes/summary.js index 2e36e316d7..eb91b3c981 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/summary.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/summary.js @@ -1,27 +1,17 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class Summary extends Node { - get name() { - return 'summary'; - } - - get schema() { - return { - content: 'text*', - marks: '', - defining: true, - parseDOM: [{ tag: 'summary' }], - toDOM: () => ['summary', 0], - }; - } - +export default () => ({ + name: 'summary', + schema: { + content: 'text*', + marks: '', + defining: true, + parseDOM: [{ tag: 'summary' }], + toDOM: () => ['summary', 0], + }, toMarkdown(state, node) { state.write(''); state.text(node.textContent, false); state.write(''); state.closeBlock(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/table.js b/app/assets/javascripts/behaviors/markdown/nodes/table.js index a7fcb9227c..c766f7f1fb 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/table.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/table.js @@ -1,25 +1,15 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class Table extends Node { - get name() { - return 'table'; - } - - get schema() { - return { - content: 'table_head table_body', - group: 'block', - isolating: true, - parseDOM: [{ tag: 'table' }], - toDOM: () => ['table', 0], - }; - } - +export default () => ({ + name: 'table', + schema: { + content: 'table_head table_body', + group: 'block', + isolating: true, + parseDOM: [{ tag: 'table' }], + toDOM: () => ['table', 0], + }, toMarkdown(state, node) { state.renderContent(node); state.closeBlock(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/table_body.js b/app/assets/javascripts/behaviors/markdown/nodes/table_body.js index 403556dc0c..0a49fb558a 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/table_body.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/table_body.js @@ -1,24 +1,14 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class TableBody extends Node { - get name() { - return 'table_body'; - } - - get schema() { - return { - content: 'table_row+', - parseDOM: [{ tag: 'tbody' }], - toDOM: () => ['tbody', 0], - }; - } - - toMarkdown(state, node) { +export default () => ({ + name: 'table_body', + schema: { + content: 'table_row+', + parseDOM: [{ tag: 'tbody' }], + toDOM: () => ['tbody', 0], + }, + toMarkdown: (state, node) => { state.flushClose(1); state.renderContent(node); state.closeBlock(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/table_cell.js b/app/assets/javascripts/behaviors/markdown/nodes/table_cell.js index ebb66cd4da..f46344ba43 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/table_cell.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/table_cell.js @@ -1,35 +1,25 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class TableCell extends Node { - get name() { - return 'table_cell'; - } - - get schema() { - return { - attrs: { - header: { default: false }, - align: { default: null }, +export default () => ({ + name: 'table_cell', + schema: { + attrs: { + header: { default: false }, + align: { default: null }, + }, + content: 'inline*', + isolating: true, + parseDOM: [ + { + tag: 'td, th', + getAttrs: (el) => ({ + header: el.tagName === 'TH', + align: el.getAttribute('align') || el.style.textAlign, + }), }, - content: 'inline*', - isolating: true, - parseDOM: [ - { - tag: 'td, th', - getAttrs: (el) => ({ - header: el.tagName === 'TH', - align: el.getAttribute('align') || el.style.textAlign, - }), - }, - ], - toDOM: (node) => [node.attrs.header ? 'th' : 'td', { align: node.attrs.align }, 0], - }; - } - - toMarkdown(state, node) { + ], + toDOM: (node) => [node.attrs.header ? 'th' : 'td', { align: node.attrs.align }, 0], + }, + toMarkdown: (state, node) => { state.renderInline(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/table_head.js b/app/assets/javascripts/behaviors/markdown/nodes/table_head.js index 4cb94bf088..2e9b53ee0a 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/table_head.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/table_head.js @@ -1,24 +1,14 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class TableHead extends Node { - get name() { - return 'table_head'; - } - - get schema() { - return { - content: 'table_header_row', - parseDOM: [{ tag: 'thead' }], - toDOM: () => ['thead', 0], - }; - } - - toMarkdown(state, node) { +export default () => ({ + name: 'table_head', + schema: { + content: 'table_header_row', + parseDOM: [{ tag: 'thead' }], + toDOM: () => ['thead', 0], + }, + toMarkdown: (state, node) => { state.flushClose(1); state.renderContent(node); state.closeBlock(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/table_header_row.js b/app/assets/javascripts/behaviors/markdown/nodes/table_header_row.js index 2cb2bb9e7f..d8aa497066 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/table_header_row.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/table_header_row.js @@ -1,31 +1,23 @@ -/* eslint-disable class-methods-use-this */ - import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; import TableRow from './table_row'; const CENTER_ALIGN = 'center'; // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class TableHeaderRow extends TableRow { - get name() { - return 'table_header_row'; - } - - get schema() { - return { - content: 'table_cell+', - parseDOM: [ - { - tag: 'thead tr', - priority: HIGHER_PARSE_RULE_PRIORITY, - }, - ], - toDOM: () => ['tr', 0], - }; - } - - toMarkdown(state, node) { - const cellWidths = super.toMarkdown(state, node); +export default () => ({ + name: 'table_header_row', + schema: { + content: 'table_cell+', + parseDOM: [ + { + tag: 'thead tr', + priority: HIGHER_PARSE_RULE_PRIORITY, + }, + ], + toDOM: () => ['tr', 0], + }, + toMarkdown: (state, node) => { + const cellWidths = TableRow().toMarkdown(state, node); state.flushClose(1); @@ -40,5 +32,5 @@ export default class TableHeaderRow extends TableRow { state.write('|'); state.closeBlock(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/table_of_contents.js b/app/assets/javascripts/behaviors/markdown/nodes/table_of_contents.js index db9072acc3..4a0256c464 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/table_of_contents.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/table_of_contents.js @@ -1,35 +1,26 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; import { __ } from '~/locale'; import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::TableOfContentsFilter -export default class TableOfContents extends Node { - get name() { - return 'table_of_contents'; - } - - get schema() { - return { - group: 'block', - atom: true, - parseDOM: [ - { - tag: 'ul.section-nav', - priority: HIGHER_PARSE_RULE_PRIORITY, - }, - { - tag: 'p.table-of-contents', - priority: HIGHER_PARSE_RULE_PRIORITY, - }, - ], - toDOM: () => ['p', { class: 'table-of-contents' }, __('Table of Contents')], - }; - } - - toMarkdown(state, node) { +export default () => ({ + name: 'table_of_contents', + schema: { + group: 'block', + atom: true, + parseDOM: [ + { + tag: 'ul.section-nav', + priority: HIGHER_PARSE_RULE_PRIORITY, + }, + { + tag: 'p.table-of-contents', + priority: HIGHER_PARSE_RULE_PRIORITY, + }, + ], + toDOM: () => ['p', { class: 'table-of-contents' }, __('Table of Contents')], + }, + toMarkdown: (state, node) => { state.write('[[_TOC_]]'); state.closeBlock(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/table_row.js b/app/assets/javascripts/behaviors/markdown/nodes/table_row.js index 5852502773..3830dae4f0 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/table_row.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/table_row.js @@ -1,22 +1,12 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; - // Transforms generated HTML back to GFM for Banzai::Filter::MarkdownFilter -export default class TableRow extends Node { - get name() { - return 'table_row'; - } - - get schema() { - return { - content: 'table_cell+', - parseDOM: [{ tag: 'tr' }], - toDOM: () => ['tr', 0], - }; - } - - toMarkdown(state, node) { +export default () => ({ + name: 'table_row', + schema: { + content: 'table_cell+', + parseDOM: [{ tag: 'tr' }], + toDOM: () => ['tr', 0], + }, + toMarkdown: (state, node) => { const cellWidths = []; state.flushClose(1); @@ -34,5 +24,5 @@ export default class TableRow extends Node { state.closeBlock(node); return cellWidths; - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/task_list.js b/app/assets/javascripts/behaviors/markdown/nodes/task_list.js index 35ba2eb067..3c3812ad8f 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/task_list.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/task_list.js @@ -1,29 +1,20 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::TaskListFilter -export default class TaskList extends Node { - get name() { - return 'task_list'; - } - - get schema() { - return { - group: 'block', - content: '(task_list_item|list_item)+', - parseDOM: [ - { - priority: HIGHER_PARSE_RULE_PRIORITY, - tag: 'ul.task-list', - }, - ], - toDOM: () => ['ul', { class: 'task-list' }, 0], - }; - } - +export default () => ({ + name: 'task_list', + schema: { + group: 'block', + content: '(task_list_item|list_item)+', + parseDOM: [ + { + priority: HIGHER_PARSE_RULE_PRIORITY, + tag: 'ul.task-list', + }, + ], + toDOM: () => ['ul', { class: 'task-list' }, 0], + }, toMarkdown(state, node) { state.renderList(node, ' ', () => '* '); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/task_list_item.js b/app/assets/javascripts/behaviors/markdown/nodes/task_list_item.js index 56c2b17286..10ffce9b1b 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/task_list_item.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/task_list_item.js @@ -1,50 +1,38 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; import { HIGHER_PARSE_RULE_PRIORITY } from '../constants'; // Transforms generated HTML back to GFM for Banzai::Filter::TaskListFilter -export default class TaskListItem extends Node { - get name() { - return 'task_list_item'; - } - - get schema() { - return { - attrs: { - done: { - default: false, +export default () => ({ + name: 'task_list_item', + schema: { + attrs: { + done: { + default: false, + }, + }, + defining: true, + draggable: false, + content: 'paragraph block*', + parseDOM: [ + { + priority: HIGHER_PARSE_RULE_PRIORITY, + tag: 'li.task-list-item', + getAttrs: (el) => { + const checkbox = el.querySelector('input[type=checkbox].task-list-item-checkbox'); + return { done: checkbox && checkbox.checked }; }, }, - defining: true, - draggable: false, - content: 'paragraph block*', - parseDOM: [ - { - priority: HIGHER_PARSE_RULE_PRIORITY, - tag: 'li.task-list-item', - getAttrs: (el) => { - const checkbox = el.querySelector('input[type=checkbox].task-list-item-checkbox'); - return { done: checkbox && checkbox.checked }; - }, - }, - ], - toDOM(node) { - return [ - 'li', - { class: 'task-list-item' }, - [ - 'input', - { type: 'checkbox', class: 'task-list-item-checkbox', checked: node.attrs.done }, - ], - ['div', { class: 'todo-content' }, 0], - ]; - }, - }; - } - + ], + toDOM(node) { + return [ + 'li', + { class: 'task-list-item' }, + ['input', { type: 'checkbox', class: 'task-list-item-checkbox', checked: node.attrs.done }], + ['div', { class: 'todo-content' }, 0], + ]; + }, + }, toMarkdown(state, node) { state.write(`[${node.attrs.done ? 'x' : ' '}] `); state.renderContent(node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/text.js b/app/assets/javascripts/behaviors/markdown/nodes/text.js index 0dc77a12f5..0e1f0bc0e4 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/text.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/text.js @@ -1,20 +1,11 @@ -/* eslint-disable class-methods-use-this */ - -import { Node } from 'tiptap'; import { defaultMarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; -export default class Text extends Node { - get name() { - return 'text'; - } - - get schema() { - return { - group: 'inline', - }; - } - +export default () => ({ + name: 'text', + schema: { + group: 'inline', + }, toMarkdown(state, node) { defaultMarkdownSerializer.nodes.text(state, node); - } -} + }, +}); diff --git a/app/assets/javascripts/behaviors/markdown/nodes/video.js b/app/assets/javascripts/behaviors/markdown/nodes/video.js index 68085c2c41..aa1088826d 100644 --- a/app/assets/javascripts/behaviors/markdown/nodes/video.js +++ b/app/assets/javascripts/behaviors/markdown/nodes/video.js @@ -1,10 +1,4 @@ -import Playable from './playable'; +import playable from './playable'; // Transforms generated HTML back to GFM for Banzai::Filter::VideoLinkFilter -export default class Video extends Playable { - constructor() { - super(); - this.mediaType = 'video'; - this.extraElementAttrs = { width: '400' }; - } -} +export default () => playable({ mediaType: 'video', extraElementAttrs: { width: '400' } }); diff --git a/app/assets/javascripts/behaviors/markdown/render_sandboxed_mermaid.js b/app/assets/javascripts/behaviors/markdown/render_sandboxed_mermaid.js index 399e491669..6922ec9c5a 100644 --- a/app/assets/javascripts/behaviors/markdown/render_sandboxed_mermaid.js +++ b/app/assets/javascripts/behaviors/markdown/render_sandboxed_mermaid.js @@ -72,7 +72,7 @@ function renderMermaidEl(el, source) { const iframeEl = document.createElement('iframe'); setAttributes(iframeEl, { src: getSandboxFrameSrc(), - sandbox: 'allow-scripts', + sandbox: 'allow-scripts allow-popups', frameBorder: 0, scrolling: 'no', width: '100%', diff --git a/app/assets/javascripts/behaviors/markdown/schema.js b/app/assets/javascripts/behaviors/markdown/schema.js index 8bea24584c..1b0f46ff4c 100644 --- a/app/assets/javascripts/behaviors/markdown/schema.js +++ b/app/assets/javascripts/behaviors/markdown/schema.js @@ -1,24 +1,20 @@ import { Schema } from 'prosemirror-model'; import editorExtensions from './editor_extensions'; -const nodes = editorExtensions - .filter((extension) => extension.type === 'node') - .reduce( - (ns, { name, schema }) => ({ - ...ns, - [name]: schema, - }), - {}, - ); +const nodes = editorExtensions.nodes.reduce( + (ns, { name, schema }) => ({ + ...ns, + [name]: schema, + }), + {}, +); -const marks = editorExtensions - .filter((extension) => extension.type === 'mark') - .reduce( - (ms, { name, schema }) => ({ - ...ms, - [name]: schema, - }), - {}, - ); +const marks = editorExtensions.marks.reduce( + (ms, { name, schema }) => ({ + ...ms, + [name]: schema, + }), + {}, +); export default new Schema({ nodes, marks }); diff --git a/app/assets/javascripts/behaviors/markdown/serializer.js b/app/assets/javascripts/behaviors/markdown/serializer.js index a5f97d7748..e3e8a380cd 100644 --- a/app/assets/javascripts/behaviors/markdown/serializer.js +++ b/app/assets/javascripts/behaviors/markdown/serializer.js @@ -1,24 +1,20 @@ import { MarkdownSerializer } from '~/lib/prosemirror_markdown_serializer'; import editorExtensions from './editor_extensions'; -const nodes = editorExtensions - .filter((extension) => extension.type === 'node') - .reduce( - (ns, { name, toMarkdown }) => ({ - ...ns, - [name]: toMarkdown, - }), - {}, - ); +const nodes = editorExtensions.nodes.reduce( + (ns, { name, toMarkdown }) => ({ + ...ns, + [name]: toMarkdown, + }), + {}, +); -const marks = editorExtensions - .filter((extension) => extension.type === 'mark') - .reduce( - (ms, { name, toMarkdown }) => ({ - ...ms, - [name]: toMarkdown, - }), - {}, - ); +const marks = editorExtensions.marks.reduce( + (ms, { name, toMarkdown }) => ({ + ...ms, + [name]: toMarkdown, + }), + {}, +); export default new MarkdownSerializer(nodes, marks); diff --git a/app/assets/javascripts/behaviors/shortcuts/keybindings.js b/app/assets/javascripts/behaviors/shortcuts/keybindings.js index b27dccabdf..23b6640584 100644 --- a/app/assets/javascripts/behaviors/shortcuts/keybindings.js +++ b/app/assets/javascripts/behaviors/shortcuts/keybindings.js @@ -131,6 +131,13 @@ export const ITALIC_TEXT = { customizable: false, }; +export const STRIKETHROUGH_TEXT = { + id: 'editing.strikethroughText', + description: __('Strikethrough text'), + defaultKeys: ['mod+shift+x'], + customizable: false, +}; + export const LINK_TEXT = { id: 'editing.linkText', description: __('Link text'), @@ -511,7 +518,14 @@ export const GLOBAL_SHORTCUTS_GROUP = { export const EDITING_SHORTCUTS_GROUP = { id: 'editing', name: __('Editing'), - keybindings: [BOLD_TEXT, ITALIC_TEXT, LINK_TEXT, TOGGLE_MARKDOWN_PREVIEW, EDIT_RECENT_COMMENT], + keybindings: [ + BOLD_TEXT, + ITALIC_TEXT, + STRIKETHROUGH_TEXT, + LINK_TEXT, + TOGGLE_MARKDOWN_PREVIEW, + EDIT_RECENT_COMMENT, + ], }; export const WIKI_SHORTCUTS_GROUP = { diff --git a/app/assets/javascripts/behaviors/shortcuts/shortcuts.js b/app/assets/javascripts/behaviors/shortcuts/shortcuts.js index 9297b14aac..4d78c7b56a 100644 --- a/app/assets/javascripts/behaviors/shortcuts/shortcuts.js +++ b/app/assets/javascripts/behaviors/shortcuts/shortcuts.js @@ -173,12 +173,7 @@ export default class Shortcuts { e.preventDefault(); const canaryCookieName = 'gitlab_canary'; const currentValue = parseBoolean(getCookie(canaryCookieName)); - setCookie(canaryCookieName, (!currentValue).toString(), { - expires: 365, - path: '/', - // next.gitlab.com uses a leading period. See https://gitlab.com/gitlab-org/gitlab/-/issues/350186 - domain: `.${window.location.hostname}`, - }); + setCookie(canaryCookieName, (!currentValue).toString(), { expires: 365, path: '/' }); refreshCurrentPage(); } diff --git a/app/assets/javascripts/blob/components/blob_header.vue b/app/assets/javascripts/blob/components/blob_header.vue index c5ab28e6ec..8a4fe1a902 100644 --- a/app/assets/javascripts/blob/components/blob_header.vue +++ b/app/assets/javascripts/blob/components/blob_header.vue @@ -63,6 +63,9 @@ export default { isEmpty() { return this.blob.rawSize === 0; }, + blobSwitcherDocIcon() { + return this.blob.richViewer?.fileType === 'csv' ? 'table' : 'document'; + }, }, watch: { viewer(newVal, oldVal) { @@ -90,7 +93,7 @@ export default {
- + diff --git a/app/assets/javascripts/blob/components/blob_header_default_actions.vue b/app/assets/javascripts/blob/components/blob_header_default_actions.vue index 12bcb24b0c..61baf4fa49 100644 --- a/app/assets/javascripts/blob/components/blob_header_default_actions.vue +++ b/app/assets/javascripts/blob/components/blob_header_default_actions.vue @@ -1,6 +1,7 @@ diff --git a/app/assets/javascripts/blob/template_selector.js b/app/assets/javascripts/blob/template_selector.js index 9fa70ce3c6..7eb699eacb 100644 --- a/app/assets/javascripts/blob/template_selector.js +++ b/app/assets/javascripts/blob/template_selector.js @@ -2,6 +2,7 @@ import $ from 'jquery'; import initDeprecatedJQueryDropdown from '~/deprecated_jquery_dropdown'; +import { loadingIconForLegacyJS } from '~/loading_icon_for_legacy_js'; export default class TemplateSelector { constructor({ dropdown, data, pattern, wrapper, editor, $input } = {}) { @@ -10,10 +11,9 @@ export default class TemplateSelector { this.dropdown = dropdown; this.$dropdownContainer = wrapper; this.$filenameInput = $input || $('#file_name'); - this.$dropdownIcon = $('.dropdown-menu-toggle-icon', dropdown); - this.$loadingIcon = $( - '
', - ).insertAfter(this.$dropdownIcon); + this.dropdownIcon = dropdown[0].querySelector('.dropdown-menu-toggle-icon'); + this.loadingIcon = loadingIconForLegacyJS({ classes: ['gl-display-none'] }); + this.dropdownIcon.parentNode.insertBefore(this.loadingIcon, this.dropdownIcon.nextSibling); this.initDropdown(dropdown, data); this.listenForFilenameInput(); @@ -78,7 +78,12 @@ export default class TemplateSelector { setEditorContent(file, { skipFocus } = {}) { if (!file) return; - const newValue = file.content; + let newValue = file.content; + + const urlParams = new URLSearchParams(window.location.search); + if (urlParams.has('issue[description]')) { + newValue += `\n${urlParams.get('issue[description]')}`; + } this.editor.setValue(newValue, 1); @@ -95,12 +100,12 @@ export default class TemplateSelector { } startLoadingSpinner() { - this.$loadingIcon.removeClass('gl-display-none'); - this.$dropdownIcon.addClass('gl-display-none'); + this.loadingIcon.classList.remove('gl-display-none'); + this.dropdownIcon.classList.add('gl-display-none'); } stopLoadingSpinner() { - this.$loadingIcon.addClass('gl-display-none'); - this.$dropdownIcon.removeClass('gl-display-none'); + this.loadingIcon.classList.add('gl-display-none'); + this.dropdownIcon.classList.remove('gl-display-none'); } } diff --git a/app/assets/javascripts/blob_edit/blob_bundle.js b/app/assets/javascripts/blob_edit/blob_bundle.js index 2d9ffda06d..425de914c1 100644 --- a/app/assets/javascripts/blob_edit/blob_bundle.js +++ b/app/assets/javascripts/blob_edit/blob_bundle.js @@ -2,7 +2,6 @@ import $ from 'jquery'; import initPopover from '~/blob/suggest_gitlab_ci_yml'; -import initCodeQualityWalkthrough from '~/code_quality_walkthrough'; import createFlash from '~/flash'; import { disableButtonIfEmptyField, setCookie } from '~/lib/utils/common_utils'; import Tracking from '~/tracking'; @@ -39,13 +38,6 @@ const initPopovers = () => { } }; -const initCodeQualityWalkthroughStep = () => { - const codeQualityWalkthroughEl = document.querySelector('.js-code-quality-walkthrough'); - if (codeQualityWalkthroughEl) { - initCodeQualityWalkthrough(codeQualityWalkthroughEl); - } -}; - export const initUploadForm = () => { const uploadBlobForm = $('.js-upload-blob-form'); if (uploadBlobForm.length) { @@ -71,7 +63,7 @@ export default () => { const isMarkdown = editBlobForm.data('is-markdown'); const previewMarkdownPath = editBlobForm.data('previewMarkdownPath'); const commitButton = $('.js-commit-button'); - const cancelLink = $('.btn.btn-cancel'); + const cancelLink = $('#cancel-changes'); import('./edit_blob') .then(({ default: EditBlob } = {}) => { @@ -84,7 +76,6 @@ export default () => { previewMarkdownPath, }); initPopovers(); - initCodeQualityWalkthroughStep(); }) .catch((e) => createFlash({ diff --git a/app/assets/javascripts/boards/boards_util.js b/app/assets/javascripts/boards/boards_util.js index 7e4d3ebb68..96cc774a28 100644 --- a/app/assets/javascripts/boards/boards_util.js +++ b/app/assets/javascripts/boards/boards_util.js @@ -1,5 +1,6 @@ import { sortBy, cloneDeep } from 'lodash'; -import { isGid } from '~/graphql_shared/utils'; +import { TYPE_BOARD, TYPE_ITERATION, TYPE_MILESTONE, TYPE_USER } from '~/graphql_shared/constants'; +import { isGid, convertToGraphQLId } from '~/graphql_shared/utils'; import { ListType, MilestoneIDs, AssigneeFilterType, MilestoneFilterType } from './constants'; export function getMilestone() { @@ -80,19 +81,22 @@ export function formatListsPageInfo(lists) { } export function fullBoardId(boardId) { - return `gid://gitlab/Board/${boardId}`; + if (!boardId) { + return null; + } + return convertToGraphQLId(TYPE_BOARD, boardId); } export function fullIterationId(id) { - return `gid://gitlab/Iteration/${id}`; + return convertToGraphQLId(TYPE_ITERATION, id); } export function fullUserId(id) { - return `gid://gitlab/User/${id}`; + return convertToGraphQLId(TYPE_USER, id); } export function fullMilestoneId(id) { - return `gid://gitlab/Milestone/${id}`; + return convertToGraphQLId(TYPE_MILESTONE, id); } export function fullLabelId(label) { diff --git a/app/assets/javascripts/boards/components/board_filtered_search.vue b/app/assets/javascripts/boards/components/board_filtered_search.vue index 45192b5304..95d4fd5bc0 100644 --- a/app/assets/javascripts/boards/components/board_filtered_search.vue +++ b/app/assets/javascripts/boards/components/board_filtered_search.vue @@ -151,10 +151,10 @@ export default { }); } - if (this.filterParams['not[iteration_id]']) { + if (this.filterParams['not[iterationId]']) { filteredSearchValue.push({ - type: 'iteration_id', - value: { data: this.filterParams['not[iteration_id]'], operator: '!=' }, + type: 'iteration', + value: { data: this.filterParams['not[iterationId]'], operator: '!=' }, }); } diff --git a/app/assets/javascripts/boards/components/board_form.vue b/app/assets/javascripts/boards/components/board_form.vue index cc048e2af1..5fcf951470 100644 --- a/app/assets/javascripts/boards/components/board_form.vue +++ b/app/assets/javascripts/boards/components/board_form.vue @@ -1,11 +1,9 @@ + + diff --git a/app/assets/javascripts/ci_secure_files/index.js b/app/assets/javascripts/ci_secure_files/index.js new file mode 100644 index 0000000000..18b4ac6866 --- /dev/null +++ b/app/assets/javascripts/ci_secure_files/index.js @@ -0,0 +1,17 @@ +import Vue from 'vue'; +import SecureFilesList from './components/secure_files_list.vue'; + +export const initCiSecureFiles = (selector = '#js-ci-secure-files') => { + const containerEl = document.querySelector(selector); + const { projectId } = containerEl.dataset; + + return new Vue({ + el: containerEl, + provide: { + projectId, + }, + render(createElement) { + return createElement(SecureFilesList); + }, + }); +}; diff --git a/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue b/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue index 4ab9b36058..4156717908 100644 --- a/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue +++ b/app/assets/javascripts/ci_settings_pipeline_triggers/components/triggers_list.vue @@ -8,8 +8,12 @@ import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link export default { i18n: { + copyTrigger: s__('Pipelines|Copy trigger token'), editButton: s__('Pipelines|Edit'), - revokeButton: s__('Pipelines|Revoke'), + revokeButton: s__('Pipelines|Revoke trigger'), + revokeButtonConfirm: s__( + 'Pipelines|By revoking a trigger you will break any processes making use of it. Are you sure?', + ), }, components: { GlTable, @@ -72,7 +76,7 @@ export default { :text="item.token" data-testid="clipboard-btn" data-qa-selector="clipboard_button" - :title="s__('Pipelines|Copy trigger token')" + :title="$options.i18n.copyTrigger" css-class="gl-border-none gl-py-0 gl-px-2" />
@@ -122,13 +126,9 @@ export default { :title="$options.i18n.revokeButton" :aria-label="$options.i18n.revokeButton" icon="remove" - variant="warning" - :data-confirm=" - s__( - 'Pipelines|By revoking a trigger you will break any processes making use of it. Are you sure?', - ) - " + :data-confirm="$options.i18n.revokeButtonConfirm" data-method="delete" + data-confirm-btn-variant="danger" rel="nofollow" class="gl-ml-3" data-testid="trigger_revoke_button" diff --git a/app/assets/javascripts/ci_variable_list/ci_variable_list.js b/app/assets/javascripts/ci_variable_list/ci_variable_list.js index 065cb4f561..055e2f83e3 100644 --- a/app/assets/javascripts/ci_variable_list/ci_variable_list.js +++ b/app/assets/javascripts/ci_variable_list/ci_variable_list.js @@ -3,7 +3,6 @@ import SecretValues from '../behaviors/secret_values'; import CreateItemDropdown from '../create_item_dropdown'; import { parseBoolean } from '../lib/utils/common_utils'; import { s__ } from '../locale'; -import setupToggleButtons from '../toggle_buttons'; const ALL_ENVIRONMENTS_STRING = s__('CiVariable|All environments'); @@ -115,8 +114,6 @@ export default class VariableList { initRow(rowEl) { const $row = $(rowEl); - setupToggleButtons($row[0]); - // Reset the resizable textarea $row.find(this.inputMap.secret_value.selector).css('height', ''); diff --git a/app/assets/javascripts/clusters/agents/components/create_token_button.vue b/app/assets/javascripts/clusters/agents/components/create_token_button.vue new file mode 100644 index 0000000000..3e1a8994fb --- /dev/null +++ b/app/assets/javascripts/clusters/agents/components/create_token_button.vue @@ -0,0 +1,246 @@ + + + diff --git a/app/assets/javascripts/clusters/agents/components/show.vue b/app/assets/javascripts/clusters/agents/components/show.vue index 63f068a932..5df3e0811a 100644 --- a/app/assets/javascripts/clusters/agents/components/show.vue +++ b/app/assets/javascripts/clusters/agents/components/show.vue @@ -143,7 +143,7 @@ export default {
- +
diff --git a/app/assets/javascripts/clusters/agents/components/token_table.vue b/app/assets/javascripts/clusters/agents/components/token_table.vue index 019fac531d..fbb39c28d7 100644 --- a/app/assets/javascripts/clusters/agents/components/token_table.vue +++ b/app/assets/javascripts/clusters/agents/components/token_table.vue @@ -1,17 +1,17 @@ - + diff --git a/app/assets/javascripts/clusters_list/components/clusters_actions.vue b/app/assets/javascripts/clusters_list/components/clusters_actions.vue index 5b8dc74b84..ccb973f1eb 100644 --- a/app/assets/javascripts/clusters_list/components/clusters_actions.vue +++ b/app/assets/javascripts/clusters_list/components/clusters_actions.vue @@ -1,5 +1,6 @@ - - diff --git a/app/assets/javascripts/code_quality_walkthrough/constants.js b/app/assets/javascripts/code_quality_walkthrough/constants.js deleted file mode 100644 index 011df06b5c..0000000000 --- a/app/assets/javascripts/code_quality_walkthrough/constants.js +++ /dev/null @@ -1,67 +0,0 @@ -import { s__ } from '~/locale'; - -export const EXPERIMENT_NAME = 'code_quality_walkthrough'; - -export const STEPS = { - commitCiFile: 'commit_ci_file', - runningPipeline: 'running_pipeline', - successPipeline: 'success_pipeline', - failedPipeline: 'failed_pipeline', - troubleshootJob: 'troubleshoot_job', -}; - -export const STEPSTATES = { - [STEPS.commitCiFile]: { - title: s__("codeQualityWalkthrough|Let's start by creating a new CI file."), - body: s__( - 'codeQualityWalkthrough|To begin with code quality, we first need to create a new CI file using our code editor. We added a code quality template in the code editor to help you get started %{emojiStart}wink%{emojiEnd} .%{lineBreak}Take some time to review the template, when you are ready, use the %{strongStart}commit changes%{strongEnd} button at the bottom of the page.', - ), - buttonText: s__('codeQualityWalkthrough|Got it'), - placement: 'right', - offset: 90, - }, - [STEPS.runningPipeline]: { - title: s__( - 'codeQualityWalkthrough|Congrats! Your first pipeline is running %{emojiStart}zap%{emojiEnd}', - ), - body: s__( - "codeQualityWalkthrough|Your pipeline can take a few minutes to run. If you enabled email notifications, you'll receive an email with your pipeline status. In the meantime, why don't you get some coffee? You earned it!", - ), - buttonText: s__('codeQualityWalkthrough|Got it'), - offset: 97, - }, - [STEPS.successPipeline]: { - title: s__( - "codeQualityWalkthrough|Well done! You've just automated your code quality review. %{emojiStart}raised_hands%{emojiEnd}", - ), - body: s__( - 'codeQualityWalkthrough|A code quality job will now run every time you or your team members commit changes to your project. You can view the results of the code quality job in the job logs.', - ), - buttonText: s__('codeQualityWalkthrough|View the logs'), - offset: 98, - }, - [STEPS.failedPipeline]: { - title: s__( - "codeQualityWalkthrough|Something went wrong. %{emojiStart}thinking%{emojiEnd} Let's fix it.", - ), - body: s__( - "codeQualityWalkthrough|Your job failed. No worries - this happens. Let's view the logs, and see how we can fix it.", - ), - buttonText: s__('codeQualityWalkthrough|View the logs'), - offset: 98, - }, - [STEPS.troubleshootJob]: { - title: s__('codeQualityWalkthrough|Troubleshoot your code quality job'), - body: s__( - 'codeQualityWalkthrough|Not sure how to fix your failed job? We have compiled some tips on how to troubleshoot code quality jobs in the documentation.', - ), - buttonText: s__('codeQualityWalkthrough|Read the documentation'), - }, -}; - -export const PIPELINE_STATUSES = { - running: 'running', - successWithWarnings: 'success-with-warnings', - success: 'success', - failed: 'failed', -}; diff --git a/app/assets/javascripts/code_quality_walkthrough/index.js b/app/assets/javascripts/code_quality_walkthrough/index.js deleted file mode 100644 index b0592b8a84..0000000000 --- a/app/assets/javascripts/code_quality_walkthrough/index.js +++ /dev/null @@ -1,14 +0,0 @@ -import Vue from 'vue'; -import Step from './components/step.vue'; - -export default (el) => - new Vue({ - el, - render(createElement) { - return createElement(Step, { - props: { - step: el.dataset.step, - }, - }); - }, - }); diff --git a/app/assets/javascripts/code_quality_walkthrough/utils.js b/app/assets/javascripts/code_quality_walkthrough/utils.js deleted file mode 100644 index 894ec9a171..0000000000 --- a/app/assets/javascripts/code_quality_walkthrough/utils.js +++ /dev/null @@ -1,39 +0,0 @@ -import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants'; -import { getExperimentData } from '~/experimentation/utils'; -import { setCookie, getCookie } from '~/lib/utils/common_utils'; -import { getParameterByName } from '~/lib/utils/url_utility'; -import Tracking from '~/tracking'; -import { EXPERIMENT_NAME } from './constants'; - -export function getExperimentSettings() { - return JSON.parse(getCookie(EXPERIMENT_NAME) || '{}'); -} - -export function setExperimentSettings(settings) { - setCookie(EXPERIMENT_NAME, settings); -} - -export function isWalkthroughEnabled() { - return getParameterByName(EXPERIMENT_NAME); -} - -export function track(action) { - const { data } = getExperimentSettings(); - - if (data) { - Tracking.event(EXPERIMENT_NAME, action, { - context: { - schema: TRACKING_CONTEXT_SCHEMA, - data, - }, - }); - } -} - -export function startCodeQualityWalkthrough() { - const data = getExperimentData(EXPERIMENT_NAME); - - if (data) { - setExperimentSettings({ data }); - } -} diff --git a/app/assets/javascripts/commons/nav/user_merge_requests.js b/app/assets/javascripts/commons/nav/user_merge_requests.js index 84ab728274..784e9cb2fa 100644 --- a/app/assets/javascripts/commons/nav/user_merge_requests.js +++ b/app/assets/javascripts/commons/nav/user_merge_requests.js @@ -23,7 +23,18 @@ function updateReviewerMergeRequestCounts(newCount) { function updateMergeRequestCounts(newCount) { const mergeRequestsCountEl = document.querySelector('.js-merge-requests-count'); mergeRequestsCountEl.textContent = newCount.toLocaleString(); - mergeRequestsCountEl.classList.toggle('hidden', Number(newCount) === 0); + mergeRequestsCountEl.classList.toggle('gl-display-none', Number(newCount) === 0); +} + +function updateAttentionRequestsCount(count) { + const attentionCountEl = document.querySelector('.js-attention-count'); + attentionCountEl.textContent = count.toLocaleString(); + + if (Number(count) === 0) { + attentionCountEl.classList.replace('badge-warning', 'badge-neutral'); + } else { + attentionCountEl.classList.replace('badge-neutral', 'badge-warning'); + } } /** @@ -32,14 +43,22 @@ function updateMergeRequestCounts(newCount) { export function refreshUserMergeRequestCounts() { return getUserCounts() .then(({ data }) => { + const attentionRequestsEnabled = window.gon?.features?.mrAttentionRequests; const assignedMergeRequests = data.assigned_merge_requests; const reviewerMergeRequests = data.review_requested_merge_requests; - const fullCount = assignedMergeRequests + reviewerMergeRequests; + const attentionRequests = data.attention_requests; + const fullCount = attentionRequestsEnabled + ? attentionRequests + : assignedMergeRequests + reviewerMergeRequests; updateUserMergeRequestCounts(assignedMergeRequests); updateReviewerMergeRequestCounts(reviewerMergeRequests); updateMergeRequestCounts(fullCount); broadcastCount(fullCount); + + if (attentionRequestsEnabled) { + updateAttentionRequestsCount(attentionRequests); + } }) .catch((ex) => { console.error(ex); // eslint-disable-line no-console diff --git a/app/assets/javascripts/content_editor/components/content_editor.vue b/app/assets/javascripts/content_editor/components/content_editor.vue index a8405fe37c..a942c9f114 100644 --- a/app/assets/javascripts/content_editor/components/content_editor.vue +++ b/app/assets/javascripts/content_editor/components/content_editor.vue @@ -1,17 +1,16 @@ + diff --git a/app/assets/javascripts/content_editor/constants.js b/app/assets/javascripts/content_editor/constants.js index 5e56078df0..a39a243ec6 100644 --- a/app/assets/javascripts/content_editor/constants.js +++ b/app/assets/javascripts/content_editor/constants.js @@ -42,9 +42,10 @@ export const TEXT_STYLE_DROPDOWN_ITEMS = [ }, ]; -export const LOADING_CONTENT_EVENT = 'loadingContent'; +export const LOADING_CONTENT_EVENT = 'loading'; export const LOADING_SUCCESS_EVENT = 'loadingSuccess'; export const LOADING_ERROR_EVENT = 'loadingError'; +export const ALERT_EVENT = 'alert'; export const PARSE_HTML_PRIORITY_LOWEST = 1; export const PARSE_HTML_PRIORITY_DEFAULT = 50; @@ -56,3 +57,4 @@ export const EXTENSION_PRIORITY_LOWER = 75; * https://tiptap.dev/guide/custom-extensions/#priority */ export const EXTENSION_PRIORITY_DEFAULT = 100; +export const EXTENSION_PRIORITY_HIGHEST = 200; diff --git a/app/assets/javascripts/content_editor/extensions/attachment.js b/app/assets/javascripts/content_editor/extensions/attachment.js index 72df1d071d..9634730f63 100644 --- a/app/assets/javascripts/content_editor/extensions/attachment.js +++ b/app/assets/javascripts/content_editor/extensions/attachment.js @@ -9,15 +9,22 @@ export default Extension.create({ return { uploadsPath: null, renderMarkdown: null, + eventHub: null, }; }, addCommands() { return { uploadAttachment: ({ file }) => () => { - const { uploadsPath, renderMarkdown } = this.options; + const { uploadsPath, renderMarkdown, eventHub } = this.options; - return handleFileEvent({ file, uploadsPath, renderMarkdown, editor: this.editor }); + return handleFileEvent({ + file, + uploadsPath, + renderMarkdown, + editor: this.editor, + eventHub, + }); }, }; }, @@ -29,23 +36,25 @@ export default Extension.create({ key: new PluginKey('attachment'), props: { handlePaste: (_, event) => { - const { uploadsPath, renderMarkdown } = this.options; + const { uploadsPath, renderMarkdown, eventHub } = this.options; return handleFileEvent({ editor, file: event.clipboardData.files[0], uploadsPath, renderMarkdown, + eventHub, }); }, handleDrop: (_, event) => { - const { uploadsPath, renderMarkdown } = this.options; + const { uploadsPath, renderMarkdown, eventHub } = this.options; return handleFileEvent({ editor, file: event.dataTransfer.files[0], uploadsPath, renderMarkdown, + eventHub, }); }, }, diff --git a/app/assets/javascripts/content_editor/extensions/code_block_highlight.js b/app/assets/javascripts/content_editor/extensions/code_block_highlight.js index 9dc17fcd57..204ac07d40 100644 --- a/app/assets/javascripts/content_editor/extensions/code_block_highlight.js +++ b/app/assets/javascripts/content_editor/extensions/code_block_highlight.js @@ -1,5 +1,5 @@ import { CodeBlockLowlight } from '@tiptap/extension-code-block-lowlight'; -import * as lowlight from 'lowlight'; +import { lowlight } from 'lowlight/lib/all'; const extractLanguage = (element) => element.getAttribute('lang'); diff --git a/app/assets/javascripts/content_editor/extensions/paste_markdown.js b/app/assets/javascripts/content_editor/extensions/paste_markdown.js new file mode 100644 index 0000000000..c349aa42a6 --- /dev/null +++ b/app/assets/javascripts/content_editor/extensions/paste_markdown.js @@ -0,0 +1,86 @@ +import { Extension } from '@tiptap/core'; +import { Plugin, PluginKey } from 'prosemirror-state'; +import { __ } from '~/locale'; +import { VARIANT_DANGER } from '~/flash'; +import createMarkdownDeserializer from '../services/markdown_deserializer'; +import { + ALERT_EVENT, + LOADING_CONTENT_EVENT, + LOADING_SUCCESS_EVENT, + LOADING_ERROR_EVENT, + EXTENSION_PRIORITY_HIGHEST, +} from '../constants'; + +const TEXT_FORMAT = 'text/plain'; +const HTML_FORMAT = 'text/html'; +const VS_CODE_FORMAT = 'vscode-editor-data'; + +export default Extension.create({ + name: 'pasteMarkdown', + priority: EXTENSION_PRIORITY_HIGHEST, + addOptions() { + return { + renderMarkdown: null, + }; + }, + addCommands() { + return { + pasteMarkdown: (markdown) => () => { + const { editor, options } = this; + const { renderMarkdown, eventHub } = options; + const deserializer = createMarkdownDeserializer({ render: renderMarkdown }); + + eventHub.$emit(LOADING_CONTENT_EVENT); + + deserializer + .deserialize({ schema: editor.schema, content: markdown }) + .then(({ document }) => { + if (!document) { + return; + } + + const { state, view } = editor; + const { tr, selection } = state; + + tr.replaceWith(selection.from - 1, selection.to, document.content); + view.dispatch(tr); + eventHub.$emit(LOADING_SUCCESS_EVENT); + }) + .catch(() => { + eventHub.$emit(ALERT_EVENT, { + message: __('An error occurred while pasting text in the editor. Please try again.'), + variant: VARIANT_DANGER, + }); + eventHub.$emit(LOADING_ERROR_EVENT); + }); + + return true; + }, + }; + }, + addProseMirrorPlugins() { + return [ + new Plugin({ + key: new PluginKey('pasteMarkdown'), + props: { + handlePaste: (_, event) => { + const { clipboardData } = event; + const content = clipboardData.getData(TEXT_FORMAT); + const hasHTML = clipboardData.types.some((type) => type === HTML_FORMAT); + const hasVsCode = clipboardData.types.some((type) => type === VS_CODE_FORMAT); + const vsCodeMeta = hasVsCode ? JSON.parse(clipboardData.getData(VS_CODE_FORMAT)) : {}; + const language = vsCodeMeta.mode; + + if (!content || (hasHTML && !hasVsCode) || (hasVsCode && language !== 'markdown')) { + return false; + } + + this.editor.commands.pasteMarkdown(content); + + return true; + }, + }, + }), + ]; + }, +}); diff --git a/app/assets/javascripts/content_editor/extensions/table.js b/app/assets/javascripts/content_editor/extensions/table.js index 004bb8b815..d7456ab409 100644 --- a/app/assets/javascripts/content_editor/extensions/table.js +++ b/app/assets/javascripts/content_editor/extensions/table.js @@ -1,5 +1,6 @@ import { Table } from '@tiptap/extension-table'; import { debounce } from 'lodash'; +import { VARIANT_WARNING } from '~/flash'; import { __ } from '~/locale'; import { getMarkdownSource } from '../services/markdown_sourcemap'; import { shouldRenderHTMLTable } from '../services/serialization_helpers'; @@ -14,7 +15,7 @@ const onUpdate = debounce((editor) => { message: __( 'The content editor may change the markdown formatting style of the document, which may not match your original markdown style.', ), - variant: 'warning', + variant: VARIANT_WARNING, }); alertShown = true; diff --git a/app/assets/javascripts/content_editor/services/content_editor.js b/app/assets/javascripts/content_editor/services/content_editor.js index a387322bff..c5638da2da 100644 --- a/app/assets/javascripts/content_editor/services/content_editor.js +++ b/app/assets/javascripts/content_editor/services/content_editor.js @@ -1,17 +1,23 @@ -import eventHubFactory from '~/helpers/event_hub_factory'; +import { TextSelection } from 'prosemirror-state'; import { LOADING_CONTENT_EVENT, LOADING_SUCCESS_EVENT, LOADING_ERROR_EVENT } from '../constants'; + /* eslint-disable no-underscore-dangle */ export class ContentEditor { - constructor({ tiptapEditor, serializer }) { + constructor({ tiptapEditor, serializer, deserializer, eventHub }) { this._tiptapEditor = tiptapEditor; this._serializer = serializer; - this._eventHub = eventHubFactory(); + this._deserializer = deserializer; + this._eventHub = eventHub; } get tiptapEditor() { return this._tiptapEditor; } + get eventHub() { + return this._eventHub; + } + get empty() { const doc = this.tiptapEditor?.state.doc; @@ -23,39 +29,31 @@ export class ContentEditor { this.tiptapEditor.destroy(); } - once(type, handler) { - this._eventHub.$once(type, handler); - } - - on(type, handler) { - this._eventHub.$on(type, handler); - } - - emit(type, params = {}) { - this._eventHub.$emit(type, params); - } - - off(type, handler) { - this._eventHub.$off(type, handler); - } - disposeAllEvents() { this._eventHub.dispose(); } async setSerializedContent(serializedContent) { - const { _tiptapEditor: editor, _serializer: serializer } = this; + const { _tiptapEditor: editor, _deserializer: deserializer, _eventHub: eventHub } = this; + const { doc, tr } = editor.state; + const selection = TextSelection.create(doc, 0, doc.content.size); try { - this._eventHub.$emit(LOADING_CONTENT_EVENT); - const document = await serializer.deserialize({ + eventHub.$emit(LOADING_CONTENT_EVENT); + const { document } = await deserializer.deserialize({ schema: editor.schema, content: serializedContent, }); - editor.commands.setContent(document); - this._eventHub.$emit(LOADING_SUCCESS_EVENT); + + if (document) { + tr.setSelection(selection) + .replaceSelectionWith(document, false) + .setMeta('preventUpdate', true); + editor.view.dispatch(tr); + } + eventHub.$emit(LOADING_SUCCESS_EVENT); } catch (e) { - this._eventHub.$emit(LOADING_ERROR_EVENT, e); + eventHub.$emit(LOADING_ERROR_EVENT, e); throw e; } } diff --git a/app/assets/javascripts/content_editor/services/create_content_editor.js b/app/assets/javascripts/content_editor/services/create_content_editor.js index f451357e21..d9d39a387d 100644 --- a/app/assets/javascripts/content_editor/services/create_content_editor.js +++ b/app/assets/javascripts/content_editor/services/create_content_editor.js @@ -1,5 +1,6 @@ import { Editor } from '@tiptap/vue-2'; import { isFunction } from 'lodash'; +import eventHubFactory from '~/helpers/event_hub_factory'; import { PROVIDE_SERIALIZER_OR_RENDERER_ERROR } from '../constants'; import Attachment from '../extensions/attachment'; import Audio from '../extensions/audio'; @@ -38,6 +39,7 @@ import Loading from '../extensions/loading'; import MathInline from '../extensions/math_inline'; import OrderedList from '../extensions/ordered_list'; import Paragraph from '../extensions/paragraph'; +import PasteMarkdown from '../extensions/paste_markdown'; import Reference from '../extensions/reference'; import Strike from '../extensions/strike'; import Subscript from '../extensions/subscript'; @@ -54,6 +56,7 @@ import Video from '../extensions/video'; import WordBreak from '../extensions/word_break'; import { ContentEditor } from './content_editor'; import createMarkdownSerializer from './markdown_serializer'; +import createMarkdownDeserializer from './markdown_deserializer'; import trackInputRulesAndShortcuts from './track_input_rules_and_shortcuts'; const createTiptapEditor = ({ extensions = [], ...options } = {}) => @@ -78,8 +81,10 @@ export const createContentEditor = ({ throw new Error(PROVIDE_SERIALIZER_OR_RENDERER_ERROR); } + const eventHub = eventHubFactory(); + const builtInContentEditorExtensions = [ - Attachment.configure({ uploadsPath, renderMarkdown }), + Attachment.configure({ uploadsPath, renderMarkdown, eventHub }), Audio, Blockquote, Bold, @@ -116,6 +121,7 @@ export const createContentEditor = ({ MathInline, OrderedList, Paragraph, + PasteMarkdown.configure({ renderMarkdown, eventHub }), Reference, Strike, Subscript, @@ -135,7 +141,8 @@ export const createContentEditor = ({ const allExtensions = [...builtInContentEditorExtensions, ...extensions]; const trackedExtensions = allExtensions.map(trackInputRulesAndShortcuts); const tiptapEditor = createTiptapEditor({ extensions: trackedExtensions, ...tiptapOptions }); - const serializer = createMarkdownSerializer({ render: renderMarkdown, serializerConfig }); + const serializer = createMarkdownSerializer({ serializerConfig }); + const deserializer = createMarkdownDeserializer({ render: renderMarkdown }); - return new ContentEditor({ tiptapEditor, serializer }); + return new ContentEditor({ tiptapEditor, serializer, eventHub, deserializer }); }; diff --git a/app/assets/javascripts/content_editor/services/markdown_deserializer.js b/app/assets/javascripts/content_editor/services/markdown_deserializer.js new file mode 100644 index 0000000000..cd4863d8ea --- /dev/null +++ b/app/assets/javascripts/content_editor/services/markdown_deserializer.js @@ -0,0 +1,33 @@ +import { DOMParser as ProseMirrorDOMParser } from 'prosemirror-model'; + +export default ({ render }) => { + /** + * Converts a Markdown string into a ProseMirror JSONDocument based + * on a ProseMirror schema. + * + * @param {Object} options — The schema and content for deserialization + * @param {ProseMirror.Schema} params.schema A ProseMirror schema that defines + * the types of content supported in the document + * @param {String} params.content An arbitrary markdown string + * + * @returns An object with the following properties: + * - document: A ProseMirror document object generated from the deserialized Markdown + * - dom: The Markdown Deserializer renders Markdown as HTML to generate the ProseMirror + * document. The dom property contains the HTML generated from the Markdown Source. + */ + return { + deserialize: async ({ schema, content }) => { + const html = await render(content); + + if (!html) return {}; + + const parser = new DOMParser(); + const { body } = parser.parseFromString(html, 'text/html'); + + // append original source as a comment that nodes can access + body.append(document.createComment(content)); + + return { document: ProseMirrorDOMParser.fromSchema(schema).parse(body), dom: body }; + }, + }; +}; diff --git a/app/assets/javascripts/content_editor/services/markdown_serializer.js b/app/assets/javascripts/content_editor/services/markdown_serializer.js index 925b411e51..eaaf69c306 100644 --- a/app/assets/javascripts/content_editor/services/markdown_serializer.js +++ b/app/assets/javascripts/content_editor/services/markdown_serializer.js @@ -1,4 +1,3 @@ -import { DOMParser as ProseMirrorDOMParser } from 'prosemirror-model'; import { MarkdownSerializer as ProseMirrorMarkdownSerializer, defaultMarkdownSerializer, @@ -237,31 +236,7 @@ const defaultSerializerConfig = { * that parses the Markdown and converts it into HTML. * @returns a markdown serializer */ -export default ({ render = () => null, serializerConfig = {} } = {}) => ({ - /** - * Converts a Markdown string into a ProseMirror JSONDocument based - * on a ProseMirror schema. - * @param {ProseMirror.Schema} params.schema A ProseMirror schema that defines - * the types of content supported in the document - * @param {String} params.content An arbitrary markdown string - * @returns A ProseMirror JSONDocument - */ - deserialize: async ({ schema, content }) => { - const html = await render(content); - - if (!html) return null; - - const parser = new DOMParser(); - const { body } = parser.parseFromString(html, 'text/html'); - - // append original source as a comment that nodes can access - body.append(document.createComment(content)); - - const state = ProseMirrorDOMParser.fromSchema(schema).parse(body); - - return state.toJSON(); - }, - +export default ({ serializerConfig = {} } = {}) => ({ /** * Converts a ProseMirror JSONDocument based * on a ProseMirror schema into Markdown diff --git a/app/assets/javascripts/content_editor/services/markdown_sourcemap.js b/app/assets/javascripts/content_editor/services/markdown_sourcemap.js index a1199589c9..4285e04bba 100644 --- a/app/assets/javascripts/content_editor/services/markdown_sourcemap.js +++ b/app/assets/javascripts/content_editor/services/markdown_sourcemap.js @@ -1,7 +1,9 @@ -const getFullSource = (element) => { +import { isString } from 'lodash'; + +export const getFullSource = (element) => { const commentNode = element.ownerDocument.body.lastChild; - if (commentNode.nodeName === '#comment') { + if (commentNode?.nodeName === '#comment' && isString(commentNode.textContent)) { return commentNode.textContent.split('\n'); } diff --git a/app/assets/javascripts/content_editor/services/serialization_helpers.js b/app/assets/javascripts/content_editor/services/serialization_helpers.js index 4d5a54c034..5fdd294aa9 100644 --- a/app/assets/javascripts/content_editor/services/serialization_helpers.js +++ b/app/assets/javascripts/content_editor/services/serialization_helpers.js @@ -259,11 +259,16 @@ export function renderContent(state, node, forceRenderInline) { } } -export function renderHTMLNode(tagName, forceRenderInline = false) { +export function renderHTMLNode(tagName, forceRenderContentInline = false) { return (state, node) => { renderTagOpen(state, tagName, node.attrs); - renderContent(state, node, forceRenderInline); + renderContent(state, node, forceRenderContentInline); renderTagClose(state, tagName, false); + + if (forceRenderContentInline) { + state.closeBlock(node); + state.flushClose(); + } }; } diff --git a/app/assets/javascripts/content_editor/services/upload_helpers.js b/app/assets/javascripts/content_editor/services/upload_helpers.js index f5bf274274..1abecb8f41 100644 --- a/app/assets/javascripts/content_editor/services/upload_helpers.js +++ b/app/assets/javascripts/content_editor/services/upload_helpers.js @@ -1,3 +1,4 @@ +import { VARIANT_DANGER } from '~/flash'; import axios from '~/lib/utils/axios_utils'; import { __ } from '~/locale'; import { extractFilename, readFileAsDataURL } from './utils'; @@ -49,7 +50,7 @@ export const uploadFile = async ({ uploadsPath, renderMarkdown, file }) => { return extractAttachmentLinkUrl(rendered); }; -const uploadImage = async ({ editor, file, uploadsPath, renderMarkdown }) => { +const uploadImage = async ({ editor, file, uploadsPath, renderMarkdown, eventHub }) => { const encodedSrc = await readFileAsDataURL(file); const { view } = editor; @@ -72,14 +73,14 @@ const uploadImage = async ({ editor, file, uploadsPath, renderMarkdown }) => { ); } catch (e) { editor.commands.deleteRange({ from: position, to: position + 1 }); - editor.emit('alert', { + eventHub.$emit('alert', { message: __('An error occurred while uploading the image. Please try again.'), - variant: 'danger', + variant: VARIANT_DANGER, }); } }; -const uploadAttachment = async ({ editor, file, uploadsPath, renderMarkdown }) => { +const uploadAttachment = async ({ editor, file, uploadsPath, renderMarkdown, eventHub }) => { await Promise.resolve(); const { view } = editor; @@ -103,23 +104,23 @@ const uploadAttachment = async ({ editor, file, uploadsPath, renderMarkdown }) = ); } catch (e) { editor.commands.deleteRange({ from, to: from + 1 }); - editor.emit('alert', { + eventHub.$emit('alert', { message: __('An error occurred while uploading the file. Please try again.'), - variant: 'danger', + variant: VARIANT_DANGER, }); } }; -export const handleFileEvent = ({ editor, file, uploadsPath, renderMarkdown }) => { +export const handleFileEvent = ({ editor, file, uploadsPath, renderMarkdown, eventHub }) => { if (!file) return false; if (acceptedMimes.image.includes(file?.type)) { - uploadImage({ editor, file, uploadsPath, renderMarkdown }); + uploadImage({ editor, file, uploadsPath, renderMarkdown, eventHub }); return true; } - uploadAttachment({ editor, file, uploadsPath, renderMarkdown }); + uploadAttachment({ editor, file, uploadsPath, renderMarkdown, eventHub }); return true; }; diff --git a/app/assets/javascripts/contributors/stores/getters.js b/app/assets/javascripts/contributors/stores/getters.js index 45b569066f..79f5c701fb 100644 --- a/app/assets/javascripts/contributors/stores/getters.js +++ b/app/assets/javascripts/contributors/stores/getters.js @@ -7,10 +7,11 @@ export const parsedData = (state) => { state.chartData.forEach(({ date, author_name, author_email }) => { total[date] = total[date] ? total[date] + 1 : 1; - const authorData = byAuthorEmail[author_email]; + const normalizedEmail = author_email.toLowerCase(); + const authorData = byAuthorEmail[normalizedEmail]; if (!authorData) { - byAuthorEmail[author_email] = { + byAuthorEmail[normalizedEmail] = { name: author_name, commits: 1, dates: { diff --git a/app/assets/javascripts/cycle_analytics/components/limit_warning_component.vue b/app/assets/javascripts/cycle_analytics/components/limit_warning_component.vue deleted file mode 100644 index 4c44aac4e2..0000000000 --- a/app/assets/javascripts/cycle_analytics/components/limit_warning_component.vue +++ /dev/null @@ -1,33 +0,0 @@ - - diff --git a/app/assets/javascripts/cycle_analytics/components/stage_table.vue b/app/assets/javascripts/cycle_analytics/components/stage_table.vue index ea5a1291a1..6a45969fd1 100644 --- a/app/assets/javascripts/cycle_analytics/components/stage_table.vue +++ b/app/assets/javascripts/cycle_analytics/components/stage_table.vue @@ -18,7 +18,7 @@ import { PAGINATION_SORT_DIRECTION_ASC, PAGINATION_SORT_DIRECTION_DESC, } from '../constants'; -import TotalTime from './total_time_component.vue'; +import TotalTime from './total_time.vue'; const DEFAULT_WORKFLOW_TITLE_PROPERTIES = { thClass: 'gl-w-half', diff --git a/app/assets/javascripts/cycle_analytics/components/total_time_component.vue b/app/assets/javascripts/cycle_analytics/components/total_time.vue similarity index 100% rename from app/assets/javascripts/cycle_analytics/components/total_time_component.vue rename to app/assets/javascripts/cycle_analytics/components/total_time.vue diff --git a/app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue b/app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue index 64461797c4..66bccf1949 100644 --- a/app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue +++ b/app/assets/javascripts/cycle_analytics/components/value_stream_filters.vue @@ -1,16 +1,28 @@ diff --git a/app/assets/javascripts/diffs/components/diff_view.vue b/app/assets/javascripts/diffs/components/diff_view.vue index 333bf1b356..f46b0a538f 100644 --- a/app/assets/javascripts/diffs/components/diff_view.vue +++ b/app/assets/javascripts/diffs/components/diff_view.vue @@ -1,4 +1,5 @@ diff --git a/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js b/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js index 65ffd42fa2..734407dec4 100644 --- a/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js +++ b/app/assets/javascripts/diffs/store/getters_versions_dropdowns.js @@ -15,24 +15,19 @@ export const diffCompareDropdownTargetVersions = (state, getters) => { // startVersion only exists if the user has selected a version other // than "base" so if startVersion is null then base must be selected - const defaultMergeRefForDiffs = window.gon?.features?.defaultMergeRefForDiffs || false; const diffHeadParam = getParameterByName('diff_head'); - const diffHead = parseBoolean(diffHeadParam) || (!diffHeadParam && defaultMergeRefForDiffs); - const isBaseSelected = !state.startVersion && !diffHead; + const diffHead = parseBoolean(diffHeadParam) || !diffHeadParam; + const isBaseSelected = !state.startVersion; const isHeadSelected = !state.startVersion && diffHead; let baseVersion = null; - if ( - !defaultMergeRefForDiffs || - (defaultMergeRefForDiffs && !state.mergeRequestDiff.head_version_path) - ) { + if (!state.mergeRequestDiff.head_version_path) { baseVersion = { versionName: state.targetBranchName, version_index: DIFF_COMPARE_BASE_VERSION_INDEX, href: state.mergeRequestDiff.base_version_path, isBase: true, - selected: - isBaseSelected || (defaultMergeRefForDiffs && !state.mergeRequestDiff.head_version_path), + selected: isBaseSelected, }; } diff --git a/app/assets/javascripts/dirty_submit/dirty_submit_form.js b/app/assets/javascripts/dirty_submit/dirty_submit_form.js index db13daf079..83dd4b0a12 100644 --- a/app/assets/javascripts/dirty_submit/dirty_submit_form.js +++ b/app/assets/javascripts/dirty_submit/dirty_submit_form.js @@ -1,11 +1,13 @@ import $ from 'jquery'; import { memoize, throttle } from 'lodash'; +import createEventHub from '~/helpers/event_hub_factory'; class DirtySubmitForm { constructor(form) { this.form = form; this.dirtyInputs = []; this.isDisabled = true; + this.events = createEventHub(); this.init(); } @@ -36,11 +38,21 @@ class DirtySubmitForm { this.form.addEventListener('submit', (event) => this.formSubmit(event)); } + addInputsListener(callback) { + this.events.$on('input', callback); + } + + removeInputsListener(callback) { + this.events.$off('input', callback); + } + updateDirtyInput(event) { const { target } = event; if (!target.dataset.isDirtySubmitInput) return; + this.events.$emit('input', event); + this.updateDirtyInputs(target); this.toggleSubmission(); } diff --git a/app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js b/app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js index 0290bb84b5..b41eae88c5 100644 --- a/app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js +++ b/app/assets/javascripts/editor/extensions/source_editor_ci_schema_ext.js @@ -14,7 +14,7 @@ export class CiSchemaExtension { // to fetch schema files, hence the `gon.gitlab_url` // reference. This prevents error: // "Failed to execute 'fetch' on 'WorkerGlobalScope'" - const absoluteSchemaUrl = gon.gitlab_url + ciSchemaPath; + const absoluteSchemaUrl = new URL(ciSchemaPath, gon.gitlab_url).href; const modelFileName = instance.getModel().uri.path.split('/').pop(); registerSchema({ diff --git a/app/assets/javascripts/editor/schema/ci.json b/app/assets/javascripts/editor/schema/ci.json index 4d9fe6ff85..1c56327c03 100644 --- a/app/assets/javascripts/editor/schema/ci.json +++ b/app/assets/javascripts/editor/schema/ci.json @@ -423,37 +423,34 @@ "description": "Defines secrets to be injected as environment variables", "additionalProperties": { "type": "object", - "additionalProperties": { - "type": "object", - "description": "Environment variable name", - "properties": { - "vault": { - "oneOf": [ - { - "type": "string", - "description": "The secret to be fetched from Vault (e.g. 'production/db/password@ops' translates to secret 'ops/data/production/db', field `password`)" - }, - { - "type": "object", - "properties": { - "engine": { - "type": "object", - "properties": { - "name": { "type": "string" }, - "path": { "type": "string" } - }, - "required": ["name", "path"] + "description": "Environment variable name", + "properties": { + "vault": { + "oneOf": [ + { + "type": "string", + "description": "The secret to be fetched from Vault (e.g. 'production/db/password@ops' translates to secret 'ops/data/production/db', field `password`)" + }, + { + "type": "object", + "properties": { + "engine": { + "type": "object", + "properties": { + "name": { "type": "string" }, + "path": { "type": "string" } }, - "path": { "type": "string" }, - "field": { "type": "string" } + "required": ["name", "path"] }, - "required": ["engine", "path", "field"] - } - ] - } - }, - "required": ["vault"] - } + "path": { "type": "string" }, + "field": { "type": "string" } + }, + "required": ["engine", "path", "field"] + } + ] + } + }, + "required": ["vault"] } }, "before_script": { @@ -1250,7 +1247,7 @@ "oneOf": [ { "type": "object", - "description": "Trigger a multi-project pipeline. Read more: https://docs.gitlab.com/ee/ci/yaml/README.html#simple-trigger-syntax-for-multi-project-pipelines", + "description": "Trigger a multi-project pipeline. Read more: https://docs.gitlab.com/ee/ci/pipelines/multi_project_pipelines.html#specify-a-downstream-pipeline-branch", "additionalProperties": false, "properties": { "project": { @@ -1266,6 +1263,23 @@ "description": "You can mirror the pipeline status from the triggered pipeline to the source bridge job by using strategy: depend", "type": "string", "enum": ["depend"] + }, + "forward": { + "description": "Specify what to forward to the downstream pipeline.", + "type": "object", + "additionalProperties": false, + "properties": { + "yaml_variables": { + "type": "boolean", + "description": "Variables defined in the trigger job are passed to downstream pipelines.", + "default": true + }, + "pipeline_variables": { + "type": "boolean", + "description": "Variables added for manual pipeline runs are passed to downstream pipelines.", + "default": false + } + } } }, "required": ["project"], @@ -1275,7 +1289,7 @@ }, { "type": "object", - "description": "Trigger a child pipeline. Read more: https://docs.gitlab.com/ee/ci/yaml/README.html#trigger-syntax-for-child-pipeline", + "description": "Trigger a child pipeline. Read more: https://docs.gitlab.com/ee/ci/pipelines/parent_child_pipelines.html", "additionalProperties": false, "properties": { "include": { @@ -1365,11 +1379,28 @@ "description": "You can mirror the pipeline status from the triggered pipeline to the source bridge job by using strategy: depend", "type": "string", "enum": ["depend"] + }, + "forward": { + "description": "Specify what to forward to the downstream pipeline.", + "type": "object", + "additionalProperties": false, + "properties": { + "yaml_variables": { + "type": "boolean", + "description": "Variables defined in the trigger job are passed to downstream pipelines.", + "default": true + }, + "pipeline_variables": { + "type": "boolean", + "description": "Variables added for manual pipeline runs are passed to downstream pipelines.", + "default": false + } + } } } }, { - "description": "Path to the project, e.g. `group/project`, or `group/sub-group/project`.", + "description": "Path to the project, e.g. `group/project`, or `group/sub-group/project`. Read more: https://docs.gitlab.com/ee/ci/pipelines/multi_project_pipelines.html#define-multi-project-pipelines-in-your-gitlab-ciyml-file", "type": "string", "pattern": "\\S/\\S" } diff --git a/app/assets/javascripts/emoji/components/picker.vue b/app/assets/javascripts/emoji/components/picker.vue index 686b5ffff9..840297b870 100644 --- a/app/assets/javascripts/emoji/components/picker.vue +++ b/app/assets/javascripts/emoji/components/picker.vue @@ -108,6 +108,7 @@ export default { class="gl-mx-5! gl-mb-2!" autofocus debounce="500" + :aria-label="__('Search for an emoji')" @input="onSearchInput" />
{ + .then(({ data }) => { + const [message] = data?.deleteEvironment?.errors ?? []; if (message) { createFlash({ message }); } diff --git a/app/assets/javascripts/environments/components/deployment.vue b/app/assets/javascripts/environments/components/deployment.vue index f98edb6bb7..19284b26d5 100644 --- a/app/assets/javascripts/environments/components/deployment.vue +++ b/app/assets/javascripts/environments/components/deployment.vue @@ -102,6 +102,9 @@ export default { refPath() { return this.ref?.refPath; }, + needsApproval() { + return this.deployment.pendingApprovalCount > 0; + }, }, methods: { toggleCollapse() { @@ -116,6 +119,7 @@ export default { showDetails: __('Show details'), hideDetails: __('Hide details'), triggerer: s__('Deployment|Triggerer'), + needsApproval: s__('Deployment|Needs Approval'), job: __('Job'), api: __('API'), branch: __('Branch'), @@ -153,6 +157,9 @@ export default {
+ + {{ $options.i18n.needsApproval }} + {{ $options.i18n.latestBadge }}
@@ -199,6 +206,7 @@ export default {
+
import { GlLink, GlModal, GlSprintf } from '@gitlab/ui'; +import { uniqueId } from 'lodash'; import { helpPagePath } from '~/helpers/help_page_helper'; import { s__ } from '~/locale'; import ModalCopyButton from '~/vue_shared/components/modal_copy_button.vue'; @@ -44,6 +45,11 @@ export default { copyToClipboardText: s__('EnableReviewApp|Copy snippet text'), title: s__('ReviewApp|Enable Review App'), }, + data() { + const modalInfoCopyId = uniqueId('enable-review-app-copy-string-'); + + return { modalInfoCopyId }; + }, computed: { modalInfoCopyStr() { return `deploy_review: @@ -99,14 +105,14 @@ export default {

-
+        
  {{ modalInfoCopyStr }} 
diff --git a/app/assets/javascripts/environments/components/environment_actions.vue b/app/assets/javascripts/environments/components/environment_actions.vue index 98c9550716..c7e024aade 100644 --- a/app/assets/javascripts/environments/components/environment_actions.vue +++ b/app/assets/javascripts/environments/components/environment_actions.vue @@ -1,5 +1,6 @@
@@ -319,6 +333,9 @@ export default { class="gl-pl-4" />
+
+ +
diff --git a/app/assets/javascripts/environments/components/new_environments_app.vue b/app/assets/javascripts/environments/components/new_environments_app.vue deleted file mode 100644 index 3699f39b61..0000000000 --- a/app/assets/javascripts/environments/components/new_environments_app.vue +++ /dev/null @@ -1,252 +0,0 @@ - - diff --git a/app/assets/javascripts/environments/constants.js b/app/assets/javascripts/environments/constants.js index 6d427bef4e..942491039d 100644 --- a/app/assets/javascripts/environments/constants.js +++ b/app/assets/javascripts/environments/constants.js @@ -38,3 +38,13 @@ export const CANARY_STATUS = { }; export const CANARY_UPDATE_MODAL = 'confirm-canary-change'; + +export const ENVIRONMENTS_SCOPE = { + AVAILABLE: 'available', + STOPPED: 'stopped', +}; + +export const ENVIRONMENT_COUNT_BY_SCOPE = { + [ENVIRONMENTS_SCOPE.AVAILABLE]: 'availableCount', + [ENVIRONMENTS_SCOPE.STOPPED]: 'stoppedCount', +}; diff --git a/app/assets/javascripts/environments/graphql/client.js b/app/assets/javascripts/environments/graphql/client.js index 64b18c2003..26514b5999 100644 --- a/app/assets/javascripts/environments/graphql/client.js +++ b/app/assets/javascripts/environments/graphql/client.js @@ -2,6 +2,9 @@ import VueApollo from 'vue-apollo'; import createDefaultClient from '~/lib/graphql'; import environmentApp from './queries/environment_app.query.graphql'; import pageInfoQuery from './queries/page_info.query.graphql'; +import environmentToDeleteQuery from './queries/environment_to_delete.query.graphql'; +import environmentToRollbackQuery from './queries/environment_to_rollback.query.graphql'; +import environmentToStopQuery from './queries/environment_to_stop.query.graphql'; import { resolvers } from './resolvers'; import typeDefs from './typedefs.graphql'; @@ -33,6 +36,52 @@ export const apolloProvider = (endpoint) => { }, }, }); + + cache.writeQuery({ + query: environmentToDeleteQuery, + data: { + environmentToDelete: { + name: 'null', + __typename: 'LocalEnvironment', + id: '0', + deletePath: null, + folderPath: null, + retryUrl: null, + autoStopPath: null, + lastDeployment: null, + }, + }, + }); + cache.writeQuery({ + query: environmentToStopQuery, + data: { + environmentToStop: { + name: 'null', + __typename: 'LocalEnvironment', + id: '0', + deletePath: null, + folderPath: null, + retryUrl: null, + autoStopPath: null, + lastDeployment: null, + }, + }, + }); + cache.writeQuery({ + query: environmentToRollbackQuery, + data: { + environmentToRollback: { + name: 'null', + __typename: 'LocalEnvironment', + id: '0', + deletePath: null, + folderPath: null, + retryUrl: null, + autoStopPath: null, + lastDeployment: null, + }, + }, + }); return new VueApollo({ defaultClient, }); diff --git a/app/assets/javascripts/environments/graphql/queries/folder.query.graphql b/app/assets/javascripts/environments/graphql/queries/folder.query.graphql index 3292c916b2..e8c145ee91 100644 --- a/app/assets/javascripts/environments/graphql/queries/folder.query.graphql +++ b/app/assets/javascripts/environments/graphql/queries/folder.query.graphql @@ -1,5 +1,5 @@ -query getEnvironmentFolder($environment: NestedLocalEnvironment) { - folder(environment: $environment) @client { +query getEnvironmentFolder($environment: NestedLocalEnvironment, $scope: String) { + folder(environment: $environment, scope: $scope) @client { availableCount environments stoppedCount diff --git a/app/assets/javascripts/environments/graphql/resolvers.js b/app/assets/javascripts/environments/graphql/resolvers.js index dc763b7715..a7866c1e77 100644 --- a/app/assets/javascripts/environments/graphql/resolvers.js +++ b/app/assets/javascripts/environments/graphql/resolvers.js @@ -11,6 +11,7 @@ import environmentToRollbackQuery from './queries/environment_to_rollback.query. import environmentToStopQuery from './queries/environment_to_stop.query.graphql'; import environmentToDeleteQuery from './queries/environment_to_delete.query.graphql'; import environmentToChangeCanaryQuery from './queries/environment_to_change_canary.query.graphql'; +import isEnvironmentStoppingQuery from './queries/is_environment_stopping.query.graphql'; import pageInfoQuery from './queries/page_info.query.graphql'; const buildErrors = (errors = []) => ({ @@ -58,8 +59,8 @@ export const resolvers = (endpoint) => ({ }; }); }, - folder(_, { environment: { folderPath } }) { - return axios.get(folderPath, { params: { per_page: 3 } }).then((res) => ({ + folder(_, { environment: { folderPath }, scope }) { + return axios.get(folderPath, { params: { scope, per_page: 3 } }).then((res) => ({ availableCount: res.data.available_count, environments: res.data.environments.map(mapEnvironment), stoppedCount: res.data.stopped_count, @@ -71,11 +72,21 @@ export const resolvers = (endpoint) => ({ }, }, Mutation: { - stopEnvironment(_, { environment }) { + stopEnvironment(_, { environment }, { client }) { + client.writeQuery({ + query: isEnvironmentStoppingQuery, + variables: { environment }, + data: { isEnvironmentStopping: true }, + }); return axios .post(environment.stopPath) .then(() => buildErrors()) .catch(() => { + client.writeQuery({ + query: isEnvironmentStoppingQuery, + variables: { environment }, + data: { isEnvironmentStopping: false }, + }); return buildErrors([ s__('Environments|An error occurred while stopping the environment, please try again'), ]); diff --git a/app/assets/javascripts/environments/index.js b/app/assets/javascripts/environments/index.js index 3b1d35c1f2..d9a523fd80 100644 --- a/app/assets/javascripts/environments/index.js +++ b/app/assets/javascripts/environments/index.js @@ -1,48 +1,37 @@ import Vue from 'vue'; import VueApollo from 'vue-apollo'; -import createDefaultClient from '~/lib/graphql'; import { parseBoolean } from '../lib/utils/common_utils'; -import Translate from '../vue_shared/translate'; -import environmentsComponent from './components/environments_app.vue'; +import { apolloProvider } from './graphql/client'; +import EnvironmentsApp from './components/environments_app.vue'; -Vue.use(Translate); Vue.use(VueApollo); -const apolloProvider = new VueApollo({ - defaultClient: createDefaultClient(), -}); - export default (el) => { if (el) { + const { + canCreateEnvironment, + endpoint, + newEnvironmentPath, + helpPagePath, + projectPath, + defaultBranchName, + projectId, + } = el.dataset; + return new Vue({ el, - components: { - environmentsComponent, - }, - apolloProvider, + apolloProvider: apolloProvider(endpoint), provide: { - projectPath: el.dataset.projectPath, - defaultBranchName: el.dataset.defaultBranchName, + projectPath, + defaultBranchName, + endpoint, + newEnvironmentPath, + helpPagePath, + projectId, + canCreateEnvironment: parseBoolean(canCreateEnvironment), }, - data() { - const environmentsData = el.dataset; - - return { - endpoint: environmentsData.environmentsDataEndpoint, - newEnvironmentPath: environmentsData.newEnvironmentPath, - helpPagePath: environmentsData.helpPagePath, - canCreateEnvironment: parseBoolean(environmentsData.canCreateEnvironment), - }; - }, - render(createElement) { - return createElement('environments-component', { - props: { - endpoint: this.endpoint, - newEnvironmentPath: this.newEnvironmentPath, - helpPagePath: this.helpPagePath, - canCreateEnvironment: this.canCreateEnvironment, - }, - }); + render(h) { + return h(EnvironmentsApp); }, }); } diff --git a/app/assets/javascripts/environments/new_index.js b/app/assets/javascripts/environments/new_index.js deleted file mode 100644 index dd5c709c75..0000000000 --- a/app/assets/javascripts/environments/new_index.js +++ /dev/null @@ -1,38 +0,0 @@ -import Vue from 'vue'; -import VueApollo from 'vue-apollo'; -import { parseBoolean } from '../lib/utils/common_utils'; -import { apolloProvider } from './graphql/client'; -import EnvironmentsApp from './components/new_environments_app.vue'; - -Vue.use(VueApollo); - -export default (el) => { - if (el) { - const { - canCreateEnvironment, - endpoint, - newEnvironmentPath, - helpPagePath, - projectPath, - defaultBranchName, - } = el.dataset; - - return new Vue({ - el, - apolloProvider: apolloProvider(endpoint), - provide: { - projectPath, - defaultBranchName, - endpoint, - newEnvironmentPath, - helpPagePath, - canCreateEnvironment: parseBoolean(canCreateEnvironment), - }, - render(h) { - return h(EnvironmentsApp); - }, - }); - } - - return null; -}; diff --git a/app/assets/javascripts/error_tracking/components/constants.js b/app/assets/javascripts/error_tracking/components/constants.js deleted file mode 100644 index 41b952e26d..0000000000 --- a/app/assets/javascripts/error_tracking/components/constants.js +++ /dev/null @@ -1,21 +0,0 @@ -export const severityLevel = { - FATAL: 'fatal', - ERROR: 'error', - WARNING: 'warning', - INFO: 'info', - DEBUG: 'debug', -}; - -export const severityLevelVariant = { - [severityLevel.FATAL]: 'danger', - [severityLevel.ERROR]: 'neutral', - [severityLevel.WARNING]: 'warning', - [severityLevel.INFO]: 'info', - [severityLevel.DEBUG]: 'muted', -}; - -export const errorStatus = { - IGNORED: 'ignored', - RESOLVED: 'resolved', - UNRESOLVED: 'unresolved', -}; diff --git a/app/assets/javascripts/error_tracking/components/error_details.vue b/app/assets/javascripts/error_tracking/components/error_details.vue index e00fec6fdd..0a8abdc90c 100644 --- a/app/assets/javascripts/error_tracking/components/error_details.vue +++ b/app/assets/javascripts/error_tracking/components/error_details.vue @@ -26,7 +26,7 @@ import { trackErrorStatusUpdateOptions, } from '../utils'; -import { severityLevel, severityLevelVariant, errorStatus } from './constants'; +import { severityLevel, severityLevelVariant, errorStatus } from '../constants'; import Stacktrace from './stacktrace.vue'; const SENTRY_TIMEOUT = 10000; diff --git a/app/assets/javascripts/error_tracking/components/error_tracking_list.vue b/app/assets/javascripts/error_tracking/components/error_tracking_list.vue index 5db8c8cf8d..3d540d46b3 100644 --- a/app/assets/javascripts/error_tracking/components/error_tracking_list.vue +++ b/app/assets/javascripts/error_tracking/components/error_tracking_list.vue @@ -1,5 +1,6 @@