Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2022-07-18 12:08:41 +00:00
parent 5ccb67600c
commit 5c5d24f032
77 changed files with 1257 additions and 316 deletions

View File

@ -2,7 +2,6 @@
Cop/UserAdmin:
Exclude:
- app/controllers/admin/impersonations_controller.rb
- app/controllers/concerns/spammable_actions.rb
- app/controllers/sessions_controller.rb
- app/finders/autocomplete/routes_finder.rb
- app/finders/ci/jobs_finder.rb
@ -32,8 +31,6 @@ Cop/UserAdmin:
- app/services/projects/fork_service.rb
- app/services/users/build_service.rb
- ee/app/controllers/ee/projects_controller.rb
- ee/app/graphql/mutations/admin/analytics/devops_adoption/segments/mixins.rb
- ee/app/graphql/resolvers/admin/analytics/devops_adoption/segments_resolver.rb
- ee/app/helpers/ee/dashboard_helper.rb
- ee/app/helpers/ee/import_helper.rb
- ee/app/helpers/ee/subscribable_banner_helper.rb
@ -53,7 +50,6 @@ Cop/UserAdmin:
- lib/api/award_emoji.rb
- lib/api/ci/runners.rb
- lib/api/entities/ci/runner_details.rb
- lib/api/entities/ci/user_safe.rb
- lib/api/groups.rb
- lib/api/helpers.rb
- lib/api/personal_access_tokens.rb
@ -61,7 +57,6 @@ Cop/UserAdmin:
- lib/api/v3/github.rb
- lib/constraints/admin_constrainer.rb
- lib/gitlab/auth.rb
- lib/gitlab/background_migration/user_mentions/models/group.rb
- lib/gitlab/ci/runner_instructions.rb
- lib/gitlab/import_export/members_mapper.rb
- lib/gitlab/performance_bar.rb

View File

@ -6,7 +6,6 @@ Gitlab/FeatureAvailableUsage:
- app/helpers/events_helper.rb
- app/helpers/labels_helper.rb
- app/policies/project_policy.rb
- app/views/shared/boards/_switcher.html.haml
- ee/app/controllers/concerns/description_diff_actions.rb
- ee/app/controllers/concerns/ee/boards_actions.rb
- ee/app/controllers/concerns/security_dashboards_permissions.rb
@ -18,23 +17,18 @@ Gitlab/FeatureAvailableUsage:
- ee/app/controllers/ee/projects/settings/operations_controller.rb
- ee/app/controllers/ee/projects/settings/repository_controller.rb
- ee/app/controllers/projects/audit_events_controller.rb
- ee/app/controllers/projects/cluster_agents_controller.rb
- ee/app/controllers/projects/iterations/inherited_controller.rb
- ee/app/controllers/projects/iterations_controller.rb
- ee/app/controllers/projects/path_locks_controller.rb
- ee/app/controllers/projects/subscriptions_controller.rb
- ee/app/finders/autocomplete/vulnerabilities_autocomplete_finder.rb
- ee/app/finders/clusters/agents_finder.rb
- ee/app/finders/ee/alert_management/http_integrations_finder.rb
- ee/app/graphql/ee/types/group_type.rb
- ee/app/graphql/mutations/dast/profiles/create.rb
- ee/app/graphql/mutations/dast/profiles/run.rb
- ee/app/graphql/mutations/dast/profiles/update.rb
- ee/app/graphql/mutations/instance_security_dashboard/remove_project.rb
- ee/app/graphql/resolvers/clusters/agent_tokens_resolver.rb
- ee/app/helpers/ee/application_helper.rb
- ee/app/helpers/ee/boards_helper.rb
- ee/app/helpers/ee/clusters_helper.rb
- ee/app/helpers/ee/dashboard_helper.rb
- ee/app/helpers/ee/form_helper.rb
- ee/app/helpers/ee/graph_helper.rb
@ -50,7 +44,6 @@ Gitlab/FeatureAvailableUsage:
- ee/app/models/concerns/approvable.rb
- ee/app/models/concerns/ee/project_security_scanners_information.rb
- ee/app/models/concerns/ee/protected_ref_access.rb
- ee/app/models/concerns/has_timelogs_report.rb
- ee/app/models/concerns/insights_feature.rb
- ee/app/models/ee/board.rb
- ee/app/models/ee/ci/build.rb
@ -66,11 +59,9 @@ Gitlab/FeatureAvailableUsage:
- ee/app/models/ee/namespace_setting.rb
- ee/app/models/ee/project.rb
- ee/app/models/ee/project_ci_cd_setting.rb
- ee/app/models/namespace_statistics.rb
- ee/app/models/project_security_setting.rb
- ee/app/policies/compliance_management/framework_policy.rb
- ee/app/policies/ee/group_policy.rb
- ee/app/policies/ee/namespace_policy.rb
- ee/app/policies/ee/project_policy.rb
- ee/app/policies/ee/protected_branch_policy.rb
- ee/app/presenters/ee/label_presenter.rb
@ -81,17 +72,8 @@ Gitlab/FeatureAvailableUsage:
- ee/app/serializers/ee/note_entity.rb
- ee/app/services/boards/epic_boards/update_service.rb
- ee/app/services/ci/audit_variable_change_service.rb
- ee/app/services/clusters/agent_tokens/create_service.rb
- ee/app/services/clusters/agents/create_service.rb
- ee/app/services/dashboard/projects/create_service.rb
- ee/app/services/dashboard/projects/list_service.rb
- ee/app/services/dast/profiles/create_service.rb
- ee/app/services/dast/profiles/update_service.rb
- ee/app/services/dast_on_demand_scans/create_service.rb
- ee/app/services/dast_site_tokens/create_service.rb
- ee/app/services/dast_site_validations/create_service.rb
- ee/app/services/dast_site_validations/revoke_service.rb
- ee/app/services/dast_site_validations/validate_service.rb
- ee/app/services/ee/alert_management/http_integrations/create_service.rb
- ee/app/services/ee/audit_event_service.rb
- ee/app/services/ee/boards/issues/list_service.rb
@ -119,8 +101,6 @@ Gitlab/FeatureAvailableUsage:
- ee/app/services/quality_management/test_cases/create_service.rb
- ee/app/services/requirements_management/process_test_reports_service.rb
- ee/app/services/security/store_scans_service.rb
- ee/app/views/layouts/nav/_test_cases_link.html.haml
- ee/app/views/layouts/nav/sidebar/_project_iterations_link.html.haml
- ee/app/views/projects/_merge_request_approvals_settings.html.haml
- ee/app/views/projects/_merge_request_settings.html.haml
- ee/app/views/projects/_merge_request_settings_description_text.html.haml
@ -140,7 +120,6 @@ Gitlab/FeatureAvailableUsage:
- ee/app/views/projects/settings/ci_cd/_pipeline_subscriptions.html.haml
- ee/app/views/projects/settings/operations/_status_page.html.haml
- ee/app/views/projects/settings/repository/_protected_branches.html.haml
- ee/app/views/projects/sidebar/_repository_locked_files.html.haml
- ee/app/views/shared/issuable/_group_bulk_update_sidebar.html.haml
- ee/app/views/shared/issuable/form/_default_templates.html.haml
- ee/app/views/shared/labels/_create_label_help_text.html.haml
@ -148,14 +127,12 @@ Gitlab/FeatureAvailableUsage:
- ee/app/views/shared/promotions/_promote_repository_features.html.haml
- ee/app/workers/analytics/code_review_metrics_worker.rb
- ee/app/workers/group_saml_group_sync_worker.rb
- ee/lib/api/external_status_checks.rb
- ee/lib/ee/api/entities/approval_state.rb
- ee/lib/ee/api/entities/board.rb
- ee/lib/ee/api/entities/issue.rb
- ee/lib/ee/api/entities/project.rb
- ee/lib/ee/api/helpers.rb
- ee/lib/ee/api/internal/kubernetes.rb
- ee/lib/ee/api/job_artifacts.rb
- ee/lib/ee/api/projects.rb
- ee/lib/ee/gitlab/alert_management/payload/generic.rb
- ee/lib/ee/gitlab/checks/diff_check.rb

View File

@ -793,7 +793,6 @@ Gitlab/NamespacedClass:
- 'app/workers/pages_domain_ssl_renewal_worker.rb'
- 'app/workers/pages_domain_verification_cron_worker.rb'
- 'app/workers/pages_domain_verification_worker.rb'
- 'app/workers/pages_transfer_worker.rb'
- 'app/workers/pages_worker.rb'
- 'app/workers/partition_creation_worker.rb'
- 'app/workers/pipeline_hooks_worker.rb'

View File

@ -476,7 +476,6 @@ Layout/ArgumentAlignment:
- 'ee/spec/services/geo/repository_verification_primary_service_spec.rb'
- 'ee/spec/services/merge_requests/reset_approvals_service_spec.rb'
- 'ee/spec/services/merge_trains/create_pipeline_service_spec.rb'
- 'ee/spec/services/namespaces/check_storage_size_service_spec.rb'
- 'ee/spec/services/projects/mark_for_deletion_service_spec.rb'
- 'ee/spec/services/projects/restore_service_spec.rb'
- 'ee/spec/services/security/merge_reports_service_spec.rb'

View File

@ -356,7 +356,6 @@ Layout/HashAlignment:
- 'ee/app/services/epics/issue_promote_service.rb'
- 'ee/app/services/external_status_checks/create_service.rb'
- 'ee/app/services/groups/memberships/export_service.rb'
- 'ee/app/services/namespaces/check_excess_storage_size_service.rb'
- 'ee/app/services/projects/setup_ci_cd.rb'
- 'ee/app/services/security/security_orchestration_policies/on_demand_scan_pipeline_configuration_service.rb'
- 'ee/config/routes/project.rb'

View File

@ -564,7 +564,6 @@ Layout/LineLength:
- 'app/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service.rb'
- 'app/services/ci/pipelines/add_job_service.rb'
- 'app/services/ci/prometheus_metrics/observe_histograms_service.rb'
- 'app/services/ci/queue/builds_table_strategy.rb'
- 'app/services/ci/queue/pending_builds_strategy.rb'
- 'app/services/ci/runners/register_runner_service.rb'
- 'app/services/ci/runners/unregister_runner_service.rb'
@ -617,7 +616,6 @@ Layout/LineLength:
- 'app/services/import/bitbucket_server_service.rb'
- 'app/services/import/github_service.rb'
- 'app/services/import/validate_remote_git_endpoint_service.rb'
- 'app/services/issuable/clone/attributes_rewriter.rb'
- 'app/services/issuable/import_csv/base_service.rb'
- 'app/services/issuable/process_assignees.rb'
- 'app/services/issuable_base_service.rb'
@ -1545,8 +1543,6 @@ Layout/LineLength:
- 'ee/app/services/merge_requests/create_from_vulnerability_data_service.rb'
- 'ee/app/services/merge_trains/create_pipeline_service.rb'
- 'ee/app/services/merge_trains/refresh_merge_request_service.rb'
- 'ee/app/services/namespaces/check_excess_storage_size_service.rb'
- 'ee/app/services/namespaces/check_storage_size_service.rb'
- 'ee/app/services/personal_access_tokens/rotation_verifier_service.rb'
- 'ee/app/services/projects/licenses/create_policy_service.rb'
- 'ee/app/services/projects/mark_for_deletion_service.rb'
@ -1555,7 +1551,6 @@ Layout/LineLength:
- 'ee/app/services/resource_events/change_weight_service.rb'
- 'ee/app/services/security/auto_fix_service.rb'
- 'ee/app/services/security/dependency_list_service.rb'
- 'ee/app/services/security/ingestion/bulk_updatable_task.rb'
- 'ee/app/services/security/ingestion/finding_map.rb'
- 'ee/app/services/security/ingestion/tasks/ingest_remediations.rb'
- 'ee/app/services/security/ingestion/tasks/ingest_vulnerabilities/create.rb'
@ -2879,7 +2874,6 @@ Layout/LineLength:
- 'ee/spec/services/merge_trains/create_pipeline_service_spec.rb'
- 'ee/spec/services/merge_trains/refresh_merge_request_service_spec.rb'
- 'ee/spec/services/merge_trains/refresh_service_spec.rb'
- 'ee/spec/services/namespaces/check_excess_storage_size_service_spec.rb'
- 'ee/spec/services/personal_access_tokens/create_service_audit_log_spec.rb'
- 'ee/spec/services/personal_access_tokens/rotation_verifier_service_spec.rb'
- 'ee/spec/services/projects/alerting/notify_service_spec.rb'
@ -3033,7 +3027,6 @@ Layout/LineLength:
- 'ee/spec/views/layouts/header/help_dropdown/_cross_stage_fdm.html.haml_spec.rb'
- 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb'
- 'ee/spec/views/operations/environments.html.haml_spec.rb'
- 'ee/spec/views/projects/protected_environments/_protected_environment.html.haml_spec.rb'
- 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
- 'ee/spec/views/registrations/groups_projects/new.html.haml_spec.rb'
- 'ee/spec/views/registrations/welcome/show.html.haml_spec.rb'
@ -3772,7 +3765,6 @@ Layout/LineLength:
- 'qa/qa/specs/features/browser_ui/1_manage/project/create_project_badge_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/personal_project_permissions_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/project/project_access_token_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/user/follow_user_activity_spec.rb'
- 'qa/qa/specs/features/browser_ui/1_manage/user/user_access_termination_spec.rb'
@ -5887,7 +5879,6 @@ Layout/LineLength:
- 'spec/services/incident_management/pager_duty/process_webhook_service_spec.rb'
- 'spec/services/integrations/propagate_service_spec.rb'
- 'spec/services/issuable/bulk_update_service_spec.rb'
- 'spec/services/issuable/clone/attributes_rewriter_spec.rb'
- 'spec/services/issuable/common_system_notes_service_spec.rb'
- 'spec/services/issuable/destroy_service_spec.rb'
- 'spec/services/issue_links/create_service_spec.rb'

View File

@ -71,7 +71,6 @@ Layout/MultilineOperationIndentation:
- 'lib/gitlab/ci/reports/security/finding_key.rb'
- 'lib/gitlab/database/load_balancing/connection_proxy.rb'
- 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
- 'lib/gitlab/elasticsearch/logs/lines.rb'
- 'lib/gitlab/form_builders/gitlab_ui_form_builder.rb'
- 'lib/gitlab/git_access.rb'
- 'lib/gitlab/gl_repository/repo_type.rb'

View File

@ -44,7 +44,6 @@ Layout/SpaceInsideParens:
- 'ee/app/services/compliance_management/frameworks/destroy_service.rb'
- 'ee/app/services/compliance_management/frameworks/update_service.rb'
- 'ee/app/services/elastic/cluster_reindexing_service.rb'
- 'ee/app/services/namespaces/check_storage_size_service.rb'
- 'ee/app/services/sitemap/create_service.rb'
- 'ee/lib/ee/gitlab/auth/ldap/access.rb'
- 'ee/lib/gitlab/auth/smartcard/session.rb'

View File

@ -22,7 +22,6 @@ Naming/RescuedExceptionsVariableName:
- 'app/models/blob_viewer/metrics_dashboard_yml.rb'
- 'app/models/ci/build.rb'
- 'app/models/ci/deleted_object.rb'
- 'app/models/clusters/concerns/elasticsearch_client.rb'
- 'app/models/concerns/prometheus_adapter.rb'
- 'app/models/concerns/repository_storage_movable.rb'
- 'app/models/concerns/x509_serial_number_attribute.rb'

View File

@ -14,7 +14,6 @@ Rails/Pluck:
- 'app/models/list.rb'
- 'app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb'
- 'app/services/feature_flags/update_service.rb'
- 'app/services/pod_logs/base_service.rb'
- 'ee/app/graphql/mutations/incident_management/oncall_rotation/base.rb'
- 'ee/app/models/boards/epic_list.rb'
- 'ee/app/services/concerns/incident_management/oncall_rotations/shared_rotation_logic.rb'

View File

@ -108,7 +108,6 @@ Rails/SquishedSQLHeredocs:
- 'ee/app/models/iterations/cadence.rb'
- 'ee/app/models/vulnerabilities/statistic.rb'
- 'ee/app/services/analytics/cycle_analytics/consistency_check_service.rb'
- 'ee/app/services/security/ingestion/bulk_updatable_task.rb'
- 'ee/app/services/security/ingestion/tasks/ingest_vulnerability_statistics.rb'
- 'ee/app/services/vulnerabilities/historical_statistics/adjustment_service.rb'
- 'ee/app/services/vulnerabilities/statistics/adjustment_service.rb'

