diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-07-18 12:08:41 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-07-18 12:08:41 +0000 |
commit | 5c5d24f032b67d98452f391192386e330a0f880c (patch) | |
tree | 9e58d94388f63cb825e426fea2c4929740604768 | |
parent | 5ccb67600c63549774a28811d177dd673e6dd4d0 (diff) | |
download | gitlab-ce-5c5d24f032b67d98452f391192386e330a0f880c.tar.gz |
Add latest changes from gitlab-org/gitlab@master
77 files changed, 1254 insertions, 313 deletions
diff --git a/.rubocop_todo/cop/user_admin.yml b/.rubocop_todo/cop/user_admin.yml index ab5f76a002d..c9eed57e74d 100644 --- a/.rubocop_todo/cop/user_admin.yml +++ b/.rubocop_todo/cop/user_admin.yml @@ -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 diff --git a/.rubocop_todo/gitlab/feature_available_usage.yml b/.rubocop_todo/gitlab/feature_available_usage.yml index 99a3ef03e4e..92aad8b990e 100644 --- a/.rubocop_todo/gitlab/feature_available_usage.yml +++ b/.rubocop_todo/gitlab/feature_available_usage.yml @@ -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 diff --git a/.rubocop_todo/gitlab/namespaced_class.yml b/.rubocop_todo/gitlab/namespaced_class.yml index 16727389a31..e41736e8b5f 100644 --- a/.rubocop_todo/gitlab/namespaced_class.yml +++ b/.rubocop_todo/gitlab/namespaced_class.yml @@ -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' diff --git a/.rubocop_todo/layout/argument_alignment.yml b/.rubocop_todo/layout/argument_alignment.yml index c9270224a0c..1977bedd143 100644 --- a/.rubocop_todo/layout/argument_alignment.yml +++ b/.rubocop_todo/layout/argument_alignment.yml @@ -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' diff --git a/.rubocop_todo/layout/hash_alignment.yml b/.rubocop_todo/layout/hash_alignment.yml index 2796d4dec4a..d6772537f47 100644 --- a/.rubocop_todo/layout/hash_alignment.yml +++ b/.rubocop_todo/layout/hash_alignment.yml @@ -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' diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml index 5154aa02c2e..810b5e1dffe 100644 --- a/.rubocop_todo/layout/line_length.yml +++ b/.rubocop_todo/layout/line_length.yml @@ -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' diff --git a/.rubocop_todo/layout/multiline_operation_indentation.yml b/.rubocop_todo/layout/multiline_operation_indentation.yml index a00d759482a..51ecf97d318 100644 --- a/.rubocop_todo/layout/multiline_operation_indentation.yml +++ b/.rubocop_todo/layout/multiline_operation_indentation.yml @@ -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' diff --git a/.rubocop_todo/layout/space_inside_parens.yml b/.rubocop_todo/layout/space_inside_parens.yml index 14a5fffa417..1ba43d3b019 100644 --- a/.rubocop_todo/layout/space_inside_parens.yml +++ b/.rubocop_todo/layout/space_inside_parens.yml @@ -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' diff --git a/.rubocop_todo/naming/rescued_exceptions_variable_name.yml b/.rubocop_todo/naming/rescued_exceptions_variable_name.yml index f6416bed902..b557ca8f06e 100644 --- a/.rubocop_todo/naming/rescued_exceptions_variable_name.yml +++ b/.rubocop_todo/naming/rescued_exceptions_variable_name.yml @@ -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' diff --git a/.rubocop_todo/rails/pluck.yml b/.rubocop_todo/rails/pluck.yml index 860b772d913..5e875daa569 100644 --- a/.rubocop_todo/rails/pluck.yml +++ b/.rubocop_todo/rails/pluck.yml @@ -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' diff --git a/.rubocop_todo/rails/squished_sql_heredocs.yml b/.rubocop_todo/rails/squished_sql_heredocs.yml index dc71b7b32ce..3696f661893 100644 --- a/.rubocop_todo/rails/squished_sql_heredocs.yml +++ b/.rubocop_todo/rails/squished_sql_heredocs.yml @@ -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' diff --git a/.rubocop_todo/rails/time_zone.yml b/.rubocop_todo/rails/time_zone.yml index 48e559312f8..8931b337ce1 100644 --- a/.rubocop_todo/rails/time_zone.yml +++ b/.rubocop_todo/rails/time_zone.yml @@ -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 diff --git a/.rubocop_todo/rspec/any_instance_of.yml b/.rubocop_todo/rspec/any_instance_of.yml index 49699f09787..2cc2478e530 100644 --- a/.rubocop_todo/rspec/any_instance_of.yml +++ b/.rubocop_todo/rspec/any_instance_of.yml @@ -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 diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml index 7becad56886..a51ba5e930b 100644 --- a/.rubocop_todo/rspec/context_wording.yml +++ b/.rubocop_todo/rspec/context_wording.yml @@ -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' diff --git a/.rubocop_todo/rspec/expect_change.yml b/.rubocop_todo/rspec/expect_change.yml index ef8897100e3..b08830bd5a3 100644 --- a/.rubocop_todo/rspec/expect_change.yml +++ b/.rubocop_todo/rspec/expect_change.yml @@ -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' diff --git a/.rubocop_todo/rspec/expect_in_hook.yml b/.rubocop_todo/rspec/expect_in_hook.yml index 56b3f48c670..cd73b76b14e 100644 --- a/.rubocop_todo/rspec/expect_in_hook.yml +++ b/.rubocop_todo/rspec/expect_in_hook.yml @@ -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' diff --git a/.rubocop_todo/rspec/multiple_memoized_helpers.yml b/.rubocop_todo/rspec/multiple_memoized_helpers.yml index 2f6d390bec2..8330d768794 100644 --- a/.rubocop_todo/rspec/multiple_memoized_helpers.yml +++ b/.rubocop_todo/rspec/multiple_memoized_helpers.yml @@ -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 diff --git a/.rubocop_todo/rspec/verified_doubles.yml b/.rubocop_todo/rspec/verified_doubles.yml index 420b51316c3..84e862ff48b 100644 --- a/.rubocop_todo/rspec/verified_doubles.yml +++ b/.rubocop_todo/rspec/verified_doubles.yml @@ -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 diff --git a/.rubocop_todo/style/explicit_block_argument.yml b/.rubocop_todo/style/explicit_block_argument.yml index f6bff468c76..e5ce2576f8c 100644 --- a/.rubocop_todo/style/explicit_block_argument.yml +++ b/.rubocop_todo/style/explicit_block_argument.yml @@ -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' diff --git a/.rubocop_todo/style/format_string.yml b/.rubocop_todo/style/format_string.yml index a9065bb5932..caa293b31ae 100644 --- a/.rubocop_todo/style/format_string.yml +++ b/.rubocop_todo/style/format_string.yml @@ -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' diff --git a/.rubocop_todo/style/if_unless_modifier.yml b/.rubocop_todo/style/if_unless_modifier.yml index 845a59a2a14..1dfedcc91c0 100644 --- a/.rubocop_todo/style/if_unless_modifier.yml +++ b/.rubocop_todo/style/if_unless_modifier.yml @@ -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' diff --git a/.rubocop_todo/style/percent_literal_delimiters.yml b/.rubocop_todo/style/percent_literal_delimiters.yml index cd8a41669bb..ecf7a5cf05e 100644 --- a/.rubocop_todo/style/percent_literal_delimiters.yml +++ b/.rubocop_todo/style/percent_literal_delimiters.yml @@ -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' @@ -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 diff --git a/Gemfile.lock b/Gemfile.lock index a9c0338002a..379f4a5d1cf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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) diff --git a/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js b/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js index ad9419699c8..6544cd192f9 100644 --- a/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js +++ b/app/assets/javascripts/content_editor/services/hast_to_prosemirror_converter.js @@ -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; diff --git a/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js b/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js index 9bf130c454e..b3815262639 100644 --- a/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js +++ b/app/assets/javascripts/content_editor/services/remark_markdown_deserializer.js @@ -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 () => { diff --git a/app/assets/javascripts/notes/components/comment_form.vue b/app/assets/javascripts/notes/components/comment_form.vue index e7ac27c5e3e..bd5945a951b 100644 --- a/app/assets/javascripts/notes/components/comment_form.vue +++ b/app/assets/javascripts/notes/components/comment_form.vue @@ -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" diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/file_sha.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/file_sha.vue index a25839be7e1..b91af19d623 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/file_sha.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/file_sha.vue @@ -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> diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue index 9e700a5236f..a049b0eff8d 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_files.vue @@ -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 }"> diff --git a/app/assets/javascripts/packages_and_registries/package_registry/constants.js b/app/assets/javascripts/packages_and_registries/package_registry/constants.js index 3c090951b7d..cea053992f8 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/constants.js +++ b/app/assets/javascripts/packages_and_registries/package_registry/constants.js @@ -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.', diff --git a/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue index 768c8d6478b..29438fba86b 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue @@ -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> diff --git a/app/assets/javascripts/packages_and_registries/shared/constants/package_registry.js b/app/assets/javascripts/packages_and_registries/shared/constants/package_registry.js index afc72a2c627..5505205cf33 100644 --- a/app/assets/javascripts/packages_and_registries/shared/constants/package_registry.js +++ b/app/assets/javascripts/packages_and_registries/shared/constants/package_registry.js @@ -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'; diff --git a/app/assets/javascripts/releases/components/app_edit_new.vue b/app/assets/javascripts/releases/components/app_edit_new.vue index fc59a90c979..022c3224bb4 100644 --- a/app/assets/javascripts/releases/components/app_edit_new.vue +++ b/app/assets/javascripts/releases/components/app_edit_new.vue @@ -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> diff --git a/app/assets/javascripts/releases/components/app_index.vue b/app/assets/javascripts/releases/components/app_index.vue index a949a9d1318..d63a83d1a08 100644 --- a/app/assets/javascripts/releases/components/app_index.vue +++ b/app/assets/javascripts/releases/components/app_index.vue @@ -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(); diff --git a/app/assets/javascripts/releases/components/confirm_delete_modal.vue b/app/assets/javascripts/releases/components/confirm_delete_modal.vue new file mode 100644 index 00000000000..aa948fbbaf6 --- /dev/null +++ b/app/assets/javascripts/releases/components/confirm_delete_modal.vue @@ -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> diff --git a/app/assets/javascripts/releases/graphql/fragments/release_for_editing.fragment.graphql b/app/assets/javascripts/releases/graphql/fragments/release_for_editing.fragment.graphql index f6ed9a8317c..3ad66afa259 100644 --- a/app/assets/javascripts/releases/graphql/fragments/release_for_editing.fragment.graphql +++ b/app/assets/javascripts/releases/graphql/fragments/release_for_editing.fragment.graphql @@ -4,6 +4,7 @@ fragment ReleaseForEditing on Release { tagName description releasedAt + tagPath assets { links { nodes { diff --git a/app/assets/javascripts/releases/graphql/mutations/delete_release.mutation.graphql b/app/assets/javascripts/releases/graphql/mutations/delete_release.mutation.graphql new file mode 100644 index 00000000000..7a8bf9944a3 --- /dev/null +++ b/app/assets/javascripts/releases/graphql/mutations/delete_release.mutation.graphql @@ -0,0 +1,5 @@ +mutation deleteRelease($input: ReleaseDeleteInput!) { + releaseDelete(input: $input) { + errors + } +} diff --git a/app/assets/javascripts/releases/mount_index.js b/app/assets/javascripts/releases/mount_index.js index afb8ab461cd..8e806f0e8d7 100644 --- a/app/assets/javascripts/releases/mount_index.js +++ b/app/assets/javascripts/releases/mount_index.js @@ -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( diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js index f5f7eacbbc3..a71a8125d65 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/actions.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/actions.js @@ -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.'), + }); + }); +}; diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/getters.js b/app/assets/javascripts/releases/stores/modules/edit_new/getters.js index c2b1f9b0f6b..62d6bd42d51 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/getters.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/getters.js @@ -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` diff --git a/app/assets/javascripts/releases/stores/modules/edit_new/state.js b/app/assets/javascripts/releases/stores/modules/edit_new/state.js index 972fc0b3174..cb447cf9aaf 100644 --- a/app/assets/javascripts/releases/stores/modules/edit_new/state.js +++ b/app/assets/javascripts/releases/stores/modules/edit_new/state.js @@ -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. diff --git a/app/assets/javascripts/releases/util.js b/app/assets/javascripts/releases/util.js index 21aad4d716e..f1f5f4bca4c 100644 --- a/app/assets/javascripts/releases/util.js +++ b/app/assets/javascripts/releases/util.js @@ -133,3 +133,5 @@ export const convertOneReleaseGraphQLResponse = (response) => { return { data: release }; }; + +export const deleteReleaseSessionKey = (projectPath) => `deleteRelease:${projectPath}`; diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index ad7a4498664..f1c9e2b2653 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -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?) diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 6794278eb96..a2f018c013b 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -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) diff --git a/app/helpers/releases_helper.rb b/app/helpers/releases_helper.rb index 186f2a74d42..50089c7edab 100644 --- a/app/helpers/releases_helper.rb +++ b/app/helpers/releases_helper.rb @@ -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 diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 2c0977043f4..7f9697d0424 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -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) } diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb index d1c7d7c9097..c97f00364fd 100644 --- a/app/models/members/project_member.rb +++ b/app/models/members/project_member.rb @@ -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 diff --git a/app/policies/incident_management/timeline_event_policy.rb b/app/policies/incident_management/timeline_event_policy.rb index 514a2bf0a56..d8c3b283cd0 100644 --- a/app/policies/incident_management/timeline_event_policy.rb +++ b/app/policies/incident_management/timeline_event_policy.rb @@ -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 diff --git a/app/services/incident_management/timeline_events/update_service.rb b/app/services/incident_management/timeline_events/update_service.rb index 83497b123dd..8217c8125c2 100644 --- a/app/services/incident_management/timeline_events/update_service.rb +++ b/app/services/incident_management/timeline_events/update_service.rb @@ -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 diff --git a/app/views/dashboard/todos/_todo.html.haml b/app/views/dashboard/todos/_todo.html.haml index c932b416b66..8d82116bf10 100644 --- a/app/views/dashboard/todos/_todo.html.haml +++ b/app/views/dashboard/todos/_todo.html.haml @@ -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') diff --git a/config/feature_flags/development/confidential_notes.yml b/config/feature_flags/development/confidential_notes.yml deleted file mode 100644 index 8c7197d2ef9..00000000000 --- a/config/feature_flags/development/confidential_notes.yml +++ /dev/null @@ -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 diff --git a/doc/api/deployments.md b/doc/api/deployments.md index fb255bfa226..6831f86e4ea 100644 --- a/doc/api/deployments.md +++ b/doc/api/deployments.md @@ -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" diff --git a/doc/ci/variables/index.md b/doc/ci/variables/index.md index 37057359c29..72df8d56815 100644 --- a/doc/ci/variables/index.md +++ b/doc/ci/variables/index.md @@ -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. diff --git a/doc/user/discussions/index.md b/doc/user/discussions/index.md index 2fec4440724..1f34d182718 100644 --- a/doc/user/discussions/index.md +++ b/doc/user/discussions/index.md @@ -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: diff --git a/doc/user/project/releases/index.md b/doc/user/project/releases/index.md index 9c22009feb4..1d448ca5c94 100644 --- a/doc/user/project/releases/index.md +++ b/doc/user/project/releases/index.md @@ -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. diff --git a/glfm_specification/example_snapshots/html.yml b/glfm_specification/example_snapshots/html.yml index 8544d1bc172..6fef78c797f 100644 --- a/glfm_specification/example_snapshots/html.yml +++ b/glfm_specification/example_snapshots/html.yml @@ -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"/></p> wysiwyg: |- <h2>`Foo</h2> + <p>`</p> + <h2><a title="a lot</h2> + <p>of dashes"/></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>> 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 @@ ?> <p data-sourcepos="6:1-6:4" dir="auto">okay</p> wysiwyg: |- - Error - check implementation: - Cannot read properties of undefined (reading 'wrapper') + <p>'; + + ?> + </p> + <p>okay</p> 04_06__leaf_blocks__html_blocks__033: canonical: | <!DOCTYPE html> @@ -1918,8 +1994,7 @@ ]]> <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\"><!-- foo --></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><!-- foo --></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><td> Hi </td></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"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>&hl;</p> wysiwyg: |- <p><a target="_blank" rel="noopener noreferrer nofollow" href="http://www.google.com/search?q=commonmark&hl=en">www.google.com/search?q=commonmark&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>&hl;</p> 06_10__inlines__autolinks_extension__007: canonical: | <p><a href="http://www.commonmark.org/he">www.commonmark.org/he</a><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 <!-- not a comment -- two hyphens --></p> @@ -7182,30 +7330,28 @@ <p data-sourcepos="3:1-3:16" dir="auto">foo <!-- foo---></p> wysiwyg: |- <p>foo <!--> foo --></p> + <p>foo <!-- foo---></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 <!ELEMENT br EMPTY></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 <![CDATA[>&<]]></p> wysiwyg: |- - Error - check implementation: - Cannot destructure property 'className' of 'hastNode.properties' as it is undefined. + <p>foo &<]]></p> 06_11__inlines__raw_html__019: canonical: | <p>foo <a href="ö"></p> @@ -7240,6 +7386,7 @@ </blockquote></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("footnote text"))" htmlattributes="[object Object]"><p>footnote text</p></div> diff --git a/glfm_specification/example_snapshots/prosemirror_json.yml b/glfm_specification/example_snapshots/prosemirror_json.yml index f0bc20ca1ed..736728586bb 100644 --- a/glfm_specification/example_snapshots/prosemirror_json.yml +++ b/glfm_specification/example_snapshots/prosemirror_json.yml @@ -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", diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 3e66a2ff730..df30e10058f 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -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 "" diff --git a/package.json b/package.json index 163667ec7c6..9a698f1c85a 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/spec/frontend/content_editor/remark_markdown_processing_spec.js b/spec/frontend/content_editor/remark_markdown_processing_spec.js index 42cb077a51c..d74646449a6 100644 --- a/spec/frontend/content_editor/remark_markdown_processing_spec.js +++ b/spec/frontend/content_editor/remark_markdown_processing_spec.js @@ -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); }, ); diff --git a/spec/frontend/content_editor/render_html_and_json_for_all_examples.js b/spec/frontend/content_editor/render_html_and_json_for_all_examples.js index 31bddceb48b..116a26cf7d5 100644 --- a/spec/frontend/content_editor/render_html_and_json_for_all_examples.js +++ b/spec/frontend/content_editor/render_html_and_json_for_all_examples.js @@ -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); diff --git a/spec/frontend/notes/components/comment_form_spec.js b/spec/frontend/notes/components/comment_form_spec.js index 116016ecae2..463787c148b 100644 --- a/spec/frontend/notes/components/comment_form_spec.js +++ b/spec/frontend/notes/components/comment_form_spec.js @@ -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, - initialData: { note: 'confidential note' }, - noteableData: { ...notableDataMockCanUpdateIssuable }, - features, + noteableType, + initialData: { note: 'internal note' }, + noteableData: { ...notableDataMockCanUpdateIssuable, noteableType }, }); - const checkbox = findConfidentialNoteCheckbox(); - expect(checkbox.exists()).toBe(false); - }); - }); - - describe('when confidentialNotes feature flag is `true`', () => { - const features = { confidentialNotes: true }; + expect(findConfidentialNoteCheckbox().exists()).toBe(rendered); + }, + ); - it('should render checkbox as unchecked by default', () => { + 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, }); - const checkbox = findConfidentialNoteCheckbox(); - expect(checkbox.exists()).toBe(true); - expect(checkbox.element.checked).toBe(false); - }); + jest.spyOn(wrapper.vm, 'saveNote').mockResolvedValue({}); - 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(); + const checkbox = findConfidentialNoteCheckbox(); - // check checkbox - checkbox.element.checked = shouldCheckboxBeChecked; - checkbox.trigger('change'); - await nextTick(); + // check checkbox + checkbox.element.checked = shouldCheckboxBeChecked; + checkbox.trigger('change'); + await nextTick(); - // submit comment - findCommentButton().trigger('click'); + // submit comment + findCommentButton().trigger('click'); - const [providedData] = wrapper.vm.saveNote.mock.calls[0]; - expect(providedData.data.note.confidential).toBe(shouldCheckboxBeChecked); - }); + 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); + describe('when user cannot update issuable', () => { + it('should not render checkbox', () => { + mountComponent({ + mountFunction: mount, + noteableData: { ...notableDataMockCannotUpdateIssuable }, }); + + expect(findConfidentialNoteCheckbox().exists()).toBe(false); }); }); }); diff --git a/spec/frontend/releases/__snapshots__/util_spec.js.snap b/spec/frontend/releases/__snapshots__/util_spec.js.snap index 0bf0ef1ded4..90a33152877 100644 --- a/spec/frontend/releases/__snapshots__/util_spec.js.snap +++ b/spec/frontend/releases/__snapshots__/util_spec.js.snap @@ -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", }, } `; diff --git a/spec/frontend/releases/components/app_edit_new_spec.js b/spec/frontend/releases/components/app_edit_new_spec.js index bccb0849800..cb044b9e891 100644 --- a/spec/frontend/releases/components/app_edit_new_spec.js +++ b/spec/frontend/releases/components/app_edit_new_spec.js @@ -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); + }); + }); }); diff --git a/spec/frontend/releases/components/app_index_spec.js b/spec/frontend/releases/components/app_index_spec.js index 63ce4c8bb17..f64f07de90e 100644 --- a/spec/frontend/releases/components/app_index_spec.js +++ b/spec/frontend/releases/components/app_index_spec.js @@ -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); + }); + }); }); diff --git a/spec/frontend/releases/components/confirm_delete_modal_spec.js b/spec/frontend/releases/components/confirm_delete_modal_spec.js new file mode 100644 index 00000000000..f7c526c1ced --- /dev/null +++ b/spec/frontend/releases/components/confirm_delete_modal_spec.js @@ -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([[]]); + }); + }); +}); diff --git a/spec/frontend/releases/stores/modules/detail/actions_spec.js b/spec/frontend/releases/stores/modules/detail/actions_spec.js index c7ee214013f..ce3b690213c 100644 --- a/spec/frontend/releases/stores/modules/detail/actions_spec.js +++ b/spec/frontend/releases/stores/modules/detail/actions_spec.js @@ -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'; diff --git a/spec/frontend/releases/stores/modules/detail/getters_spec.js b/spec/frontend/releases/stores/modules/detail/getters_spec.js index 2fb38e6ec1a..4ac6eaebaa2 100644 --- a/spec/frontend/releases/stores/modules/detail/getters_spec.js +++ b/spec/frontend/releases/stores/modules/detail/getters_spec.js @@ -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 diff --git a/spec/helpers/releases_helper_spec.rb b/spec/helpers/releases_helper_spec.rb index 4a7bbffc52d..59a92c067f4 100644 --- a/spec/helpers/releases_helper_spec.rb +++ b/spec/helpers/releases_helper_spec.rb @@ -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 diff --git a/spec/initializers/0_log_deprecations_spec.rb b/spec/initializers/0_log_deprecations_spec.rb index 44b277fa9c5..f5065126eaf 100644 --- a/spec/initializers/0_log_deprecations_spec.rb +++ b/spec/initializers/0_log_deprecations_spec.rb @@ -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 diff --git a/spec/models/members/project_member_spec.rb b/spec/models/members/project_member_spec.rb index 48798d419e8..39d9d25a98c 100644 --- a/spec/models/members/project_member_spec.rb +++ b/spec/models/members/project_member_spec.rb @@ -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 diff --git a/spec/policies/incident_management/timeline_event_policy_spec.rb b/spec/policies/incident_management/timeline_event_policy_spec.rb new file mode 100644 index 00000000000..5a659054d7a --- /dev/null +++ b/spec/policies/incident_management/timeline_event_policy_spec.rb @@ -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 diff --git a/spec/requests/api/invitations_spec.rb b/spec/requests/api/invitations_spec.rb index 1a191c9eb92..53154aef21e 100644 --- a/spec/requests/api/invitations_spec.rb +++ b/spec/requests/api/invitations_spec.rb @@ -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 } diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 34d1b333588..ae689d7327b 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -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) diff --git a/spec/services/incident_management/timeline_events/update_service_spec.rb b/spec/services/incident_management/timeline_events/update_service_spec.rb index 3da533fb2a6..728f2fa3e9d 100644 --- a/spec/services/incident_management/timeline_events/update_service_spec.rb +++ b/spec/services/incident_management/timeline_events/update_service_spec.rb @@ -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 diff --git a/spec/support/gitlab_stubs/gitlab_ci_dast_includes.yml b/spec/support/gitlab_stubs/gitlab_ci_dast_includes.yml new file mode 100644 index 00000000000..583d44c452e --- /dev/null +++ b/spec/support/gitlab_stubs/gitlab_ci_dast_includes.yml @@ -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"
\ No newline at end of file diff --git a/yarn.lock b/yarn.lock index ec6cbe098a0..32a29584586 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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/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/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.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" |