View File

@ -121,7 +121,6 @@ Rails/TimeZone:
- spec/lib/gitlab/prometheus/queries/deployment_query_spec.rb
- spec/lib/gitlab/prometheus/queries/validate_query_spec.rb
- spec/lib/gitlab/sidekiq_logging/json_formatter_spec.rb
- spec/lib/gitlab/updated_notes_paginator_spec.rb
- spec/lib/gitlab/utils/json_size_estimator_spec.rb
- spec/lib/gitlab/x509/signature_spec.rb
- spec/lib/grafana/time_window_spec.rb

View File

@ -47,7 +47,6 @@ RSpec/AnyInstanceOf:
- ee/spec/lib/gitlab/ci/templates/Jobs/load_performance_testing_gitlab_ci_yaml_spec.rb
- ee/spec/lib/gitlab/ci/templates/Verify/browser_performance_testing_gitlab_ci_yaml_spec.rb
- ee/spec/lib/gitlab/ci/templates/Verify/load_performance_testing_gitlab_ci_yaml_spec.rb
- ee/spec/lib/gitlab/ci/templates/api_fuzzing_gitlab_ci_yaml_spec.rb
- ee/spec/lib/gitlab/ci/templates/container_scanning_gitlab_ci_yaml_spec.rb
- ee/spec/lib/gitlab/ci/templates/coverage_fuzzing_gitlab_ci_yaml_spec.rb
- ee/spec/lib/gitlab/ci/templates/dast_gitlab_ci_yaml_spec.rb
@ -59,14 +58,7 @@ RSpec/AnyInstanceOf:
- ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb
- ee/spec/lib/gitlab/legacy_github_import/project_creator_spec.rb
- ee/spec/lib/omni_auth/strategies/group_saml_spec.rb
- ee/spec/lib/security/ci_configuration/sast_build_actions_spec.rb
- ee/spec/lib/system_check/geo/geo_database_configured_check_spec.rb
- ee/spec/migrations/schedule_populate_resolved_on_default_branch_column_spec.rb
- ee/spec/migrations/update_location_fingerprint_column_for_cs_spec.rb
- ee/spec/migrations/update_occurrence_severity_column_spec.rb
- ee/spec/migrations/update_undefined_confidence_from_occurrences_spec.rb
- ee/spec/migrations/update_undefined_confidence_from_vulnerabilities_spec.rb
- ee/spec/migrations/update_vulnerability_severity_column_spec.rb
- ee/spec/models/ee/namespace_spec.rb
- ee/spec/models/geo_node_status_spec.rb
- ee/spec/models/issue_spec.rb
@ -74,23 +66,18 @@ RSpec/AnyInstanceOf:
- ee/spec/models/project_import_state_spec.rb
- ee/spec/models/push_rule_spec.rb
- ee/spec/presenters/ci/pipeline_presenter_spec.rb
- ee/spec/presenters/projects/security/configuration_presenter_spec.rb
- ee/spec/requests/api/geo_nodes_spec.rb
- ee/spec/requests/api/graphql/mutations/dast_on_demand_scans/create_spec.rb
- ee/spec/requests/api/graphql/mutations/dast_site_profiles/delete_spec.rb
- ee/spec/requests/api/graphql/mutations/pipelines/run_dast_scan_spec.rb
- ee/spec/requests/api/issues_spec.rb
- ee/spec/requests/api/projects_spec.rb
- ee/spec/requests/git_http_spec.rb
- ee/spec/requests/groups_controller_spec.rb
- ee/spec/requests/omniauth_kerberos_spnego_spec.rb
- ee/spec/requests/repositories/git_http_controller_spec.rb
- ee/spec/services/ci/expire_pipeline_cache_service_spec.rb
- ee/spec/services/ci/run_dast_scan_service_spec.rb
- ee/spec/services/ee/git/branch_push_service_spec.rb
- ee/spec/services/ee/merge_requests/create_from_vulnerability_data_service_spec.rb
- ee/spec/services/ee/merge_requests/refresh_service_spec.rb
- ee/spec/services/ee/security/ingress_modsecurity_usage_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/container_repository_sync_service_spec.rb
@ -118,7 +105,6 @@ RSpec/AnyInstanceOf:
- ee/spec/support/shared_examples/models/member_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/workers/build_finished_worker_spec.rb
- ee/spec/workers/concerns/elastic/indexing_control_spec.rb
- ee/spec/workers/elastic_commit_indexer_worker_spec.rb
- ee/spec/workers/geo/design_repository_shard_sync_worker_spec.rb
@ -155,7 +141,6 @@ RSpec/AnyInstanceOf:
- spec/controllers/projects/settings/integration_hook_logs_controller_spec.rb
- spec/controllers/projects/settings/integrations_controller_spec.rb
- spec/controllers/projects/tags_controller_spec.rb
- spec/controllers/registrations/experience_levels_controller_spec.rb
- spec/controllers/registrations_controller_spec.rb
- spec/controllers/sessions_controller_spec.rb
- spec/controllers/snippets/notes_controller_spec.rb
@ -176,7 +161,6 @@ RSpec/AnyInstanceOf:
- spec/features/projects/files/user_browses_lfs_files_spec.rb
- spec/features/projects/jobs_spec.rb
- spec/features/projects/navbar_spec.rb
- spec/features/projects/pages_spec.rb
- spec/features/projects/settings/service_desk_setting_spec.rb
- spec/features/projects/show/user_sees_setup_shortcut_buttons_spec.rb
- spec/features/snippets/embedded_snippet_spec.rb
@ -190,7 +174,6 @@ RSpec/AnyInstanceOf:
- spec/graphql/mutations/alert_management/prometheus_integration/create_spec.rb
- spec/graphql/mutations/alert_management/prometheus_integration/reset_token_spec.rb
- spec/graphql/mutations/alert_management/prometheus_integration/update_spec.rb
- spec/helpers/analytics/unique_visits_helper_spec.rb
- spec/helpers/projects_helper_spec.rb
- spec/initializers/lograge_spec.rb
- spec/lib/api/entities/merge_request_basic_spec.rb
@ -211,8 +194,6 @@ RSpec/AnyInstanceOf:
- spec/lib/gitlab/auth/blocked_user_tracker_spec.rb
- spec/lib/gitlab/auth/request_authenticator_spec.rb
- spec/lib/gitlab/auth_spec.rb
- spec/lib/gitlab/background_migration/populate_personal_snippet_statistics_spec.rb
- spec/lib/gitlab/background_migration/populate_project_snippet_statistics_spec.rb
- spec/lib/gitlab/checks/diff_check_spec.rb
- spec/lib/gitlab/checks/lfs_check_spec.rb
- spec/lib/gitlab/checks/lfs_integrity_spec.rb
@ -231,8 +212,6 @@ RSpec/AnyInstanceOf:
- spec/lib/gitlab/ci/templates/npm_spec.rb
- spec/lib/gitlab/ci/trace_spec.rb
- spec/lib/gitlab/current_settings_spec.rb
- spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb
- spec/lib/gitlab/database/multi_threaded_migration_spec.rb
- spec/lib/gitlab/diff/highlight_cache_spec.rb
- spec/lib/gitlab/diff/highlight_spec.rb
- spec/lib/gitlab/diff/position_spec.rb
@ -272,10 +251,8 @@ RSpec/AnyInstanceOf:
- spec/lib/gitlab/metrics/rack_middleware_spec.rb
- spec/lib/gitlab/metrics/subscribers/active_record_spec.rb
- spec/lib/gitlab/metrics_spec.rb
- spec/lib/gitlab/patch/action_dispatch_journey_formatter_spec.rb
- spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb
- spec/lib/gitlab/sidekiq_middleware_spec.rb
- spec/lib/gitlab/tracking/destinations/product_analytics_spec.rb
- spec/lib/gitlab/tracking/destinations/snowplow_spec.rb
- spec/lib/gitlab/tracking_spec.rb
- spec/lib/gitlab/usage_data_spec.rb
@ -335,20 +312,17 @@ RSpec/AnyInstanceOf:
- spec/requests/git_http_spec.rb
- spec/requests/import/gitlab_projects_controller_spec.rb
- spec/routing/routing_spec.rb
- spec/serializers/analytics_stage_serializer_spec.rb
- spec/serializers/merge_request_poll_cached_widget_entity_spec.rb
- spec/serializers/merge_request_poll_widget_entity_spec.rb
- spec/services/application_settings/update_service_spec.rb
- spec/services/auto_merge/merge_when_pipeline_succeeds_service_spec.rb
- spec/services/boards/lists/update_service_spec.rb
- spec/services/ci/create_pipeline_service_spec.rb
- spec/services/ci/destroy_expired_job_artifacts_service_spec.rb
- spec/services/ci/expire_pipeline_cache_service_spec.rb
- spec/services/ci/list_config_variables_service_spec.rb
- spec/services/ci/register_job_service_spec.rb
- spec/services/ci/resource_groups/assign_resource_from_resource_group_service_spec.rb
- spec/services/ci/retry_pipeline_service_spec.rb
- spec/services/ci/stop_environments_service_spec.rb
- spec/services/clusters/applications/create_service_spec.rb
- spec/services/clusters/cleanup/project_namespace_service_spec.rb
- spec/services/clusters/cleanup/service_account_service_spec.rb
@ -379,7 +353,6 @@ RSpec/AnyInstanceOf:
- spec/services/packages/conan/create_package_file_service_spec.rb
- spec/services/packages/nuget/metadata_extraction_service_spec.rb
- spec/services/packages/nuget/update_package_from_metadata_service_spec.rb
- spec/services/pages/delete_services_spec.rb
- spec/services/post_receive_service_spec.rb
- spec/services/projects/after_rename_service_spec.rb
- spec/services/projects/container_repository/cleanup_tags_service_spec.rb
@ -448,7 +421,6 @@ RSpec/AnyInstanceOf:
- spec/support/shared_examples/uploaders/object_storage_shared_examples.rb
- spec/support/shared_examples/workers/authorized_projects_worker_shared_example.rb
- spec/support/shared_examples/workers/reactive_cacheable_shared_examples.rb
- spec/support/snowplow.rb
- spec/tasks/gitlab/cleanup_rake_spec.rb
- spec/tasks/gitlab/container_registry_rake_spec.rb
- spec/tasks/gitlab/db_rake_spec.rb
@ -462,9 +434,7 @@ RSpec/AnyInstanceOf:
- spec/views/layouts/_head.html.haml_spec.rb
- spec/views/projects/artifacts/_artifact.html.haml_spec.rb
- spec/workers/archive_trace_worker_spec.rb
- spec/workers/build_coverage_worker_spec.rb
- spec/workers/build_hooks_worker_spec.rb
- spec/workers/build_trace_sections_worker_spec.rb
- spec/workers/ci/build_schedule_worker_spec.rb
- spec/workers/ci/daily_build_group_report_results_worker_spec.rb
- spec/workers/cluster_configure_istio_worker_spec.rb
@ -484,7 +454,6 @@ RSpec/AnyInstanceOf:
- spec/workers/new_note_worker_spec.rb
- spec/workers/object_pool/create_worker_spec.rb
- spec/workers/packages/nuget/extraction_worker_spec.rb
- spec/workers/pages_remove_worker_spec.rb
- spec/workers/pipeline_hooks_worker_spec.rb
- spec/workers/pipeline_process_worker_spec.rb
- spec/workers/pipeline_schedule_worker_spec.rb

View File

@ -871,7 +871,6 @@ RSpec/ContextWording:
- 'ee/spec/services/ee/integrations/test/project_service_spec.rb'
- 'ee/spec/services/ee/ip_restrictions/update_service_spec.rb'
- 'ee/spec/services/ee/issuable/bulk_update_service_spec.rb'
- 'ee/spec/services/ee/issuable/clone/attributes_rewriter_spec.rb'
- 'ee/spec/services/ee/issuable/common_system_notes_service_spec.rb'
- 'ee/spec/services/ee/issues/clone_service_spec.rb'
- 'ee/spec/services/ee/issues/close_service_spec.rb'
@ -978,7 +977,6 @@ RSpec/ContextWording:
- 'ee/spec/services/merge_requests/merge_service_spec.rb'
- 'ee/spec/services/merge_requests/update_blocks_service_spec.rb'
- 'ee/spec/services/milestones/update_service_spec.rb'
- 'ee/spec/services/namespaces/check_storage_size_service_spec.rb'
- 'ee/spec/services/namespaces/in_product_marketing_emails_service_spec.rb'
- 'ee/spec/services/namespaces/storage/email_notification_service_spec.rb'
- 'ee/spec/services/personal_access_tokens/revoke_invalid_tokens_spec.rb'
@ -3306,7 +3304,6 @@ RSpec/ContextWording:
- 'spec/services/incident_management/issuable_escalation_statuses/create_service_spec.rb'
- 'spec/services/integrations/propagate_service_spec.rb'
- 'spec/services/integrations/test/project_service_spec.rb'
- 'spec/services/issuable/clone/attributes_rewriter_spec.rb'
- 'spec/services/issuable/common_system_notes_service_spec.rb'
- 'spec/services/issue_links/list_service_spec.rb'
- 'spec/services/issues/build_service_spec.rb'
@ -3657,7 +3654,6 @@ RSpec/ContextWording:
- 'spec/support/shared_examples/models/cluster_application_helm_cert_shared_examples.rb'
- 'spec/support/shared_examples/models/cluster_application_status_shared_examples.rb'
- 'spec/support/shared_examples/models/cluster_application_version_shared_examples.rb'
- 'spec/support/shared_examples/models/clusters/elastic_stack_client_shared.rb'
- 'spec/support/shared_examples/models/clusters/prometheus_client_shared.rb'
- 'spec/support/shared_examples/models/concerns/can_move_repository_storage_shared_examples.rb'
- 'spec/support/shared_examples/models/concerns/composite_id_shared_examples.rb'

View File

@ -151,7 +151,6 @@ RSpec/ExpectChange:
- 'ee/spec/services/ee/groups/deploy_tokens/create_service_spec.rb'
- 'ee/spec/services/ee/groups/deploy_tokens/destroy_service_spec.rb'
- 'ee/spec/services/ee/groups/deploy_tokens/revoke_service_spec.rb'
- 'ee/spec/services/ee/issuable/clone/attributes_rewriter_spec.rb'
- 'ee/spec/services/ee/issuable/common_system_notes_service_spec.rb'
- 'ee/spec/services/ee/issues/create_service_spec.rb'
- 'ee/spec/services/ee/issues/update_service_spec.rb'

View File

@ -88,7 +88,6 @@ RSpec/ExpectInHook:
- 'ee/spec/services/groups/update_repository_storage_service_spec.rb'
- 'ee/spec/services/members/activate_service_spec.rb'
- 'ee/spec/services/merge_requests/approval_service_spec.rb'
- 'ee/spec/services/namespaces/check_storage_size_service_spec.rb'
- 'ee/spec/services/projects/create_from_template_service_spec.rb'
- 'ee/spec/services/projects/mark_for_deletion_service_spec.rb'
- 'ee/spec/services/projects/update_mirror_service_spec.rb'

View File

@ -1,11 +1,9 @@
---
RSpec/MultipleMemoizedHelpers:
Exclude:
- spec/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback_spec.rb
- spec/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid_spec.rb
- spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb
- spec/requests/api/ci/runner/jobs_artifacts_spec.rb
- ee/spec/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids_spec.rb
- ee/spec/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings_spec.rb
- ee/spec/services/ee/boards/issues/move_service_spec.rb
- ee/spec/services/security/store_report_service_spec.rb

View File

@ -85,14 +85,12 @@ RSpec/VerifiedDoubles:
- ee/spec/lib/gitlab/graphql/aggregations/issues/lazy_links_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/subscription_portal/clients/rest_spec.rb
- ee/spec/lib/sidebars/groups/menus/analytics_menu_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
@ -247,7 +245,6 @@ RSpec/VerifiedDoubles:
- 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
@ -377,7 +374,6 @@ RSpec/VerifiedDoubles:
- 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
@ -400,7 +396,6 @@ RSpec/VerifiedDoubles:
- 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
@ -646,7 +641,6 @@ RSpec/VerifiedDoubles:
- 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
@ -707,7 +701,6 @@ RSpec/VerifiedDoubles:
- 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
@ -835,7 +828,6 @@ RSpec/VerifiedDoubles:
- 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
@ -988,7 +980,6 @@ RSpec/VerifiedDoubles:
- 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
@ -1007,7 +998,6 @@ RSpec/VerifiedDoubles:
- 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
@ -1030,7 +1020,6 @@ RSpec/VerifiedDoubles:
- 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/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

View File

@ -16,7 +16,6 @@ Style/ExplicitBlockArgument:
- 'app/models/merge_request.rb'
- 'app/models/snippet_repository.rb'
- 'app/services/import_export_clean_up_service.rb'
- 'app/services/issuable/clone/attributes_rewriter.rb'
- 'app/services/packages/debian/generate_distribution_key_service.rb'
- 'app/workers/concerns/each_shard_worker.rb'
- 'db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb'

View File

@ -165,8 +165,6 @@ Style/FormatString:
- 'app/services/metrics/dashboard/update_dashboard_service.rb'
- 'app/services/milestones/promote_service.rb'
- 'app/services/personal_access_tokens/revoke_service.rb'
- 'app/services/pod_logs/elasticsearch_service.rb'
- 'app/services/pod_logs/kubernetes_service.rb'
- 'app/services/projects/cleanup_service.rb'
- 'app/services/projects/create_from_template_service.rb'
- 'app/services/projects/import_service.rb'
@ -232,8 +230,6 @@ Style/FormatString:
- 'ee/app/services/incident_management/escalation_policies/base_service.rb'
- 'ee/app/services/issues/build_from_vulnerability_service.rb'
- 'ee/app/services/merge_requests/create_from_vulnerability_data_service.rb'
- 'ee/app/services/namespaces/check_excess_storage_size_service.rb'
- 'ee/app/services/namespaces/check_storage_size_service.rb'
- 'ee/app/services/security/security_orchestration_policies/policy_configuration_validation_service.rb'
- 'ee/app/services/security/security_orchestration_policies/validate_policy_service.rb'
- 'ee/app/services/timebox_report_service.rb'

View File

@ -307,7 +307,6 @@ Style/IfUnlessModifier:
- 'app/services/import/github_service.rb'
- 'app/services/import/gitlab_projects/file_acquisition_strategies/remote_file.rb'
- 'app/services/issuable/bulk_update_service.rb'
- 'app/services/issuable/clone/attributes_rewriter.rb'
- 'app/services/issuable/common_system_notes_service.rb'
- 'app/services/issuable_base_service.rb'
- 'app/services/issuable_links/create_service.rb'
@ -356,7 +355,6 @@ Style/IfUnlessModifier:
- 'app/services/packages/pypi/create_package_service.rb'
- 'app/services/packages/rubygems/dependency_resolver_service.rb'
- 'app/services/pages/migrate_legacy_storage_to_deployment_service.rb'
- 'app/services/pod_logs/kubernetes_service.rb'
- 'app/services/post_receive_service.rb'
- 'app/services/projects/container_repository/gitlab/delete_tags_service.rb'
- 'app/services/projects/container_repository/third_party/delete_tags_service.rb'
@ -936,7 +934,6 @@ Style/IfUnlessModifier:
- 'lib/gitlab/database/with_lock_retries.rb'
- 'lib/gitlab/diff/formatters/base_formatter.rb'
- 'lib/gitlab/diff/rendered/notebook/diff_file.rb'
- 'lib/gitlab/elasticsearch/logs/lines.rb'
- 'lib/gitlab/email/handler/service_desk_handler.rb'
- 'lib/gitlab/email/message/in_product_marketing/base.rb'
- 'lib/gitlab/email/message/repository_push.rb'

View File

@ -20,7 +20,6 @@ Style/PercentLiteralDelimiters:
- 'app/controllers/jira_connect/app_descriptor_controller.rb'
- 'app/controllers/jira_connect/subscriptions_controller.rb'
- 'app/controllers/profiles/two_factor_auths_controller.rb'
- 'app/controllers/projects/logs_controller.rb'
- 'app/controllers/projects/performance_monitoring/dashboards_controller.rb'
- 'app/controllers/projects/product_analytics_controller.rb'
- 'app/controllers/projects/service_desk_controller.rb'

View File

@ -342,7 +342,7 @@ gem 'method_source', '~> 1.0', require: false
gem 'webrick', '~> 1.6.1', require: false
gem 'prometheus-client-mmap', '~> 0.16', require: 'prometheus/client'
gem 'warning', '~> 1.2.0'
gem 'warning', '~> 1.3.0'
group :development do
gem 'lefthook', '~> 1.0.0', require: false

View File

@ -1431,7 +1431,7 @@ GEM
vmstat (2.3.0)
warden (1.2.8)
rack (>= 2.0.6)
warning (1.2.0)
warning (1.3.0)
webauthn (2.3.0)
android_key_attestation (~> 0.3.0)
awrence (~> 1.1)
@ -1756,7 +1756,7 @@ DEPENDENCIES
version_sorter (~> 2.2.4)
view_component (~> 2.50.0)
vmstat (~> 2.3.0)
warning (~> 1.2.0)
warning (~> 1.3.0)
webauthn (~> 2.3)
webmock (~> 3.9.1)
webrick (~> 1.6.1)

View File

@ -454,11 +454,14 @@ const wrapInlineElements = (nodes, wrappableTags) =>
nodes.reduce((children, child) => {
const previous = children[children.length - 1];
if (child.type !== 'text' && !wrappableTags.includes(child.tagName)) {
if (
child.type === 'comment' ||
(child.type !== 'text' && !wrappableTags.includes(child.tagName))
) {
return [...children, child];
}
const wrapperExists = previous?.properties.wrapper;
const wrapperExists = previous?.properties?.wrapper;
if (wrapperExists) {
const wrapper = previous;

View File

@ -5,7 +5,7 @@ import { createProseMirrorDocFromMdastTree } from './hast_to_prosemirror_convert
const wrappableTags = ['img', 'br', 'code', 'i', 'em', 'b', 'strong', 'a', 'strike', 's', 'del'];
const isTaskItem = (hastNode) => {
const { className } = hastNode.properties;
const className = hastNode.properties?.className;
return (
hastNode.tagName === 'li' && Array.isArray(className) && className.includes('task-list-item')
@ -23,16 +23,16 @@ const factorySpecs = {
listItem: {
type: 'block',
wrapInParagraph: true,
selector: (hastNode) => hastNode.tagName === 'li' && !hastNode.properties.className,
selector: (hastNode) => hastNode.tagName === 'li' && !hastNode.properties?.className,
processText: (text) => text.trimRight(),
},
orderedList: {
type: 'block',
selector: (hastNode) => hastNode.tagName === 'ol' && !hastNode.properties.className,
selector: (hastNode) => hastNode.tagName === 'ol' && !hastNode.properties?.className,
},
bulletList: {
type: 'block',
selector: (hastNode) => hastNode.tagName === 'ul' && !hastNode.properties.className,
selector: (hastNode) => hastNode.tagName === 'ul' && !hastNode.properties?.className,
},
heading: {
type: 'block',
@ -62,7 +62,7 @@ const factorySpecs = {
taskList: {
type: 'block',
selector: (hastNode) => {
const { className } = hastNode.properties;
const className = hastNode.properties?.className;
return (
['ul', 'ol'].includes(hastNode.tagName) &&
@ -165,6 +165,14 @@ const factorySpecs = {
type: 'mark',
selector: (hastNode) => ['strike', 's', 'del'].includes(hastNode.tagName),
},
/* TODO
* Implement proper editing support for HTML comments in the Content Editor
* https://gitlab.com/gitlab-org/gitlab/-/issues/342173
*/
comment: {
type: 'ignore',
selector: (hastNode) => hastNode.type === 'comment',
},
};
export default () => {

View File

@ -172,9 +172,6 @@ export default {
trackingLabel() {
return slugifyWithUnderscore(`${this.commentButtonTitle} button`);
},
internalNotesEnabled() {
return Boolean(this.glFeatures.confidentialNotes);
},
disableSubmitButton() {
return this.note.length === 0 || this.isSubmitting;
},
@ -414,7 +411,7 @@ export default {
</template>
<template v-else>
<gl-form-checkbox
v-if="internalNotesEnabled && canSetInternalNote"
v-if="canSetInternalNote"
v-model="noteIsInternal"
class="gl-mb-2"
data-testid="internal-note-checkbox"

View File

@ -2,6 +2,12 @@
import { s__ } from '~/locale';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
import DetailsRow from '~/vue_shared/components/registry/details_row.vue';
import Tracking from '~/tracking';
import { packageTypeToTrackCategory } from '~/packages_and_registries/package_registry/utils';
import {
TRACKING_ACTION_COPY_PACKAGE_ASSET_SHA,
TRACKING_LABEL_PACKAGE_ASSET,
} from '~/packages_and_registries/package_registry/constants';
export default {
name: 'FileSha',
@ -9,6 +15,7 @@ export default {
DetailsRow,
ClipboardButton,
},
mixins: [Tracking.mixin()],
props: {
sha: {
type: String,
@ -22,6 +29,18 @@ export default {
i18n: {
copyButtonTitle: s__('PackageRegistry|Copy SHA'),
},
computed: {
tracking() {
return {
category: packageTypeToTrackCategory(this.packageType),
};
},
},
methods: {
copySha() {
this.track(TRACKING_ACTION_COPY_PACKAGE_ASSET_SHA, { label: TRACKING_LABEL_PACKAGE_ASSET });
},
},
};
</script>
@ -35,6 +54,7 @@ export default {
:title="$options.i18n.copyButtonTitle"
category="tertiary"
size="small"
@click="copySha"
/>
</div>
</details-row>

View File

@ -5,8 +5,13 @@ import { numberToHumanSize } from '~/lib/utils/number_utils';
import { __ } from '~/locale';
import FileSha from '~/packages_and_registries/package_registry/components/details/file_sha.vue';
import Tracking from '~/tracking';
import { packageTypeToTrackCategory } from '~/packages_and_registries/package_registry/utils';
import FileIcon from '~/vue_shared/components/file_icon.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import {
TRACKING_LABEL_PACKAGE_ASSET,
TRACKING_ACTION_EXPAND_PACKAGE_ASSET,
} from '~/packages_and_registries/package_registry/constants';
export default {
name: 'PackageFiles',
@ -76,6 +81,11 @@ export default {
},
].filter((c) => !c.hide);
},
tracking() {
return {
category: packageTypeToTrackCategory(this.packageType),
};
},
},
methods: {
formatSize(size) {
@ -84,6 +94,11 @@ export default {
hasDetails(item) {
return item.fileSha256 || item.fileMd5 || item.fileSha1;
},
trackToggleDetails(detailsShowing) {
if (!detailsShowing) {
this.track(TRACKING_ACTION_EXPAND_PACKAGE_ASSET, { label: TRACKING_LABEL_PACKAGE_ASSET });
}
},
},
i18n: {
deleteFile: __('Delete file'),
@ -106,7 +121,10 @@ export default {
:aria-label="detailsShowing ? __('Collapse') : __('Expand')"
category="tertiary"
size="small"
@click="toggleDetails"
@click="
toggleDetails();
trackToggleDetails(detailsShowing);
"
/>
<gl-link
:href="item.downloadPath"
@ -129,8 +147,8 @@ export default {
:href="item.pipeline.commitPath"
class="gl-text-gray-500"
data-testid="commit-link"
>{{ item.pipeline.sha }}</gl-link
>
>{{ item.pipeline.sha }}
</gl-link>
</template>
<template #cell(created)="{ item }">

View File

@ -9,6 +9,7 @@ export {
DELETE_PACKAGE_FILE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_FILE_TRACKING_ACTION,
DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION,
} from '~/packages_and_registries/shared/constants';
export const PACKAGE_TYPE_CONAN = 'CONAN';
@ -62,6 +63,12 @@ export const TRACKING_ACTION_COPY_COMPOSER_REGISTRY_INCLUDE_COMMAND =
export const TRACKING_ACTION_COPY_COMPOSER_PACKAGE_INCLUDE_COMMAND =
'copy_composer_package_include_command';
export const TRACKING_LABEL_PACKAGE_ASSET = 'package_assets';
export const TRACKING_ACTION_DOWNLOAD_PACKAGE_ASSET = 'download_package_asset';
export const TRACKING_ACTION_EXPAND_PACKAGE_ASSET = 'expand_package_asset';
export const TRACKING_ACTION_COPY_PACKAGE_ASSET_SHA = 'copy_package_asset_sha';
export const SHOW_DELETE_SUCCESS_ALERT = 'showSuccessDeleteAlert';
export const DELETE_PACKAGE_FILE_ERROR_MESSAGE = s__(
'PackageRegistry|Something went wrong while deleting the package file.',

View File

@ -33,7 +33,6 @@ import {
DELETE_PACKAGE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
PULL_PACKAGE_TRACKING_ACTION,
DELETE_PACKAGE_FILE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_FILE_TRACKING_ACTION,
@ -41,6 +40,7 @@ import {
FETCH_PACKAGE_DETAILS_ERROR_MESSAGE,
DELETE_PACKAGE_FILE_ERROR_MESSAGE,
DELETE_PACKAGE_FILE_SUCCESS_MESSAGE,
DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION,
} from '~/packages_and_registries/package_registry/constants';
import destroyPackageFileMutation from '~/packages_and_registries/package_registry/graphql/mutations/destroy_package_file.mutation.graphql';
@ -76,10 +76,10 @@ export default {
DELETE_PACKAGE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_TRACKING_ACTION,
PULL_PACKAGE_TRACKING_ACTION,
DELETE_PACKAGE_FILE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_FILE_TRACKING_ACTION,
DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION,
},
data() {
return {
@ -288,7 +288,7 @@ export default {
v-if="showFiles"
:can-delete="packageEntity.canDestroy"
:package-files="packageFiles"
@download-file="track($options.trackingActions.PULL_PACKAGE)"
@download-file="track($options.trackingActions.DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION)"
@delete-file="handleFileDelete"
/>
</gl-tab>

View File

@ -11,6 +11,7 @@ export const PULL_PACKAGE_TRACKING_ACTION = 'pull_package';
export const DELETE_PACKAGE_FILE_TRACKING_ACTION = 'delete_package_file';
export const REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION = 'request_delete_package_file';
export const CANCEL_DELETE_PACKAGE_FILE_TRACKING_ACTION = 'cancel_delete_package_file';
export const DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION = 'download_package_asset';
export const TRACKING_ACTIONS = {
DELETE_PACKAGE: DELETE_PACKAGE_TRACKING_ACTION,
@ -20,6 +21,7 @@ export const TRACKING_ACTIONS = {
DELETE_PACKAGE_FILE: DELETE_PACKAGE_FILE_TRACKING_ACTION,
REQUEST_DELETE_PACKAGE_FILE: REQUEST_DELETE_PACKAGE_FILE_TRACKING_ACTION,
CANCEL_DELETE_PACKAGE_FILE: CANCEL_DELETE_PACKAGE_FILE_TRACKING_ACTION,
DOWNLOAD_PACKAGE_ASSET: DOWNLOAD_PACKAGE_ASSET_TRACKING_ACTION,
};
export const SHOW_DELETE_SUCCESS_ALERT = 'showSuccessDeleteAlert';

View File

@ -15,6 +15,7 @@ import MilestoneCombobox from '~/milestones/components/milestone_combobox.vue';
import { BACK_URL_PARAM } from '~/releases/constants';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
import AssetLinksForm from './asset_links_form.vue';
import ConfirmDeleteModal from './confirm_delete_modal.vue';
import TagField from './tag_field.vue';
export default {
@ -27,6 +28,7 @@ export default {
GlDatepicker,
GlLink,
GlSprintf,
ConfirmDeleteModal,
MarkdownField,
AssetLinksForm,
MilestoneCombobox,
@ -133,6 +135,7 @@ export default {
...mapActions('editNew', [
'initializeRelease',
'saveRelease',
'deleteRelease',
'updateReleaseTitle',
'updateReleaseNotes',
'updateReleaseMilestones',
@ -260,6 +263,7 @@ export default {
>
{{ saveButtonLabel }}
</gl-button>
<confirm-delete-modal v-if="isExistingRelease" @delete="deleteRelease" />
<gl-button :href="cancelPath" class="js-cancel-button">{{ __('Cancel') }}</gl-button>
</div>
</form>

View File

@ -4,9 +4,9 @@ import createFlash from '~/flash';
import { historyPushState } from '~/lib/utils/common_utils';
import { scrollUp } from '~/lib/utils/scroll_utils';
import { setUrlParams, getParameterByName } from '~/lib/utils/url_utility';
import { __ } from '~/locale';
import { __, sprintf } from '~/locale';
import { PAGE_SIZE, DEFAULT_SORT } from '~/releases/constants';
import { convertAllReleasesGraphQLResponse } from '~/releases/util';
import { convertAllReleasesGraphQLResponse, deleteReleaseSessionKey } from '~/releases/util';
import allReleasesQuery from '../graphql/queries/all_releases.query.graphql';
import ReleaseBlock from './release_block.vue';
import ReleaseSkeletonLoader from './release_skeleton_loader.vue';
@ -172,6 +172,20 @@ export default {
return this.isFullRequestLoaded && !this.shouldRenderEmptyState;
},
},
mounted() {
const key = deleteReleaseSessionKey(this.projectPath);
const deletedRelease = window.sessionStorage.getItem(key);
if (deletedRelease) {
this.$toast.show(
sprintf(__('Release %{deletedRelease} has been successfully deleted.'), {
deletedRelease,
}),
);
}
window.sessionStorage.removeItem(key);
},
created() {
this.updateQueryParamsFromUrl();

View File

@ -0,0 +1,77 @@
<script>
import { GlModal, GlSprintf, GlLink, GlButton } from '@gitlab/ui';
import { mapState } from 'vuex';
import { __, s__, sprintf } from '~/locale';
export default {
components: {
GlModal,
GlSprintf,
GlLink,
GlButton,
},
data() {
return {
visible: false,
};
},
computed: {
...mapState('editNew', ['release', 'deleteReleaseDocsPath']),
title() {
return sprintf(__('Delete release %{release}?'), { release: this.release.name });
},
},
modalOptions: {
modalId: 'confirm-delete-release',
static: true,
actionPrimary: {
attributes: { variant: 'danger' },
text: __('Delete release'),
},
actionSecondary: {
text: __('Cancel'),
attributes: { variant: 'default' },
},
},
i18n: {
buttonLabel: __('Delete'),
line1: s__(
'DeleteRelease|You are about to delete release %{release} and its assets. The Git tag %{tag} will not be deleted.',
),
line2: s__(
'DeleteRelease|For more details, see %{docsPathStart}Deleting a release%{docsPathEnd}.',
),
line3: s__('DeleteRelease|Are you sure you want to delete this release?'),
},
};
</script>
<template>
<div>
<gl-button class="gl-mr-3" variant="danger" @click="visible = true">
{{ $options.i18n.buttonLabel }}
</gl-button>
<gl-modal
v-bind="$options.modalOptions"
v-model="visible"
:title="title"
@primary="$emit('delete')"
>
<p>
<gl-sprintf :message="$options.i18n.line1">
<template #release>{{ release.name }}</template>
<template #tag>
<gl-link :href="release.tagPath">{{ release.tagName }}</gl-link>
</template>
</gl-sprintf>
</p>
<p>
<gl-sprintf :message="$options.i18n.line2">
<template #docsPath="{ content }">
<gl-link :href="deleteReleaseDocsPath" target="_blank">{{ content }}</gl-link>
</template>
</gl-sprintf>
</p>
<p>{{ $options.i18n.line3 }}</p>
</gl-modal>
</div>
</template>

View File

@ -4,6 +4,7 @@ fragment ReleaseForEditing on Release {
tagName
description
releasedAt
tagPath
assets {
links {
nodes {

View File

@ -0,0 +1,5 @@
mutation deleteRelease($input: ReleaseDeleteInput!) {
releaseDelete(input: $input) {
errors
}
}

View File

@ -1,5 +1,6 @@
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { GlToast } from '@gitlab/ui';
import createDefaultClient from '~/lib/graphql';
import ReleaseIndexApp from './components/app_index.vue';
@ -7,6 +8,7 @@ export default () => {
const el = document.getElementById('js-releases-page');
Vue.use(VueApollo);
Vue.use(GlToast);
const apolloProvider = new VueApollo({
defaultClient: createDefaultClient(

View File

@ -3,11 +3,16 @@ import createFlash from '~/flash';
import { redirectTo } from '~/lib/utils/url_utility';
import { s__ } from '~/locale';
import createReleaseMutation from '~/releases/graphql/mutations/create_release.mutation.graphql';
import deleteReleaseMutation from '~/releases/graphql/mutations/delete_release.mutation.graphql';
import createReleaseAssetLinkMutation from '~/releases/graphql/mutations/create_release_link.mutation.graphql';
import deleteReleaseAssetLinkMutation from '~/releases/graphql/mutations/delete_release_link.mutation.graphql';
import updateReleaseMutation from '~/releases/graphql/mutations/update_release.mutation.graphql';
import oneReleaseForEditingQuery from '~/releases/graphql/queries/one_release_for_editing.query.graphql';
import { gqClient, convertOneReleaseGraphQLResponse } from '~/releases/util';
import {
gqClient,
convertOneReleaseGraphQLResponse,
deleteReleaseSessionKey,
} from '~/releases/util';
import * as types from './mutation_types';
@ -253,3 +258,26 @@ export const updateIncludeTagNotes = ({ commit }, includeTagNotes) => {
export const updateReleasedAt = ({ commit }, releasedAt) => {
commit(types.UPDATE_RELEASED_AT, releasedAt);
};
export const deleteRelease = ({ commit, getters, dispatch, state }) => {
commit(types.REQUEST_SAVE_RELEASE);
return gqClient
.mutate({
mutation: deleteReleaseMutation,
variables: getters.releaseDeleteMutationVariables,
})
.then((response) => checkForErrorsAsData(response, 'releaseDelete', ''))
.then(() => {
window.sessionStorage.setItem(
deleteReleaseSessionKey(state.projectPath),
state.originalRelease.name,
);
return dispatch('receiveSaveReleaseSuccess', state.releasesPagePath);
})
.catch((error) => {
commit(types.RECEIVE_SAVE_RELEASE_ERROR, error);
createFlash({
message: s__('Release|Something went wrong while deleting the release.'),
});
});
};

View File

@ -156,6 +156,13 @@ export const releaseCreateMutatationVariables = (state, getters) => {
};
};
export const releaseDeleteMutationVariables = (state) => ({
input: {
projectPath: state.projectPath,
tagName: state.release.tagName,
},
});
export const formattedReleaseNotes = ({ includeTagNotes, release: { description }, tagNotes }) =>
includeTagNotes && tagNotes
? `${description}\n\n### ${s__('Releases|Tag message')}\n\n${tagNotes}\n`

View File

@ -13,6 +13,7 @@ export default ({
editReleaseDocsPath,
upcomingReleaseDocsPath,
deleteReleaseDocsPath = '',
tagName = null,
defaultBranch = null,
}) => ({
@ -29,6 +30,7 @@ export default ({
releasesPagePath,
editReleaseDocsPath,
upcomingReleaseDocsPath,
deleteReleaseDocsPath,
/**
* The name of the tag associated with the release, provided by the backend.

View File

@ -133,3 +133,5 @@ export const convertOneReleaseGraphQLResponse = (response) => {
return { data: release };
};
export const deleteReleaseSessionKey = (projectPath) => `deleteRelease:${projectPath}`;

View File

@ -45,7 +45,6 @@ class Projects::IssuesController < Projects::ApplicationController
end
before_action only: :show do
push_frontend_feature_flag(:confidential_notes, project&.group)
push_frontend_feature_flag(:issue_assignees_widget, project)
push_frontend_feature_flag(:realtime_labels, project)
push_force_frontend_feature_flag(:work_items, project&.work_items_feature_flag_enabled?)

View File

@ -34,7 +34,6 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
before_action only: [:show] do
push_frontend_feature_flag(:merge_request_widget_graphql, project)
push_frontend_feature_flag(:core_security_mr_widget_counts, project)
push_frontend_feature_flag(:confidential_notes, project)
push_frontend_feature_flag(:restructured_mr_widget, project)
push_frontend_feature_flag(:refactor_mr_widgets_extensions, project)
push_frontend_feature_flag(:refactor_code_quality_extension, project)

View File

@ -53,7 +53,8 @@ module ReleasesHelper
def data_for_edit_release_page
new_edit_pages_shared_data.merge(
tag_name: @release.tag,
releases_page_path: project_releases_path(@project, anchor: @release.tag)
releases_page_path: project_releases_path(@project, anchor: @release.tag),
delete_release_docs_path: releases_help_page_path(anchor: 'delete-a-release')
)
end

View File

@ -181,8 +181,6 @@ module Ci
joins(:metadata).where("ci_builds_metadata.config_options -> 'artifacts' -> 'reports' ?| array[:job_types]", job_types: job_types)
end
scope :queued_before, ->(time) { where(arel_table[:queued_at].lt(time)) }
scope :with_coverage, -> { where.not(coverage: nil) }
scope :without_coverage, -> { where(coverage: nil) }
scope :with_coverage_regex, -> { where.not(coverage_regex: nil) }

View File

@ -111,7 +111,7 @@ class ProjectMember < Member
# rubocop:disable CodeReuse/ServiceClass
if blocking
AuthorizedProjectUpdate::ProjectRecalculatePerUserService.new(project, user).execute
AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker.bulk_perform_and_wait([[project.id, user.id]])
else
AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker.perform_async(project.id, user.id)
end

View File

@ -3,5 +3,15 @@
module IncidentManagement
class TimelineEventPolicy < ::BasePolicy
delegate { @subject.incident }
condition(:is_editable, scope: :subject, score: 0) { @subject.editable? }
rule { ~can?(:admin_incident_management_timeline_event) }.policy do
prevent :edit_incident_management_timeline_event
end
rule { is_editable }.policy do
enable :edit_incident_management_timeline_event
end
end
end

View File

@ -17,7 +17,6 @@ module IncidentManagement
end
def execute
return error_non_editable unless timeline_event.editable?
return error_no_permissions unless allowed?
if timeline_event.update(update_params)
@ -59,8 +58,8 @@ module IncidentManagement
:none
end
def error_non_editable
error(_('You cannot edit this timeline event.'))
def allowed?
user&.can?(:edit_incident_management_timeline_event, timeline_event)
end
end
end

View File

@ -12,7 +12,7 @@
- if todo.author
= link_to_author(todo, self_added: todo.self_added?)
- else
(removed)
= _('(removed)')
%span.title-item.action-name{ data: { qa_selector: "todo_action_name_content" } }
= todo_action_name(todo)
@ -45,17 +45,17 @@
.todo-body
.todo-note.break-word
.md
= first_line_in_markdown(todo, :body, 150, project: todo.project)
= first_line_in_markdown(todo, :body, 150, project: todo.project, group: todo.group)
.todo-actions.gl-ml-3
- if todo.pending?
= link_to dashboard_todo_path(todo), method: :delete, class: 'gl-button btn btn-default btn-loading d-flex align-items-center js-done-todo', data: { href: dashboard_todo_path(todo) } do
= gl_loading_icon(inline: true)
Done
= _('Done')
= link_to restore_dashboard_todo_path(todo), method: :patch, class: 'gl-button btn btn-default btn-loading d-flex align-items-center js-undo-todo hidden', data: { href: restore_dashboard_todo_path(todo) } do
= gl_loading_icon(inline: true)
Undo
= _('Undo')
- else
= link_to restore_dashboard_todo_path(todo), method: :patch, class: 'gl-button btn btn-default btn-loading d-flex align-items-center js-add-todo', data: { href: restore_dashboard_todo_path(todo) } do
= gl_loading_icon(inline: true)
Add a to do
= _('Add a to do')

View File

@ -1,8 +0,0 @@
---
name: confidential_notes
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52949
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/207474
milestone: '13.9'
type: development
group: group::product planning
default_enabled: true

View File

@ -345,7 +345,7 @@ POST /projects/:id/deployments
| `sha` | string | yes | The SHA of the commit that is deployed. |
| `ref` | string | yes | The name of the branch or tag that is deployed. |
| `tag` | boolean | yes | A boolean that indicates if the deployed ref is a tag (`true`) or not (`false`). |
| `status` | string | no | The status to filter deployments by. One of `created`, `running`, `success`, `failed`, or `canceled`. |
| `status` | string | yes | The status to filter deployments by. One of `running`, `success`, `failed`, or `canceled`. |
```shell
curl --data "environment=production&sha=a91957a858320c0e17f3a0eca7cfacbff50ea29a&ref=main&tag=false&status=success" \
@ -400,7 +400,7 @@ PUT /projects/:id/deployments/:deployment_id
|------------------|----------------|----------|---------------------|
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](index.md#namespaced-path-encoding) owned by the authenticated user. |
| `deployment_id` | integer | yes | The ID of the deployment to update. |
| `status` | string | no | The new status of the deployment. One of `created`, `running`, `success`, `failed`, or `canceled`. |
| `status` | string | yes | The new status of the deployment. One of `running`, `success`, `failed`, or `canceled`. |
```shell
curl --request PUT --data "status=success" --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/deployments/42"

View File

@ -346,7 +346,7 @@ To mask a variable:
1. Select the **Mask variable** checkbox.
1. Select **Update variable**.
The method used to mask variables [limits what can be included in a masked variable](](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13784#note_106756757)).
The method used to mask variables [limits what can be included in a masked variable](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13784#note_106756757).
The value of the variable must:
- Be a single line.

View File

@ -154,11 +154,7 @@ If an issue or merge request is locked and closed, you cannot reopen it.
> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/351143) in GitLab 14.10: you can only mark comments in issues and epics as confidential. Previously, it was also possible for comments in merge requests and snippets.
> - [Renamed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87403) from "confidential comments" to "internal notes" in GitLab 15.0.
> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/87383) in GitLab 15.0.
FLAG:
On self-managed GitLab, by default this feature is available. To hide the feature,
ask an administrator to [disable the feature flag](../../administration/feature_flags.md) named `confidential_notes`.
On GitLab.com, this feature is available.
> - [Feature flag `confidential_notes`](https://gitlab.com/gitlab-org/gitlab/-/issues/362712) removed in GitLab 15.2.
You can add an internal note **to an issue or an epic**. It's then visible only to the following people:

View File

@ -317,6 +317,25 @@ You can edit the release title, notes, associated milestones, and asset links.
To change the release date use the
[Releases API](../../../api/releases/index.md#update-a-release).
## Delete a release
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/213862) in GitLab 15.2
When you delete a release, its assets are also deleted. However, the associated
Git tag is not deleted.
Prerequisites:
- You must have at least the Developer role. Read more about [Release permissions](#release-permissions).
To delete a release in the UI:
1. On the top bar, select **Menu > Projects** and find your project.
1. On the left sidebar, select **Deployments > Releases**.
1. In the top-right corner of the release you want to delete, select **Edit this release** (**{pencil}**).
1. On the **Edit Release** page, select **Delete**.
1. Select **Delete release**.
## Associate milestones with a release
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/29020) in GitLab 12.5.

View File

@ -173,6 +173,8 @@
<hr data-sourcepos="3:1-3:3">
wysiwyg: |-
<hr>
<hr>
<hr>
04_01__leaf_blocks__thematic_breaks__002:
canonical: |
<p>+++</p>
@ -211,6 +213,8 @@
<hr data-sourcepos="3:4-3:6">
wysiwyg: |-
<hr>
<hr>
<hr>
04_01__leaf_blocks__thematic_breaks__006:
canonical: |
<pre><code>***
@ -278,6 +282,8 @@
<p data-sourcepos="5:1-5:7" dir="auto">---a---</p>
wysiwyg: |-
<p>_ _ _ _ a</p>
<p>a------</p>
<p>---a---</p>
04_01__leaf_blocks__thematic_breaks__014:
canonical: |
<p><em>-</em></p>
@ -304,6 +310,8 @@
</ul>
wysiwyg: |-
<ul bullet="*"><li><p>foo</p></li></ul>
<hr>
<ul bullet="*"><li><p>bar</p></li></ul>
04_01__leaf_blocks__thematic_breaks__016:
canonical: |
<p>Foo</p>
@ -315,6 +323,8 @@
<p data-sourcepos="3:1-3:3" dir="auto">bar</p>
wysiwyg: |-
<p>Foo</p>
<hr>
<p>bar</p>
04_01__leaf_blocks__thematic_breaks__017:
canonical: |
<h2>Foo</h2>
@ -325,6 +335,7 @@
<p data-sourcepos="3:1-3:3" dir="auto">bar</p>
wysiwyg: |-
<h2>Foo</h2>
<p>bar</p>
04_01__leaf_blocks__thematic_breaks__018:
canonical: |
<ul>
@ -344,6 +355,8 @@
</ul>
wysiwyg: |-
<ul bullet="*"><li><p>Foo</p></li></ul>
<hr>
<ul bullet="*"><li><p>Bar</p></li></ul>
04_01__leaf_blocks__thematic_breaks__019:
canonical: |
<ul>
@ -384,6 +397,11 @@
<a id="user-content-foo-5" class="anchor" href="#foo-5" aria-hidden="true"></a>foo</h6>
wysiwyg: |-
<h1>foo</h1>
<h2>foo</h2>
<h3>foo</h3>
<h4>foo</h4>
<h5>foo</h5>
<h6>foo</h6>
04_02__leaf_blocks__atx_headings__002:
canonical: |
<p>####### foo</p>
@ -400,6 +418,7 @@
<p data-sourcepos="3:1-3:8" dir="auto">#hashtag</p>
wysiwyg: |-
<p>#5 bolt</p>
<p>#hashtag</p>
04_02__leaf_blocks__atx_headings__004:
canonical: |
<p>## foo</p>
@ -437,6 +456,8 @@
<a id="user-content-foo-2" class="anchor" href="#foo-2" aria-hidden="true"></a>foo</h1>
wysiwyg: |-
<h3>foo</h3>
<h2>foo</h2>
<h1>foo</h1>
04_02__leaf_blocks__atx_headings__008:
canonical: |
<pre><code># foo
@ -469,6 +490,7 @@
<a id="user-content-bar" class="anchor" href="#bar" aria-hidden="true"></a>bar</h3>
wysiwyg: |-
<h2>foo</h2>
<h3>bar</h3>
04_02__leaf_blocks__atx_headings__011:
canonical: |
<h1>foo</h1>
@ -480,6 +502,7 @@
<a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>foo</h5>
wysiwyg: |-
<h1>foo</h1>
<h5>foo</h5>
04_02__leaf_blocks__atx_headings__012:
canonical: |
<h3>foo</h3>
@ -519,6 +542,8 @@
</h1>
wysiwyg: |-
<h3>foo ###</h3>
<h2>foo ###</h2>
<h1>foo #</h1>
04_02__leaf_blocks__atx_headings__016:
canonical: |
<hr />
@ -531,6 +556,8 @@
<hr data-sourcepos="3:1-3:4">
wysiwyg: |-
<hr>
<h2>foo</h2>
<hr>
04_02__leaf_blocks__atx_headings__017:
canonical: |
<p>Foo bar</p>
@ -543,6 +570,8 @@
<p data-sourcepos="3:1-3:7" dir="auto">Bar foo</p>
wysiwyg: |-
<p>Foo bar</p>
<h1>baz</h1>
<p>Bar foo</p>
04_02__leaf_blocks__atx_headings__018:
canonical: |
<h2></h2>
@ -554,6 +583,8 @@
<h3 data-sourcepos="3:1-3:3" dir="auto"></h3>
wysiwyg: |-
<h2></h2>
<h1></h1>
<h3></h3>
04_03__leaf_blocks__setext_headings__001:
canonical: |
<h1>Foo <em>bar</em></h1>
@ -567,6 +598,7 @@
</h2>
wysiwyg: |-
<h1>Foo <em>bar</em></h1>
<h2>Foo <em>bar</em></h2>
04_03__leaf_blocks__setext_headings__002:
canonical: |
<h1>Foo <em>bar
@ -602,6 +634,7 @@
<a id="user-content-foo-1" class="anchor" href="#foo-1" aria-hidden="true"></a>Foo</h1>
wysiwyg: |-
<h2>Foo</h2>
<h1>Foo</h1>
04_03__leaf_blocks__setext_headings__005:
canonical: |
<h2>Foo</h2>
@ -616,6 +649,8 @@
<a id="user-content-foo-2" class="anchor" href="#foo-2" aria-hidden="true"></a>Foo</h1>
wysiwyg: |-
<h2>Foo</h2>
<h2>Foo</h2>
<h1>Foo</h1>
04_03__leaf_blocks__setext_headings__006:
canonical: |
<pre><code>Foo
@ -638,6 +673,7 @@
---
Foo</code></pre>
<hr>
04_03__leaf_blocks__setext_headings__007:
canonical: |
<h2>Foo</h2>
@ -670,6 +706,8 @@
wysiwyg: |-
<p>Foo
= =</p>
<p>Foo</p>
<hr>
04_03__leaf_blocks__setext_headings__010:
canonical: |
<h2>Foo</h2>
@ -701,6 +739,9 @@
<p data-sourcepos="7:1-7:12" dir="auto">of dashes"/&gt;</p>
wysiwyg: |-
<h2>`Foo</h2>
<p>`</p>
<h2>&lt;a title="a lot</h2>
<p>of dashes"/&gt;</p>
04_03__leaf_blocks__setext_headings__013:
canonical: |
<blockquote>
@ -714,6 +755,7 @@
<hr data-sourcepos="2:1-2:3">
wysiwyg: |-
<blockquote multiline="false"><p>Foo</p></blockquote>
<hr>
04_03__leaf_blocks__setext_headings__014:
canonical: |
<blockquote>
@ -744,6 +786,7 @@
<hr data-sourcepos="2:1-2:3">
wysiwyg: |-
<ul bullet="*"><li><p>Foo</p></li></ul>
<hr>
04_03__leaf_blocks__setext_headings__016:
canonical: |
<h2>Foo
@ -771,6 +814,9 @@
<p data-sourcepos="6:1-6:3" dir="auto">Baz</p>
wysiwyg: |-
<hr>
<h2>Foo</h2>
<h2>Bar</h2>
<p>Baz</p>
04_03__leaf_blocks__setext_headings__018:
canonical: |
<p>====</p>
@ -789,6 +835,7 @@
</div>
wysiwyg: |-
<hr>
<hr>
04_03__leaf_blocks__setext_headings__020:
canonical: |
<ul>
@ -802,6 +849,7 @@
<hr data-sourcepos="2:1-2:5">
wysiwyg: |-
<ul bullet="*"><li><p>foo</p></li></ul>
<hr>
04_03__leaf_blocks__setext_headings__021:
canonical: |
<pre><code>foo
@ -815,6 +863,7 @@
<hr data-sourcepos="2:1-2:3">
wysiwyg: |-
<pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
<hr>
04_03__leaf_blocks__setext_headings__022:
canonical: |
<blockquote>
@ -828,6 +877,7 @@
<hr data-sourcepos="2:1-2:5">
wysiwyg: |-
<blockquote multiline="false"><p>foo</p></blockquote>
<hr>
04_03__leaf_blocks__setext_headings__023:
canonical: |
<h2>&gt; foo</h2>
@ -848,6 +898,8 @@
<p data-sourcepos="5:1-5:3" dir="auto">baz</p>
wysiwyg: |-
<p>Foo</p>
<h2>bar</h2>
<p>baz</p>
04_03__leaf_blocks__setext_headings__025:
canonical: |
<p>Foo
@ -862,6 +914,8 @@
wysiwyg: |-
<p>Foo
bar</p>
<hr>
<p>baz</p>
04_03__leaf_blocks__setext_headings__026:
canonical: |
<p>Foo
@ -876,6 +930,8 @@
wysiwyg: |-
<p>Foo
bar</p>
<hr>
<p>baz</p>
04_03__leaf_blocks__setext_headings__027:
canonical: |
<p>Foo
@ -1027,6 +1083,7 @@
<p data-sourcepos="2:1-2:3" dir="auto">bar</p>
wysiwyg: |-
<pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
<p>bar</p>
04_04__leaf_blocks__indented_code_blocks__009:
canonical: |
<h1>Heading</h1>
@ -1052,6 +1109,10 @@
<hr data-sourcepos="6:1-6:4">
wysiwyg: |-
<h1>Heading</h1>
<pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
<h2>Heading</h2>
<pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre>
<hr>
04_04__leaf_blocks__indented_code_blocks__010:
canonical: |
<pre><code> foo
@ -1221,6 +1282,7 @@
<p data-sourcepos="4:1-4:3" dir="auto">bbb</p>
wysiwyg: |-
<blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre></blockquote>
<p>bbb</p>
04_05__leaf_blocks__fenced_code_blocks__011:
canonical: "<pre><code>\n \n</code></pre>\n"
static: |-
@ -1382,6 +1444,8 @@
<p data-sourcepos="5:1-5:3" dir="auto">baz</p>
wysiwyg: |-
<p>foo</p>
<pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre>
<p>baz</p>
04_05__leaf_blocks__fenced_code_blocks__023:
canonical: |
<h2>foo</h2>
@ -1399,6 +1463,8 @@
<a id="user-content-baz" class="anchor" href="#baz" aria-hidden="true"></a>baz</h1>
wysiwyg: |-
<h2>foo</h2>
<pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre>
<h1>baz</h1>
04_05__leaf_blocks__fenced_code_blocks__024:
canonical: |
<pre><code class="language-ruby">def foo(x)
@ -1516,6 +1582,7 @@
<table><tbody><tr><td colspan="1" rowspan="1"><p>
hi
</p></td></tr></tbody></table>
<p>okay.</p>
04_06__leaf_blocks__html_blocks__003:
canonical: |2
<div>
@ -1642,6 +1709,10 @@
```
wysiwyg: |-
<div></div>
<p>
``` c
int x = 33;
```</p>
04_06__leaf_blocks__html_blocks__015:
canonical: |
<a href="foo">
@ -1744,6 +1815,7 @@
main :: IO ()
main = print $ parseTags tags</code></pre>
<p>okay</p>
04_06__leaf_blocks__html_blocks__023:
canonical: |
<script type="text/javascript">
@ -1806,6 +1878,7 @@
<blockquote multiline="false"><div><p>
foo
</p></div></blockquote>
<p>bar</p>
04_06__leaf_blocks__html_blocks__027:
canonical: |
<ul>
@ -1842,8 +1915,9 @@
*bar*
<p data-sourcepos="2:1-2:5" dir="auto"><em>baz</em></p>
wysiwyg: |-
Error - check implementation:
Cannot read properties of undefined (reading 'wrapper')
<p>*bar*
</p>
<p><em>baz</em></p>
04_06__leaf_blocks__html_blocks__030:
canonical: |
<script>
@ -1864,8 +1938,7 @@
<p data-sourcepos="5:1-5:4" dir="auto">okay</p>
wysiwyg: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
<p>okay</p>
04_06__leaf_blocks__html_blocks__032:
canonical: |
<?php
@ -1880,8 +1953,11 @@
?&gt;
<p data-sourcepos="6:1-6:4" dir="auto">okay</p>
wysiwyg: |-
Error - check implementation:
Cannot read properties of undefined (reading 'wrapper')
<p>';
?&gt;
</p>
<p>okay</p>
04_06__leaf_blocks__html_blocks__033:
canonical: |
<!DOCTYPE html>
@ -1918,8 +1994,7 @@
]]&gt;
<p data-sourcepos="13:1-13:4" dir="auto">okay</p>
wysiwyg: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
<p>okay</p>
04_06__leaf_blocks__html_blocks__035:
canonical: |2
<!-- foo -->
@ -1930,8 +2005,7 @@
lang=\"plaintext\" data-canonical-lang=\"\" v-pre=\"true\"><code><span id=\"LC1\"
class=\"line\" lang=\"plaintext\">&lt;!-- foo --&gt;</span></code></pre>\n<copy-code></copy-code>\n</div>"
wysiwyg: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
<pre class="content-editor-code-block undefined code highlight"><code>&lt;!-- foo --&gt;</code></pre>
04_06__leaf_blocks__html_blocks__036:
canonical: |2
<div>
@ -1959,6 +2033,9 @@
</div>
wysiwyg: |-
<p>Foo</p>
<div><p>
bar
</p></div>
04_06__leaf_blocks__html_blocks__038:
canonical: |
<div>
@ -1974,6 +2051,8 @@
<div><p>
bar
</p></div>
<p>
*foo*</p>
04_06__leaf_blocks__html_blocks__039:
canonical: |
<p>Foo
@ -2057,6 +2136,7 @@
<pre class="content-editor-code-block undefined code highlight"><code>&lt;td&gt;
Hi
&lt;/td&gt;</code></pre>
<table><tbody><tr></tr></tbody></table>
04_07__leaf_blocks__link_reference_definitions__001:
canonical: |
<p><a href="/url" title="title">foo</a></p>
@ -2115,6 +2195,8 @@
<p data-sourcepos="5:1-5:5" dir="auto">[foo]</p>
wysiwyg: |-
<p>[foo]: /url 'title</p>
<p>with blank line'</p>
<p>[foo]</p>
04_07__leaf_blocks__link_reference_definitions__007:
canonical: |
<p><a href="/url">foo</a></p>
@ -2131,6 +2213,7 @@
<p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
wysiwyg: |-
<p>[foo]:</p>
<p>[foo]</p>
04_07__leaf_blocks__link_reference_definitions__009:
canonical: |
<p><a href="">foo</a></p>
@ -2147,6 +2230,7 @@
<p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
wysiwyg: |-
<p>[foo]: </p>
<p>[foo]</p>
04_07__leaf_blocks__link_reference_definitions__011:
canonical: |
<p><a href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>
@ -2221,6 +2305,7 @@
<p data-sourcepos="3:1-3:5" dir="auto">[foo]</p>
wysiwyg: |-
<pre class="content-editor-code-block undefined code highlight"><code>[foo]: /url "title"</code></pre>
<p>[foo]</p>
04_07__leaf_blocks__link_reference_definitions__021:
canonical: |
<pre><code>[foo]: /url
@ -2234,6 +2319,7 @@
<p data-sourcepos="5:1-5:5" dir="auto">[foo]</p>
wysiwyg: |-
<pre class="content-editor-code-block undefined code highlight"><code>[foo]: /url</code></pre>
<p>[foo]</p>
04_07__leaf_blocks__link_reference_definitions__022:
canonical: |
<p>Foo
@ -2246,6 +2332,7 @@
wysiwyg: |-
<p>Foo
[bar]: /baz</p>
<p>[bar]</p>
04_07__leaf_blocks__link_reference_definitions__023:
canonical: |
<h1><a href="/url">Foo</a></h1>
@ -2261,6 +2348,7 @@
</blockquote>
wysiwyg: |-
<h1><a target="_blank" rel="noopener noreferrer nofollow" href="/url">Foo</a></h1>
<blockquote multiline="false"><p>bar</p></blockquote>
04_07__leaf_blocks__link_reference_definitions__024:
canonical: |
<h1>bar</h1>
@ -2271,6 +2359,7 @@
<p data-sourcepos="4:1-4:5" dir="auto"><a href="/url">foo</a></p>
wysiwyg: |-
<h1>bar</h1>
<p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
04_07__leaf_blocks__link_reference_definitions__025:
canonical: |
<p>===
@ -2305,6 +2394,7 @@
</blockquote>
wysiwyg: |-
<p><a target="_blank" rel="noopener noreferrer nofollow" href="/url">foo</a></p>
<blockquote multiline="false"><p></p></blockquote>
04_07__leaf_blocks__link_reference_definitions__028:
canonical: ""
static: ""
@ -2319,6 +2409,7 @@
<p data-sourcepos="3:1-3:3" dir="auto">bbb</p>
wysiwyg: |-
<p>aaa</p>
<p>bbb</p>
04_08__leaf_blocks__paragraphs__002:
canonical: |
<p>aaa
@ -2333,6 +2424,8 @@
wysiwyg: |-
<p>aaa
bbb</p>
<p>ccc
ddd</p>
04_08__leaf_blocks__paragraphs__003:
canonical: |
<p>aaa</p>
@ -2342,6 +2435,7 @@
<p data-sourcepos="4:1-4:3" dir="auto">bbb</p>
wysiwyg: |-
<p>aaa</p>
<p>bbb</p>
04_08__leaf_blocks__paragraphs__004:
canonical: |
<p>aaa
@ -2388,6 +2482,7 @@
<p data-sourcepos="2:1-2:3" dir="auto">bbb</p>
wysiwyg: |-
<pre class="content-editor-code-block undefined code highlight"><code>aaa</code></pre>
<p>bbb</p>
04_08__leaf_blocks__paragraphs__008:
canonical: |
<p>aaa<br />
@ -2408,6 +2503,7 @@
<a id="user-content-aaa" class="anchor" href="#aaa" aria-hidden="true"></a>aaa</h1>
wysiwyg: |-
<p>aaa</p>
<h1>aaa</h1>
04_10__leaf_blocks__tables_extension__001:
canonical: |
<table>
@ -2548,6 +2644,7 @@
</blockquote>
wysiwyg: |-
<table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>def</p></th></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p>baz</p></td></tr></tbody></table>
<blockquote multiline="false"><p>bar</p></blockquote>
04_10__leaf_blocks__tables_extension__005:
canonical: |
<table>
@ -2591,6 +2688,7 @@
<p data-sourcepos="6:1-6:3" dir="auto">bar</p>
wysiwyg: |-
<table><tbody><tr><th colspan="1" rowspan="1"><p>abc</p></th><th colspan="1" rowspan="1"><p>def</p></th></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p>baz</p></td></tr><tr><td colspan="1" rowspan="1"><p>bar</p></td><td colspan="1" rowspan="1"><p></p></td></tr></tbody></table>
<p>bar</p>
04_10__leaf_blocks__tables_extension__006:
canonical: |
<p>| abc | def |
@ -2781,6 +2879,7 @@
<hr data-sourcepos="2:1-2:3">
wysiwyg: |-
<blockquote multiline="false"><p>foo</p></blockquote>
<hr>
05_01__container_blocks__block_quotes__008:
canonical: |
<blockquote>
@ -2802,6 +2901,7 @@
</ul>
wysiwyg: |-
<blockquote multiline="false"><ul bullet="*"><li><p>foo</p></li></ul></blockquote>
<ul bullet="*"><li><p>bar</p></li></ul>
05_01__container_blocks__block_quotes__009:
canonical: |
<blockquote>
@ -2823,6 +2923,7 @@
</div>
wysiwyg: |-
<blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code>foo</code></pre></blockquote>
<pre class="content-editor-code-block undefined code highlight"><code>bar</code></pre>
05_01__container_blocks__block_quotes__010:
canonical: |
<blockquote>
@ -2844,6 +2945,8 @@
</div>
wysiwyg: |-
<blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code></code></pre></blockquote>
<p>foo</p>
<pre class="content-editor-code-block undefined code highlight"><code></code></pre>
05_01__container_blocks__block_quotes__011:
canonical: |
<blockquote>
@ -2904,6 +3007,7 @@
</blockquote>
wysiwyg: |-
<blockquote multiline="false"><p>foo</p></blockquote>
<blockquote multiline="false"><p>bar</p></blockquote>
05_01__container_blocks__block_quotes__016:
canonical: |
<blockquote>
@ -2944,6 +3048,7 @@
</blockquote>
wysiwyg: |-
<p>foo</p>
<blockquote multiline="false"><p>bar</p></blockquote>
05_01__container_blocks__block_quotes__019:
canonical: |
<blockquote>
@ -2963,6 +3068,8 @@
</blockquote>
wysiwyg: |-
<blockquote multiline="false"><p>aaa</p></blockquote>
<hr>
<blockquote multiline="false"><p>bbb</p></blockquote>
05_01__container_blocks__block_quotes__020:
canonical: |
<blockquote>
@ -2990,6 +3097,7 @@
<p data-sourcepos="3:1-3:3" dir="auto">baz</p>
wysiwyg: |-
<blockquote multiline="false"><p>bar</p></blockquote>
<p>baz</p>
05_01__container_blocks__block_quotes__022:
canonical: |
<blockquote>
@ -3003,6 +3111,7 @@
<p data-sourcepos="3:1-3:3" dir="auto">baz</p>
wysiwyg: |-
<blockquote multiline="false"><p>bar</p></blockquote>
<p>baz</p>
05_01__container_blocks__block_quotes__023:
canonical: |
<blockquote>
@ -3071,6 +3180,7 @@
</blockquote>
wysiwyg: |-
<blockquote multiline="false"><pre class="content-editor-code-block undefined code highlight"><code>code</code></pre></blockquote>
<blockquote multiline="false"><p>not code</p></blockquote>
05_02__container_blocks__list_items__001:
canonical: |
<p>A paragraph
@ -3093,6 +3203,8 @@
wysiwyg: |-
<p>A paragraph
with two lines.</p>
<pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre>
<blockquote multiline="false"><p>A block quote.</p></blockquote>
05_02__container_blocks__list_items__002:
canonical: |
<ol>
@ -3136,6 +3248,7 @@
<p data-sourcepos="3:2-3:4" dir="auto">two</p>
wysiwyg: |-
<ul bullet="*"><li><p>one</p></li></ul>
<p>two</p>
05_02__container_blocks__list_items__004:
canonical: |
<ul>
@ -3170,6 +3283,7 @@
</div>
wysiwyg: |-
<ul bullet="*"><li><p>one</p></li></ul>
<pre class="content-editor-code-block undefined code highlight"><code> two</code></pre>
05_02__container_blocks__list_items__006:
canonical: |
<ul>
@ -3242,6 +3356,7 @@
<p data-sourcepos="3:1-3:5" dir="auto">2.two</p>
wysiwyg: |-
<p>-one</p>
<p>2.two</p>
05_02__container_blocks__list_items__010:
canonical: |
<ul>
@ -3426,6 +3541,8 @@
</div>
wysiwyg: |-
<pre class="content-editor-code-block undefined code highlight"><code>indented code</code></pre>
<p>paragraph</p>
<pre class="content-editor-code-block undefined code highlight"><code>more code</code></pre>
05_02__container_blocks__list_items__021:
canonical: |
<ol>
@ -3489,6 +3606,7 @@
<p data-sourcepos="3:1-3:3" dir="auto">bar</p>
wysiwyg: |-
<p>foo</p>
<p>bar</p>
05_02__container_blocks__list_items__024:
canonical: |
<ul>
@ -3502,6 +3620,7 @@
<p data-sourcepos="3:3-3:5" dir="auto">bar</p>
wysiwyg: |-
<ul bullet="*"><li><p>foo</p></li></ul>
<p>bar</p>
05_02__container_blocks__list_items__025:
canonical: |
<ul>
@ -3575,6 +3694,7 @@
<p data-sourcepos="3:3-3:5" dir="auto">foo</p>
wysiwyg: |-
<ul bullet="*"><li><p></p></li></ul>
<p>foo</p>
05_02__container_blocks__list_items__029:
canonical: |
<ul>
@ -3649,6 +3769,8 @@
wysiwyg: |-
<p>foo
*</p>
<p>foo
1.</p>
05_02__container_blocks__list_items__034:
canonical: |
<ol>
@ -3949,6 +4071,7 @@
</ul>
wysiwyg: |-
<ol parens="false"><li><p>foo</p></li></ol>
<ul bullet="*"><li><p>bar</p></li></ul>
05_02__container_blocks__list_items__046:
canonical: |
<ul>
@ -4038,6 +4161,7 @@
</ul>
wysiwyg: |-
<ul bullet="*"><li><p>foo</p></li><li><p>bar</p></li></ul>
<ul bullet="*"><li><p>baz</p></li></ul>
05_04__container_blocks__lists__002:
canonical: |
<ol>
@ -4057,6 +4181,7 @@
</ol>
wysiwyg: |-
<ol parens="false"><li><p>foo</p></li><li><p>bar</p></li></ol>
<ol parens="false"><li><p>baz</p></li></ol>
05_04__container_blocks__lists__003:
canonical: |
<p>Foo</p>
@ -4072,6 +4197,7 @@
</ul>
wysiwyg: |-
<p>Foo</p>
<ul bullet="*"><li><p>bar</p></li><li><p>baz</p></li></ul>
05_04__container_blocks__lists__004:
canonical: |
<p>The number of windows in my house is
@ -4095,6 +4221,7 @@
</ol>
wysiwyg: |-
<p>The number of windows in my house is</p>
<ol parens="false"><li><p>The number of doors is 6.</p></li></ol>
05_04__container_blocks__lists__006:
canonical: |
<ul>
@ -4177,8 +4304,8 @@
<li data-sourcepos="7:1-7:5">bim</li>
</ul>
wysiwyg: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
<ul bullet="*"><li><p>foo</p></li><li><p>bar</p></li></ul>
<ul bullet="*"><li><p>baz</p></li><li><p>bim</p></li></ul>
05_04__container_blocks__lists__009:
canonical: |
<ul>
@ -4209,8 +4336,8 @@
<copy-code></copy-code>
</div>
wysiwyg: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
<ul bullet="*"><li><p>foo</p><p>notcode</p></li><li><p>foo</p></li></ul>
<pre class="content-editor-code-block undefined code highlight"><code>code</code></pre>
05_04__container_blocks__lists__010:
canonical: |
<ul>
@ -4308,6 +4435,7 @@
</div>
wysiwyg: |-
<ol parens="false"><li><p>a</p></li><li><p>b</p></li></ol>
<pre class="content-editor-code-block undefined code highlight"><code>3. c</code></pre>
05_04__container_blocks__lists__014:
canonical: |
<ul>
@ -4894,6 +5022,7 @@
</ul>
wysiwyg: |-
<p>* foo</p>
<ul bullet="*"><li><p>foo</p></li></ul>
06_03__inlines__entity_and_numeric_character_references__015:
canonical: |
<p>foo
@ -6025,6 +6154,7 @@
<p data-sourcepos="3:1-3:16" dir="auto">new paragraph~~.</p>
wysiwyg: |-
<p>This ~~has a</p>
<p>new paragraph~~.</p>
06_07__inlines__links__001:
canonical: |
<p><a href="/uri" title="title">link</a></p>
@ -6158,6 +6288,8 @@
<p data-sourcepos="5:1-5:37" dir="auto"><a href="http://example.com?foo=3#frag" rel="nofollow noreferrer noopener" target="_blank">link</a></p>
wysiwyg: |-
<p><a target="_blank" rel="noopener noreferrer nofollow" href="#fragment">link</a></p>
<p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com#fragment">link</a></p>
<p><a target="_blank" rel="noopener noreferrer nofollow" href="http://example.com?foo=3#frag">link</a></p>
06_07__inlines__links__018:
canonical: |
<p><a href="foo%5Cbar">link</a></p>
@ -6482,6 +6614,7 @@
<p data-sourcepos="3:1-3:12" dir="auto">[ref[]: /uri</p>
wysiwyg: |-
<p>[foo][ref[]</p>
<p>[ref[]: /uri</p>
06_07__inlines__links__063:
canonical: |
<p>[foo][ref[bar]]</p>
@ -6491,6 +6624,7 @@
<p data-sourcepos="3:1-3:16" dir="auto">[ref[bar]]: /uri</p>
wysiwyg: |-
<p>[foo][ref[bar]]</p>
<p>[ref[bar]]: /uri</p>
06_07__inlines__links__064:
canonical: |
<p>[[[foo]]]</p>
@ -6500,6 +6634,7 @@
<p data-sourcepos="3:1-3:15" dir="auto">[[[foo]]]: /url</p>
wysiwyg: |-
<p>[[[foo]]]</p>
<p>[[[foo]]]: /url</p>
06_07__inlines__links__065:
canonical: |
<p><a href="/uri">foo</a></p>
@ -6523,6 +6658,7 @@
<p data-sourcepos="3:1-3:8" dir="auto">[]: /uri</p>
wysiwyg: |-
<p>[]</p>
<p>[]: /uri</p>
06_07__inlines__links__068:
canonical: |
<p>[
@ -6537,6 +6673,8 @@
wysiwyg: |-
<p>[
]</p>
<p>[
]: /uri</p>
06_07__inlines__links__069:
canonical: |
<p><a href="/url" title="title">foo</a></p>
@ -6811,6 +6949,7 @@
<p data-sourcepos="3:1-3:21" dir="auto">[[foo]]: /url "title"</p>
wysiwyg: |-
<p>![[foo]]</p>
<p>[[foo]]: /url "title"</p>
06_08__inlines__images__020:
canonical: |
<p><img src="/url" alt="Foo" title="title" /></p>
@ -6988,6 +7127,7 @@
<p data-sourcepos="3:1-3:29" dir="auto">Visit <a href="http://www.commonmark.org/a.b" rel="nofollow noreferrer noopener" target="_blank">www.commonmark.org/a.b</a>.</p>
wysiwyg: |-
<p>Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org">www.commonmark.org</a>.</p>
<p>Visit <a target="_blank" rel="noopener noreferrer nofollow" href="http://www.commonmark.org/a.b">www.commonmark.org/a.b</a>.</p>
06_10__inlines__autolinks_extension__004:
canonical: |
<p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
@ -7001,6 +7141,9 @@
<p data-sourcepos="7:1-7:42" dir="auto">(<a href="http://www.google.com/search?q=Markup+(business)" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=Markup+(business)</a></p>
wysiwyg: |-
<p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
<p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>))</p>
<p>(<a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a>)</p>
<p>(<a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)</a></p>
06_10__inlines__autolinks_extension__005:
canonical: |
<p><a href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok</a></p>
@ -7017,6 +7160,7 @@
<p data-sourcepos="3:1-3:38" dir="auto"><a href="http://www.google.com/search?q=commonmark" rel="nofollow noreferrer noopener" target="_blank">www.google.com/search?q=commonmark</a>&amp;hl;</p>
wysiwyg: |-
<p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=commonmark&amp;hl=en">www.google.com/search?q=commonmark&amp;hl=en</a></p>
<p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=commonmark">www.google.com/search?q=commonmark</a>&amp;hl;</p>
06_10__inlines__autolinks_extension__007:
canonical: |
<p><a href="http://www.commonmark.org/he">www.commonmark.org/he</a>&lt;lp</p>
@ -7035,6 +7179,8 @@
<p data-sourcepos="5:1-5:48" dir="auto">Anonymous FTP is available at <a href="ftp://foo.bar.baz/">ftp://foo.bar.baz</a>.</p>
wysiwyg: |-
<p><a target="_blank" rel="noopener noreferrer nofollow" href="http://commonmark.org">http://commonmark.org</a></p>
<p>(Visit <a target="_blank" rel="noopener noreferrer nofollow" href="https://encrypted.google.com/search?q=Markup+(business)">https://encrypted.google.com/search?q=Markup+(business)</a>)</p>
<p>Anonymous FTP is available at ftp://foo.bar.baz.</p>
06_10__inlines__autolinks_extension__009:
canonical: |
<p><a href="mailto:foo@bar.baz">foo@bar.baz</a></p>
@ -7062,6 +7208,9 @@
<p data-sourcepos="7:1-7:12" dir="auto">a.b-c_d@a.b_</p>
wysiwyg: |-
<p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a></p>
<p><a target="_blank" rel="noopener noreferrer nofollow" href="mailto:a.b-c_d@a.b">a.b-c_d@a.b</a>.</p>
<p>a.b-c_d@a.b-</p>
<p>a.b-c_d@a.b_</p>
06_11__inlines__raw_html__001:
canonical: |
<p><a><bab><c2c></p>
@ -7164,8 +7313,7 @@
static: |-
<p data-sourcepos="1:1-2:25" dir="auto">foo </p>
wysiwyg: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
<p>foo </p>
06_11__inlines__raw_html__014:
canonical: |
<p>foo &lt;!-- not a comment -- two hyphens --&gt;</p>
@ -7182,30 +7330,28 @@
<p data-sourcepos="3:1-3:16" dir="auto">foo &lt;!-- foo---&gt;</p>
wysiwyg: |-
<p>foo &lt;!--&gt; foo --&gt;</p>
<p>foo &lt;!-- foo---&gt;</p>
06_11__inlines__raw_html__016:
canonical: |
<p>foo <?php echo $a; ?></p>
static: |-
<p data-sourcepos="1:1-1:21" dir="auto">foo <?php echo $a; ?></p>
wysiwyg: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
<p>foo </p>
06_11__inlines__raw_html__017:
canonical: |
<p>foo <!ELEMENT br EMPTY></p>
static: |-
<p data-sourcepos="1:1-1:23" dir="auto">foo &lt;!ELEMENT br EMPTY&gt;</p>
wysiwyg: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
<p>foo </p>
06_11__inlines__raw_html__018:
canonical: |
<p>foo <![CDATA[>&<]]></p>
static: |-
<p data-sourcepos="1:1-1:19" dir="auto">foo &lt;![CDATA[&gt;&amp;&lt;]]&gt;</p>
wysiwyg: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
<p>foo &amp;&lt;]]&gt;</p>
06_11__inlines__raw_html__019:
canonical: |
<p>foo <a href="&ouml;"></p>
@ -7240,6 +7386,7 @@
&lt;/blockquote&gt;</strong></p>
wysiwyg: |-
<p></p>
<blockquote multiline="false"><p></p></blockquote>
06_13__inlines__hard_line_breaks__001:
canonical: |
<p>foo<br />
@ -7412,13 +7559,14 @@
07_01__gitlab_specific_markdown__footnotes__001:
canonical: ""
static: |-
<p data-sourcepos="1:1-1:27" dir="auto">footnote reference tag <sup class="footnote-ref"><a href="#fn-1-4719" id="fnref-1-4719" data-footnote-ref>1</a></sup></p>
<p data-sourcepos="1:1-1:27" dir="auto">footnote reference tag <sup class="footnote-ref"><a href="#fn-1-9470" id="fnref-1-9470" data-footnote-ref>1</a></sup></p>
<section data-footnotes class="footnotes">
<ol>
<li id="fn-1-4719">
<p data-sourcepos="3:7-3:19">footnote text <a href="#fnref-1-4719" data-footnote-backref aria-label="Back to content" class="footnote-backref"><gl-emoji title="leftwards arrow with hook" data-name="leftwards_arrow_with_hook" data-unicode-version="1.1">↩</gl-emoji></a></p>
<li id="fn-1-9470">
<p data-sourcepos="3:7-3:19">footnote text <a href="#fnref-1-9470" data-footnote-backref aria-label="Back to content" class="footnote-backref"><gl-emoji title="leftwards arrow with hook" data-name="leftwards_arrow_with_hook" data-unicode-version="1.1">↩</gl-emoji></a></p>
</li>
</ol>
</section>
wysiwyg: |-
<p>footnote reference tag <sup identifier="1">1</sup></p>
<div node="footnoteDefinition(paragraph(&quot;footnote text&quot;))" htmlattributes="[object Object]"><p>footnote text</p></div>

View File

@ -3463,8 +3463,34 @@
]
}
04_06__leaf_blocks__html_blocks__029: |-
Error - check implementation:
Cannot read properties of undefined (reading 'wrapper')
{
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "*bar*\n"
}
]
},
{
"type": "paragraph",
"content": [
{
"type": "text",
"marks": [
{
"type": "italic"
}
],
"text": "baz"
}
]
}
]
}
04_06__leaf_blocks__html_blocks__030: |-
{
"type": "doc",
@ -3481,11 +3507,44 @@
]
}
04_06__leaf_blocks__html_blocks__031: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
{
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "okay"
}
]
}
]
}
04_06__leaf_blocks__html_blocks__032: |-
Error - check implementation:
Cannot read properties of undefined (reading 'wrapper')
{
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "';\n\n?>\n"
}
]
},
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "okay"
}
]
}
]
}
04_06__leaf_blocks__html_blocks__033: |-
{
"type": "doc",
@ -3496,11 +3555,39 @@
]
}
04_06__leaf_blocks__html_blocks__034: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
{
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "okay"
}
]
}
]
}
04_06__leaf_blocks__html_blocks__035: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
{
"type": "doc",
"content": [
{
"type": "codeBlock",
"attrs": {
"language": null,
"class": "code highlight"
},
"content": [
{
"type": "text",
"text": "<!-- foo -->"
}
]
}
]
}
04_06__leaf_blocks__html_blocks__036: |-
{
"type": "doc",
@ -8782,11 +8869,147 @@
]
}
05_04__container_blocks__lists__008: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
{
"type": "doc",
"content": [
{
"type": "bulletList",
"attrs": {
"bullet": "*"
},
"content": [
{
"type": "listItem",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "foo"
}
]
}
]
},
{
"type": "listItem",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "bar"
}
]
}
]
}
]
},
{
"type": "bulletList",
"attrs": {
"bullet": "*"
},
"content": [
{
"type": "listItem",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "baz"
}
]
}
]
},
{
"type": "listItem",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "bim"
}
]
}
]
}
]
}
]
}
05_04__container_blocks__lists__009: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
{
"type": "doc",
"content": [
{
"type": "bulletList",
"attrs": {
"bullet": "*"
},
"content": [
{
"type": "listItem",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "foo"
}
]
},
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "notcode"
}
]
}
]
},
{
"type": "listItem",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "foo"
}
]
}
]
}
]
},
{
"type": "codeBlock",
"attrs": {
"language": null,
"class": "code highlight"
},
"content": [
{
"type": "text",
"text": "code"
}
]
}
]
}
05_04__container_blocks__lists__010: |-
{
"type": "doc",
@ -18374,8 +18597,20 @@
]
}
06_11__inlines__raw_html__013: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
{
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "foo "
}
]
}
]
}
06_11__inlines__raw_html__014: |-
{
"type": "doc",
@ -18416,14 +18651,50 @@
]
}
06_11__inlines__raw_html__016: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
{
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "foo "
}
]
}
]
}
06_11__inlines__raw_html__017: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
{
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "foo "
}
]
}
]
}
06_11__inlines__raw_html__018: |-
Error - check implementation:
Cannot destructure property 'className' of 'hastNode.properties' as it is undefined.
{
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "foo &<]]>"
}
]
}
]
}
06_11__inlines__raw_html__019: |-
{
"type": "doc",

View File

@ -11501,6 +11501,9 @@ msgstr ""
msgid "DAST Configuration"
msgstr ""
msgid "DAST configuration not found"
msgstr ""
msgid "DAST profile not found: %{name}"
msgstr ""
@ -12337,6 +12340,12 @@ msgstr ""
msgid "Delete project"
msgstr ""
msgid "Delete release"
msgstr ""
msgid "Delete release %{release}?"
msgstr ""
msgid "Delete row"
msgstr ""
@ -12394,6 +12403,15 @@ msgstr ""
msgid "DeleteProject|Failed to remove wiki repository. Please try again or contact administrator."
msgstr ""
msgid "DeleteRelease|Are you sure you want to delete this release?"
msgstr ""
msgid "DeleteRelease|For more details, see %{docsPathStart}Deleting a release%{docsPathEnd}."
msgstr ""
msgid "DeleteRelease|You are about to delete release %{release} and its assets. The Git tag %{tag} will not be deleted."
msgstr ""
msgid "DeleteValueStream|'%{name}' Value Stream deleted"
msgstr ""
@ -32081,6 +32099,9 @@ msgid_plural "Releases"
msgstr[0] ""
msgstr[1] ""
msgid "Release %{deletedRelease} has been successfully deleted."
msgstr ""
msgid "Release assets"
msgstr ""
@ -32153,6 +32174,9 @@ msgstr ""
msgid "Release|Something went wrong while creating a new release."
msgstr ""
msgid "Release|Something went wrong while deleting the release."
msgstr ""
msgid "Release|Something went wrong while getting the release details."
msgstr ""
@ -44360,9 +44384,6 @@ msgstr ""
msgid "You cannot combine replace_ids with add_ids or remove_ids"
msgstr ""
msgid "You cannot edit this timeline event."
msgstr ""
msgid "You cannot impersonate a blocked user"
msgstr ""

View File

@ -51,8 +51,8 @@
"@babel/preset-env": "^7.18.2",
"@gitlab/at.js": "1.5.7",
"@gitlab/favicon-overlay": "2.0.0",
"@gitlab/svgs": "2.27.0",
"@gitlab/ui": "42.20.0",
"@gitlab/svgs": "2.28.0",
"@gitlab/ui": "42.22.0",
"@gitlab/visual-review-tools": "1.7.3",
"@rails/actioncable": "6.1.4-7",
"@rails/ujs": "6.1.4-7",

View File

@ -1010,6 +1010,46 @@ _Paragraph 2_
_Paragraph 2_`,
},
/* TODO
* Implement proper editing support for HTML comments in the Content Editor
* https://gitlab.com/gitlab-org/gitlab/-/issues/342173
*/
{
markdown: '<!-- HTML comment -->',
expectedDoc: doc(paragraph()),
expectedMarkdown: '',
},
{
markdown: `
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then {
return 1;
} else {
return 0;
}
}
]]>
`,
expectedDoc: doc(paragraph()),
expectedMarkdown: '',
},
{
markdown: `
<!-- foo -->*bar*
*baz*
`,
expectedDoc: doc(
paragraph(source('*bar*'), '*bar*\n'),
paragraph(source('*baz*'), italic(source('*baz*'), 'baz')),
),
expectedMarkdown: `*bar*
*baz*`,
},
];
const runOnly = examples.find((example) => example.only === true);
@ -1023,7 +1063,7 @@ _Paragraph 2_`,
expect(expectedDoc).not.toBeFalsy();
expect(document.toJSON()).toEqual(expectedDoc.toJSON());
expect(serialize(document)).toEqual(expectedMarkdown || trimmed);
expect(serialize(document)).toEqual(expectedMarkdown ?? trimmed);
},
);

View File

@ -91,7 +91,9 @@ async function renderMarkdownToHTMLAndJSON(markdown, schema, deserializer) {
const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(
prosemirrorDocument.content,
);
const htmlString = documentFragment.firstChild.outerHTML;
const htmlString = Array.from(documentFragment.children)
.map((el) => el.outerHTML)
.join('\n');
const json = prosemirrorDocument.toJSON();
const jsonString = JSON.stringify(json, null, 2);

View File

@ -550,98 +550,74 @@ describe('issue_comment_form component', () => {
});
describe('confidential notes checkbox', () => {
describe('when confidentialNotes feature flag is `false`', () => {
const features = { confidentialNotes: false };
it('should render checkbox as unchecked by default', () => {
mountComponent({
mountFunction: mount,
initialData: { note: 'confidential note' },
noteableData: { ...notableDataMockCanUpdateIssuable },
});
it('should not render checkbox', () => {
const checkbox = findConfidentialNoteCheckbox();
expect(checkbox.exists()).toBe(true);
expect(checkbox.element.checked).toBe(false);
});
it.each`
noteableType | rendered | message
${'Issue'} | ${true} | ${'render'}
${'Epic'} | ${true} | ${'render'}
${'MergeRequest'} | ${false} | ${'not render'}
`(
'should $message checkbox when noteableType is $noteableType',
({ noteableType, rendered }) => {
mountComponent({
mountFunction: mount,
noteableType,
initialData: { note: 'internal note' },
noteableData: { ...notableDataMockCanUpdateIssuable, noteableType },
});
expect(findConfidentialNoteCheckbox().exists()).toBe(rendered);
},
);
describe.each`
shouldCheckboxBeChecked
${true}
${false}
`('when checkbox value is `$shouldCheckboxBeChecked`', ({ shouldCheckboxBeChecked }) => {
it(`sets \`confidential\` to \`${shouldCheckboxBeChecked}\``, async () => {
mountComponent({
mountFunction: mount,
initialData: { note: 'confidential note' },
noteableData: { ...notableDataMockCanUpdateIssuable },
features,
});
jest.spyOn(wrapper.vm, 'saveNote').mockResolvedValue({});
const checkbox = findConfidentialNoteCheckbox();
expect(checkbox.exists()).toBe(false);
// check checkbox
checkbox.element.checked = shouldCheckboxBeChecked;
checkbox.trigger('change');
await nextTick();
// submit comment
findCommentButton().trigger('click');
const [providedData] = wrapper.vm.saveNote.mock.calls[0];
expect(providedData.data.note.confidential).toBe(shouldCheckboxBeChecked);
});
});
describe('when confidentialNotes feature flag is `true`', () => {
const features = { confidentialNotes: true };
it('should render checkbox as unchecked by default', () => {
describe('when user cannot update issuable', () => {
it('should not render checkbox', () => {
mountComponent({
mountFunction: mount,
initialData: { note: 'confidential note' },
noteableData: { ...notableDataMockCanUpdateIssuable },
features,
noteableData: { ...notableDataMockCannotUpdateIssuable },
});
const checkbox = findConfidentialNoteCheckbox();
expect(checkbox.exists()).toBe(true);
expect(checkbox.element.checked).toBe(false);
});
it.each`
noteableType | rendered | message
${'Issue'} | ${true} | ${'render'}
${'Epic'} | ${true} | ${'render'}
${'MergeRequest'} | ${false} | ${'not render'}
`(
'should $message checkbox when noteableType is $noteableType',
({ noteableType, rendered }) => {
mountComponent({
mountFunction: mount,
noteableType,
initialData: { note: 'internal note' },
noteableData: { ...notableDataMockCanUpdateIssuable, noteableType },
features,
});
expect(findConfidentialNoteCheckbox().exists()).toBe(rendered);
},
);
describe.each`
shouldCheckboxBeChecked
${true}
${false}
`('when checkbox value is `$shouldCheckboxBeChecked`', ({ shouldCheckboxBeChecked }) => {
it(`sets \`confidential\` to \`${shouldCheckboxBeChecked}\``, async () => {
mountComponent({
mountFunction: mount,
initialData: { note: 'confidential note' },
noteableData: { ...notableDataMockCanUpdateIssuable },
features,
});
jest.spyOn(wrapper.vm, 'saveNote').mockResolvedValue({});
const checkbox = findConfidentialNoteCheckbox();
// check checkbox
checkbox.element.checked = shouldCheckboxBeChecked;
checkbox.trigger('change');
await nextTick();
// submit comment
findCommentButton().trigger('click');
const [providedData] = wrapper.vm.saveNote.mock.calls[0];
expect(providedData.data.note.confidential).toBe(shouldCheckboxBeChecked);
});
});
describe('when user cannot update issuable', () => {
it('should not render checkbox', () => {
mountComponent({
mountFunction: mount,
noteableData: { ...notableDataMockCannotUpdateIssuable },
features,
});
expect(findConfidentialNoteCheckbox().exists()).toBe(false);
});
expect(findConfidentialNoteCheckbox().exists()).toBe(false);
});
});
});

View File

@ -269,6 +269,7 @@ Object {
"name": "The first release",
"releasedAt": 2018-12-10T00:00:00.000Z,
"tagName": "v1.1",
"tagPath": "/releases-namespace/releases-project/-/tags/v1.1",
},
}
`;

View File

@ -11,6 +11,7 @@ import setWindowLocation from 'helpers/set_window_location_helper';
import { TEST_HOST } from 'helpers/test_constants';
import ReleaseEditNewApp from '~/releases/components/app_edit_new.vue';
import AssetLinksForm from '~/releases/components/asset_links_form.vue';
import ConfirmDeleteModal from '~/releases/components/confirm_delete_modal.vue';
import { BACK_URL_PARAM } from '~/releases/constants';
import MarkdownField from '~/vue_shared/components/markdown/field.vue';
@ -43,6 +44,7 @@ describe('Release edit/new component', () => {
initializeRelease: jest.fn(),
saveRelease: jest.fn(),
addEmptyAssetLink: jest.fn(),
deleteRelease: jest.fn(),
};
getters = {
@ -287,4 +289,31 @@ describe('Release edit/new component', () => {
});
});
});
describe('delete', () => {
const findConfirmDeleteModal = () => wrapper.findComponent(ConfirmDeleteModal);
it('calls the deleteRelease action on confirmation', async () => {
await factory();
findConfirmDeleteModal().vm.$emit('delete');
expect(actions.deleteRelease).toHaveBeenCalled();
});
it('is hidden if this is a new release', async () => {
await factory({
store: {
modules: {
editNew: {
state: {
isExistingRelease: false,
},
},
},
},
});
expect(findConfirmDeleteModal().exists()).toBe(false);
});
});
});

View File

@ -8,6 +8,7 @@ import waitForPromises from 'helpers/wait_for_promises';
import allReleasesQuery from '~/releases/graphql/queries/all_releases.query.graphql';
import createFlash from '~/flash';
import { historyPushState } from '~/lib/utils/common_utils';
import { sprintf, __ } from '~/locale';
import ReleasesIndexApp from '~/releases/components/app_index.vue';
import ReleaseBlock from '~/releases/components/release_block.vue';
import ReleaseSkeletonLoader from '~/releases/components/release_skeleton_loader.vue';
@ -15,6 +16,7 @@ import ReleasesEmptyState from '~/releases/components/releases_empty_state.vue';
import ReleasesPagination from '~/releases/components/releases_pagination.vue';
import ReleasesSort from '~/releases/components/releases_sort.vue';
import { PAGE_SIZE, CREATED_ASC, DEFAULT_SORT } from '~/releases/constants';
import { deleteReleaseSessionKey } from '~/releases/util';
Vue.use(VueApollo);
@ -44,6 +46,7 @@ describe('app_index.vue', () => {
let singleRelease;
let noReleases;
let queryMock;
let toast;
const createComponent = ({
singleResponse = Promise.resolve(singleRelease),
@ -58,12 +61,17 @@ describe('app_index.vue', () => {
],
]);
toast = jest.fn();
wrapper = shallowMountExtended(ReleasesIndexApp, {
apolloProvider,
provide: {
newReleasePath,
projectPath,
},
mocks: {
$toast: { show: toast },
},
});
};
@ -395,4 +403,27 @@ describe('app_index.vue', () => {
},
);
});
describe('after deleting', () => {
const release = 'fake release';
const key = deleteReleaseSessionKey(projectPath);
beforeEach(async () => {
window.sessionStorage.setItem(key, release);
await createComponent();
});
it('shows a toast', async () => {
expect(toast).toHaveBeenCalledWith(
sprintf(__('Release %{release} has been successfully deleted.'), {
release,
}),
);
});
it('clears session storage', async () => {
expect(window.sessionStorage.getItem(key)).toBe(null);
});
});
});

View File

@ -0,0 +1,89 @@
import Vue, { nextTick } from 'vue';
import Vuex from 'vuex';
import { GlModal } from '@gitlab/ui';
import originalOneReleaseForEditingQueryResponse from 'test_fixtures/graphql/releases/graphql/queries/one_release_for_editing.query.graphql.json';
import { convertOneReleaseGraphQLResponse } from '~/releases/util';
import ConfirmDeleteModal from '~/releases/components/confirm_delete_modal.vue';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import { __, sprintf } from '~/locale';
Vue.use(Vuex);
const release = convertOneReleaseGraphQLResponse(originalOneReleaseForEditingQueryResponse).data;
const deleteReleaseDocsPath = 'path/to/delete/release/docs';
describe('~/releases/components/confirm_delete_modal.vue', () => {
let wrapper;
let state;
const factory = async () => {
state = {
release,
deleteReleaseDocsPath,
};
const store = new Vuex.Store({
modules: {
editNew: {
namespaced: true,
state,
},
},
});
wrapper = mountExtended(ConfirmDeleteModal, {
store,
});
await nextTick();
};
beforeEach(() => {
factory();
});
afterEach(() => {
wrapper.destroy();
});
describe('button', () => {
it('should open the modal on click', async () => {
await wrapper.findByRole('button', { name: 'Delete' }).trigger('click');
const title = wrapper.findByText(
sprintf(__('Delete release %{release}?'), { release: release.name }),
);
expect(title.exists()).toBe(true);
});
});
describe('modal', () => {
beforeEach(async () => {
await wrapper.findByRole('button', { name: 'Delete' }).trigger('click');
});
it('confirms the user wants to delete the release', () => {
const text = wrapper.findByText(__('Are you sure you want to delete this release?'));
expect(text.exists()).toBe(true);
});
it('links to the tag', () => {
const tagPath = wrapper.findByRole('link', { name: release.tagName });
expect(tagPath.attributes('href')).toBe(release.tagPath);
});
it('links to the docs on deleting releases', () => {
const docsPath = wrapper.findByRole('link', { name: 'Deleting a release' });
expect(docsPath.attributes('href')).toBe(deleteReleaseDocsPath);
});
it('emits a delete event on action primary', () => {
wrapper.findComponent(GlModal).vm.$emit('primary');
expect(wrapper.emitted('delete')).toEqual([[]]);
});
});
});

View File

@ -9,10 +9,15 @@ import { ASSET_LINK_TYPE } from '~/releases/constants';
import createReleaseAssetLinkMutation from '~/releases/graphql/mutations/create_release_link.mutation.graphql';
import deleteReleaseAssetLinkMutation from '~/releases/graphql/mutations/delete_release_link.mutation.graphql';
import updateReleaseMutation from '~/releases/graphql/mutations/update_release.mutation.graphql';
import deleteReleaseMutation from '~/releases/graphql/mutations/delete_release.mutation.graphql';
import * as actions from '~/releases/stores/modules/edit_new/actions';
import * as types from '~/releases/stores/modules/edit_new/mutation_types';
import createState from '~/releases/stores/modules/edit_new/state';
import { gqClient, convertOneReleaseGraphQLResponse } from '~/releases/util';
import {
gqClient,
convertOneReleaseGraphQLResponse,
deleteReleaseSessionKey,
} from '~/releases/util';
jest.mock('~/api/tags_api');
@ -586,6 +591,133 @@ describe('Release edit/new actions', () => {
});
});
describe('deleteRelease', () => {
let getters;
let dispatch;
let commit;
let release;
beforeEach(() => {
getters = {
releaseDeleteMutationVariables: {
input: {
projectPath: 'test-org/test',
tagName: 'v1.0',
},
},
};
release = convertOneReleaseGraphQLResponse(releaseResponse).data;
setupState({
release,
originalRelease: release,
...getters,
});
dispatch = jest.fn();
commit = jest.fn();
gqClient.mutate.mockResolvedValue({
data: {
releaseDelete: {
errors: [],
},
releaseAssetLinkDelete: {
errors: [],
},
},
});
});
describe('when the delete is successful', () => {
beforeEach(() => {
window.sessionStorage.clear();
});
it('dispatches receiveSaveReleaseSuccess', async () => {
await actions.deleteRelease({ commit, dispatch, state, getters });
expect(dispatch.mock.calls).toEqual([
['receiveSaveReleaseSuccess', state.releasesPagePath],
]);
});
it('deletes the release', async () => {
await actions.deleteRelease({ commit, dispatch, state, getters });
expect(gqClient.mutate.mock.calls[0]).toEqual([
{
mutation: deleteReleaseMutation,
variables: getters.releaseDeleteMutationVariables,
},
]);
});
it('stores the name for toasting', async () => {
await actions.deleteRelease({ commit, dispatch, state, getters });
expect(window.sessionStorage.getItem(deleteReleaseSessionKey(state.projectPath))).toBe(
state.release.name,
);
});
});
describe('when the delete request fails', () => {
beforeEach(() => {
gqClient.mutate.mockRejectedValue(error);
});
it('dispatches requestDeleteRelease and receiveSaveReleaseError with an error object', async () => {
await actions.deleteRelease({ commit, dispatch, state, getters });
expect(commit.mock.calls).toContainEqual([types.RECEIVE_SAVE_RELEASE_ERROR, error]);
});
it('shows a flash message', async () => {
await actions.deleteRelease({ commit, dispatch, state, getters });
expect(createFlash).toHaveBeenCalledTimes(1);
expect(createFlash).toHaveBeenCalledWith({
message: 'Something went wrong while deleting the release.',
});
});
});
describe('when the delete returns errors', () => {
beforeEach(() => {
gqClient.mutate.mockResolvedValue({
data: {
releaseUpdate: {
errors: ['Something went wrong!'],
},
releaseAssetLinkDelete: {
errors: [],
},
releaseAssetLinkCreate: {
errors: [],
},
},
});
});
it('dispatches requestDeleteRelease and receiveSaveReleaseError with an error object', async () => {
await actions.deleteRelease({ commit, dispatch, state, getters });
expect(commit.mock.calls).toContainEqual([
types.RECEIVE_SAVE_RELEASE_ERROR,
expect.any(Error),
]);
});
it('shows a flash message', async () => {
await actions.deleteRelease({ commit, dispatch, state, getters });
expect(createFlash).toHaveBeenCalledTimes(1);
expect(createFlash).toHaveBeenCalledWith({
message: 'Something went wrong while deleting the release.',
});
});
});
});
describe('fetchTagNotes', () => {
const tagName = 'v8.0.0';

View File

@ -369,6 +369,26 @@ describe('Release edit/new getters', () => {
});
});
describe('releaseDeleteMutationVariables', () => {
it('returns all the data needed for the releaseDelete GraphQL mutation', () => {
const state = {
projectPath: 'test-org/test',
release: { tagName: 'v1.0' },
};
const expectedVariables = {
input: {
projectPath: 'test-org/test',
tagName: 'v1.0',
},
};
const actualVariables = getters.releaseDeleteMutationVariables(state);
expect(actualVariables).toEqual(expectedVariables);
});
});
describe('formattedReleaseNotes', () => {
it.each`
description | includeTagNotes | tagNotes | included

View File

@ -65,7 +65,8 @@ RSpec.describe ReleasesHelper do
manage_milestones_path
new_milestone_path
upcoming_release_docs_path
edit_release_docs_path)
edit_release_docs_path
delete_release_docs_path)
expect(helper.data_for_edit_release_page.keys).to match_array(keys)
end

View File

@ -4,7 +4,7 @@ require 'spec_helper'
RSpec.describe '0_log_deprecations' do
def setup_other_deprecations
Warning.process(__FILE__) { :raise }
Warning.process(__FILE__) { :default }
end
def load_initializer
@ -20,11 +20,14 @@ RSpec.describe '0_log_deprecations' do
end
after do
# reset state changed by initializer
Warning.clear
ActiveSupport::Notifications.unsubscribe('deprecation.rails')
end
around do |example|
# reset state changed by initializer
Warning.clear(&example)
end
describe 'Ruby deprecations' do
context 'when catching deprecations through Kernel#warn' do
it 'also logs them to deprecation logger' do

View File

@ -174,8 +174,8 @@ RSpec.describe ProjectMember do
expect { project.destroy! }.to change { user.can?(:guest_access, project) }.from(true).to(false)
end
it 'refreshes the authorization without calling AuthorizedProjectUpdate::ProjectRecalculatePerUserService' do
expect(AuthorizedProjectUpdate::ProjectRecalculatePerUserService).not_to receive(:new)
it 'refreshes the authorization without calling AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker' do
expect(AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker).not_to receive(:bulk_perform_and_wait)
project.destroy!
end
@ -199,7 +199,7 @@ RSpec.describe ProjectMember do
context 'when importing' do
it 'does not refresh' do
expect(AuthorizedProjectUpdate::ProjectRecalculatePerUserService).not_to receive(:new)
expect(AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker).not_to receive(:bulk_perform_and_wait)
member = build(:project_member)
member.importing = true
@ -212,11 +212,11 @@ RSpec.describe ProjectMember do
let_it_be(:project) { create(:project) }
let_it_be(:user) { create(:user) }
shared_examples_for 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserService to recalculate authorizations' do
it 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserService' do
expect_next_instance_of(AuthorizedProjectUpdate::ProjectRecalculatePerUserService, project, user) do |service|
expect(service).to receive(:execute)
end
shared_examples_for 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker inline to recalculate authorizations' do
it 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker' do
expect(AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker).to receive(:bulk_perform_and_wait).with(
[[project.id, user.id]]
)
action
end
@ -242,7 +242,7 @@ RSpec.describe ProjectMember do
expect { action }.to change { user.can?(:guest_access, project) }.from(false).to(true)
end
it_behaves_like 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserService to recalculate authorizations'
it_behaves_like 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker inline to recalculate authorizations'
it_behaves_like 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations'
end
@ -257,7 +257,7 @@ RSpec.describe ProjectMember do
expect { action }.to change { user.can?(:developer_access, project) }.from(false).to(true)
end
it_behaves_like 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserService to recalculate authorizations'
it_behaves_like 'calls AuthorizedProjectUpdate::ProjectRecalculatePerUserWorker inline to recalculate authorizations'
it_behaves_like 'calls AuthorizedProjectUpdate::UserRefreshFromReplicaWorker with a delay to update project authorizations'
end

View File

@ -0,0 +1,60 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe IncidentManagement::TimelineEventPolicy, models: true do
let_it_be(:project) { create(:project) }
let_it_be(:reporter) { create(:user) }
let_it_be(:developer) { create(:user) }
let_it_be(:user) { developer }
let_it_be(:incident) { create(:incident, project: project, author: user) }
let_it_be(:editable_timeline_event) do
create(:incident_management_timeline_event, :editable, project: project, author: user, incident: incident)
end
let_it_be(:non_editable_timeline_event) do
create(:incident_management_timeline_event, :non_editable, project: project, author: user, incident: incident)
end
before do
project.add_developer(developer)
project.add_reporter(reporter)
end
describe '#rules' do
subject(:policies) { described_class.new(user, timeline_event) }
context 'when a user is not able to manage timeline events' do
let_it_be(:user) { reporter }
context 'when timeline event is editable' do
let(:timeline_event) { editable_timeline_event }
it 'does not allow to edit the timeline event' do
is_expected.not_to be_allowed(:edit_incident_management_timeline_event)
end
end
end
context 'when a user is able to manage timeline events' do
let_it_be(:user) { developer }
context 'when timeline event is editable' do
let(:timeline_event) { editable_timeline_event }
it 'allows to edit the timeline event' do
is_expected.to be_allowed(:edit_incident_management_timeline_event)
end
end
context 'when timeline event is not editable' do
let(:timeline_event) { non_editable_timeline_event }
it 'does not allow to edit the timeline event' do
is_expected.not_to be_allowed(:edit_incident_management_timeline_event)
end
end
end
end
end

View File

@ -361,7 +361,7 @@ RSpec.describe API::Invitations do
users = create_list(:user, 5)
unresolved_n_plus_ones = 116 # 51 for 1 vs 167 for 5 - currently there are 29 queries added per user
unresolved_n_plus_ones = 136 # 54 for 1 vs 190 for 5 - currently there are 34 queries added per user
expect do
post invitations_url(project, maintainer), params: { user_id: users.map(&:id).join(','), access_level: Member::DEVELOPER }

View File

@ -3239,7 +3239,7 @@ RSpec.describe API::Projects do
measure_project.add_developer(create(:user))
measure_project.add_developer(create(:user)) # make this 2nd one to find any n+1
unresolved_n_plus_ones = 21 # 21 queries added per member
unresolved_n_plus_ones = 27 # 27 queries added per member
expect do
post api("/projects/#{project.id}/import_project_members/#{measure_project.id}", user)

View File

@ -146,7 +146,8 @@ RSpec.describe IncidentManagement::TimelineEvents::UpdateService do
create(:incident_management_timeline_event, :non_editable, project: project, incident: incident)
end
it_behaves_like 'error response', 'You cannot edit this timeline event.'
it_behaves_like 'error response',
'You have insufficient permissions to manage timeline events for this incident'
end
end
@ -155,7 +156,8 @@ RSpec.describe IncidentManagement::TimelineEvents::UpdateService do
project.add_reporter(user)
end
it_behaves_like 'error response', 'You have insufficient permissions to manage timeline events for this incident'
it_behaves_like 'error response',
'You have insufficient permissions to manage timeline events for this incident'
end
end
end

View File

@ -0,0 +1,10 @@
dast:
stage: dast
image:
name: "$SECURE_ANALYZERS_PREFIX/dast:$DAST_VERSION"
variables:
GIT_STRATEGY: none
allow_failure: true
dast_configuration:
site_profile: "site_profile_name_included"
scanner_profile: "scanner_profile_name_included"

View File

@ -1048,15 +1048,15 @@
stylelint-declaration-strict-value "1.8.0"
stylelint-scss "4.2.0"
"@gitlab/svgs@2.27.0":
version "2.27.0"
resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-2.27.0.tgz#563aaa8e059ca50c3fd2c39e077bba4951b6c850"
integrity sha512-/Pc8PueTGJbQRB4AhJGyYOM3Ak09oqbXCykLU8cLd41NTbTPdvcXo7QwG76fFL83HkxrrAPJeSnbCMsme5CVKQ==
"@gitlab/svgs@2.28.0":
version "2.28.0"
resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-2.28.0.tgz#a22ad2a4716db18af993d544a628d1d1f128aa7e"
integrity sha512-V1CO91bcYVYuYiYrc6EV02BEzutp06SclzRtC6CRvGoz8mf+qEh7L25a7GxpJyW7hbLo+xajY+IJYhKNmB/qVg==
"@gitlab/ui@42.20.0":
version "42.20.0"
resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-42.20.0.tgz#1eebc8ac23debff8606a11c679c4d2e5b6cb7d01"
integrity sha512-ZkbXXObG3R0U5yMC53c+PWmTqSQWibY935szSDB39Qc3VAIF++XEnFmrSKQI79DcmsbeeUvtdgrLx9W5AC4RAQ==
"@gitlab/ui@42.22.0":
version "42.22.0"
resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-42.22.0.tgz#22102109cbe64884fbbc69993f1c517962d78bae"
integrity sha512-I5n8FeRRgLVyj4FpnXbUUBElTHH1yhCyNarSwcf/qIeR4LeZIOm7Dm5wLAahUlGsStaq0SXlBguImtTRL7Re+g==
dependencies:
"@popperjs/core" "^2.11.2"
bootstrap-vue "2.20.1"