diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 4d2477c199d..05b96a6b88a 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -11,11 +11,6 @@ Gitlab/PolicyRuleBoolean:
Exclude:
- 'ee/app/policies/ee/identity_provider_policy.rb'
-# Offense count: 41
-# Cop supports --auto-correct.
-Performance/ConstantRegexp:
- Enabled: false
-
# Offense count: 1428
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
@@ -34,11 +29,6 @@ RSpec/PredicateMatcher:
RSpec/RepeatedExampleGroupBody:
Enabled: false
-# Offense count: 610
-# Cop supports --auto-correct.
-RSpec/ScatteredLet:
- Enabled: false
-
# Offense count: 26
# Cop supports --auto-correct.
# Configuration parameters: Include.
@@ -78,11 +68,6 @@ Rails/CreateTableWithTimestamps:
Rails/HasManyOrHasOneDependent:
Enabled: false
-# Offense count: 47
-# Cop supports --auto-correct.
-Rails/IndexWith:
- Enabled: false
-
# Offense count: 118
# Configuration parameters: Include.
# Include: app/models/**/*.rb
@@ -116,13 +101,6 @@ Rails/WhereExists:
Style/AccessorGrouping:
Enabled: false
-# Offense count: 188
-# Cop supports --auto-correct.
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: percent_q, bare_percent
-Style/BarePercentLiterals:
- Enabled: false
-
# Offense count: 42
# Cop supports --auto-correct.
Style/CaseLikeIf:
@@ -158,8 +136,3 @@ Style/Lambda:
# Cop supports --auto-correct.
Style/RedundantRegexpEscape:
Enabled: false
-
-# Offense count: 53
-# Cop supports --auto-correct.
-Style/RescueModifier:
- Enabled: false
diff --git a/.rubocop_todo/database/multiple_databases.yml b/.rubocop_todo/database/multiple_databases.yml
index 08ce72f7f51..1d0085e1ba6 100644
--- a/.rubocop_todo/database/multiple_databases.yml
+++ b/.rubocop_todo/database/multiple_databases.yml
@@ -2,7 +2,6 @@
Database/MultipleDatabases:
Exclude:
- 'config/initializers/active_record_data_types.rb'
- - 'config/initializers/sidekiq.rb'
- 'db/post_migrate/20210317104032_set_iteration_cadence_automatic_to_false.rb'
- 'db/post_migrate/20210811122206_update_external_project_bots.rb'
- 'db/post_migrate/20210812013042_remove_duplicate_project_authorizations.rb'
@@ -10,10 +9,6 @@ Database/MultipleDatabases:
- 'lib/backup/manager.rb'
- 'lib/gitlab/background_migration/backfill_projects_with_coverage.rb'
- 'lib/gitlab/background_migration/copy_ci_builds_columns_to_security_scans.rb'
- - 'lib/gitlab/database.rb'
- - 'lib/gitlab/database/load_balancing/load_balancer.rb'
- - 'lib/gitlab/database/migrations/observers/query_log.rb'
- - 'lib/tasks/gitlab/db/validate_config.rake'
- 'spec/db/schema_spec.rb'
- 'spec/initializers/database_config_spec.rb'
- 'spec/lib/backup/manager_spec.rb'
diff --git a/.rubocop_todo/performance/constant_regexp.yml b/.rubocop_todo/performance/constant_regexp.yml
new file mode 100644
index 00000000000..fb2b7d6ef49
--- /dev/null
+++ b/.rubocop_todo/performance/constant_regexp.yml
@@ -0,0 +1,32 @@
+---
+# Cop supports --auto-correct.
+Performance/ConstantRegexp:
+ # Offense count: 46
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/commit.rb'
+ - 'app/models/commit_range.rb'
+ - 'app/models/custom_emoji.rb'
+ - 'app/models/gpg_key.rb'
+ - 'app/models/merge_request.rb'
+ - 'app/models/project.rb'
+ - 'app/models/wiki.rb'
+ - 'ee/app/models/ee/epic.rb'
+ - 'lib/banzai/filter/custom_emoji_filter.rb'
+ - 'lib/gitlab/cleanup/project_uploads.rb'
+ - 'lib/gitlab/database/reindexing/reindex_concurrently.rb'
+ - 'lib/gitlab/dependency_linker/base_linker.rb'
+ - 'lib/gitlab/dependency_linker/composer_json_linker.rb'
+ - 'lib/gitlab/dependency_linker/godeps_json_linker.rb'
+ - 'lib/gitlab/dependency_linker/podspec_linker.rb'
+ - 'lib/gitlab/git.rb'
+ - 'lib/gitlab/job_waiter.rb'
+ - 'lib/gitlab/metrics/dashboard/url.rb'
+ - 'lib/gitlab/path_regex.rb'
+ - 'lib/gitlab/regex.rb'
+ - 'scripts/perf/query_limiting_report.rb'
+ - 'scripts/validate_migration_schema'
+ - 'spec/models/concerns/token_authenticatable_spec.rb'
+ - 'spec/scripts/lib/glfm/update_specification_spec.rb'
+ - 'spec/services/notes/copy_service_spec.rb'
diff --git a/.rubocop_todo/rails/index_with.yml b/.rubocop_todo/rails/index_with.yml
new file mode 100644
index 00000000000..09339d3fd56
--- /dev/null
+++ b/.rubocop_todo/rails/index_with.yml
@@ -0,0 +1,52 @@
+---
+# Cop supports --auto-correct.
+Rails/IndexWith:
+ # Offense count: 54
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/helpers/ci/jobs_helper.rb'
+ - 'app/models/ci/build_trace_chunk.rb'
+ - 'app/models/ci/processable.rb'
+ - 'app/models/concerns/cached_commit.rb'
+ - 'app/models/environment.rb'
+ - 'app/services/concerns/rate_limited_service.rb'
+ - 'db/post_migrate/20210731132939_backfill_stage_event_hash.rb'
+ - 'ee/app/models/vulnerabilities/projects_grade.rb'
+ - 'ee/lib/ee/gitlab/usage_data.rb'
+ - 'ee/lib/gitlab/auth/group_saml/auth_hash.rb'
+ - 'ee/lib/gitlab/custom_file_templates.rb'
+ - 'ee/lib/gitlab/insights/reducers/count_per_label_reducer.rb'
+ - 'ee/spec/lib/ee/gitlab/application_context_spec.rb'
+ - 'ee/spec/models/ee/namespace_spec.rb'
+ - 'ee/spec/models/sca/license_compliance_spec.rb'
+ - 'ee/spec/views/admin/dashboard/index.html.haml_spec.rb'
+ - 'lib/api/entities/project_integration.rb'
+ - 'lib/api/helpers/packages/conan/api_helpers.rb'
+ - 'lib/banzai/filter/repository_link_filter.rb'
+ - 'lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url.rb'
+ - 'lib/gitlab/ci/ansi2html.rb'
+ - 'lib/gitlab/ci/reports/security/finding.rb'
+ - 'lib/gitlab/ci/reports/security/identifier.rb'
+ - 'lib/gitlab/ci/reports/test_suite.rb'
+ - 'lib/gitlab/database/count/exact_count_strategy.rb'
+ - 'lib/gitlab/database/migration_helpers.rb'
+ - 'lib/gitlab/database/obsolete_ignored_columns.rb'
+ - 'lib/gitlab/issuable_metadata.rb'
+ - 'lib/gitlab/template/base_template.rb'
+ - 'lib/gitlab/usage_data.rb'
+ - 'lib/google_api/cloud_platform/client.rb'
+ - 'qa/qa/resource/reusable.rb'
+ - 'scripts/trigger-build.rb'
+ - 'spec/lib/gitlab/api_authentication/sent_through_builder_spec.rb'
+ - 'spec/lib/gitlab/conflict/file_spec.rb'
+ - 'spec/lib/gitlab/import_export/model_configuration_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
+ - 'spec/lib/google_api/cloud_platform/client_spec.rb'
+ - 'spec/lib/learn_gitlab/onboarding_spec.rb'
+ - 'spec/models/event_spec.rb'
+ - 'spec/presenters/projects/security/configuration_presenter_spec.rb'
+ - 'spec/support/database/multiple_databases.rb'
+ - 'spec/support/shared_contexts/services/projects/container_repository/delete_tags_service_shared_context.rb'
+ - 'spec/support/shared_examples/models/concerns/sanitizable_shared_examples.rb'
+ - 'spec/views/admin/dashboard/index.html.haml_spec.rb'
diff --git a/.rubocop_todo/rspec/scattered_let.yml b/.rubocop_todo/rspec/scattered_let.yml
new file mode 100644
index 00000000000..52f19bf0768
--- /dev/null
+++ b/.rubocop_todo/rspec/scattered_let.yml
@@ -0,0 +1,285 @@
+---
+# Cop supports --auto-correct.
+RSpec/ScatteredLet:
+ # Offense count: 720
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'ee/spec/features/groups/group_roadmap_spec.rb'
+ - 'ee/spec/features/merge_trains/two_merge_requests_on_train_spec.rb'
+ - 'ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb'
+ - 'ee/spec/finders/security/vulnerability_reads_finder_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/graphql/mutations/boards/epics/create_spec.rb'
+ - 'ee/spec/graphql/mutations/dast_site_profiles/create_spec.rb'
+ - 'ee/spec/graphql/mutations/merge_requests/accept_spec.rb'
+ - 'ee/spec/graphql/mutations/releases/update_spec.rb'
+ - 'ee/spec/graphql/resolvers/security_orchestration/scan_execution_policy_resolver_spec.rb'
+ - 'ee/spec/graphql/types/boards/board_epic_type_spec.rb'
+ - 'ee/spec/graphql/types/instance_security_dashboard_type_spec.rb'
+ - 'ee/spec/helpers/ee/subscribable_banner_helper_spec.rb'
+ - 'ee/spec/helpers/trial_status_widget_helper_spec.rb'
+ - 'ee/spec/lib/banzai/reference_parser/iteration_parser_spec.rb'
+ - 'ee/spec/lib/ee/audit/compliance_framework_changes_auditor_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/ci/config_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/dast_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/parsers/security/formatters/dependency_list_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_api_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/ci/templates/dast_api_latest_gitlab_ci_yaml_spec.rb'
+ - 'ee/spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb'
+ - 'ee/spec/lib/gitlab/elastic/bulk_indexer_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/repositories_changed_event_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb'
+ - 'ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb'
+ - 'ee/spec/lib/gitlab/git_access_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/security_orchestration_policies/lazy_dast_profile_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/graphql/aggregations/vulnerability_statistics/lazy_aggregate_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/reducers/count_per_label_reducer_spec.rb'
+ - 'ee/spec/lib/gitlab/insights/reducers/label_count_per_period_reducer_spec.rb'
+ - 'ee/spec/lib/gitlab/usage_data_metrics_spec.rb'
+ - 'ee/spec/models/analytics/cycle_analytics/group_level_spec.rb'
+ - 'ee/spec/models/approval_wrapped_any_approver_rule_spec.rb'
+ - 'ee/spec/models/approvals/scan_finding_wrapped_rule_set_spec.rb'
+ - 'ee/spec/models/ci/minutes/notification_spec.rb'
+ - 'ee/spec/models/ci/minutes/quota_spec.rb'
+ - 'ee/spec/models/ci/pipeline_spec.rb'
+ - 'ee/spec/models/ee/ci/build_dependencies_spec.rb'
+ - 'ee/spec/models/ee/namespace/root_storage_size_spec.rb'
+ - 'ee/spec/models/label_note_spec.rb'
+ - 'ee/spec/models/sca/license_compliance_spec.rb'
+ - 'ee/spec/policies/merge_request_policy_spec.rb'
+ - 'ee/spec/requests/api/graphql/compliance_management/merge_requests/compliance_violations_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/ci_cd_settings_spec.rb'
+ - 'ee/spec/requests/api/graphql/group/epic/notes_spec.rb'
+ - 'ee/spec/requests/api/graphql/group_query_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/boards/epic_boards/epic_move_list_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/incident_management/oncall_rotation/update_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/issues/promote_to_epic_spec.rb'
+ - 'ee/spec/requests/api/graphql/mutations/security_policy/commit_scan_execution_policy_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/alert_management/http_integrations_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/dast_profile_schedule_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipeline/dast_profile_spec.rb'
+ - 'ee/spec/requests/api/graphql/project/pipelines/dast_profile_spec.rb'
+ - 'ee/spec/requests/api/internal/base_spec.rb'
+ - 'ee/spec/requests/api/projects_spec.rb'
+ - 'ee/spec/requests/api/vulnerability_findings_spec.rb'
+ - 'ee/spec/requests/git_http_geo_spec.rb'
+ - 'ee/spec/serializers/status_page/incident_serializer_spec.rb'
+ - 'ee/spec/services/app_sec/dast/scanner_profiles/update_service_spec.rb'
+ - 'ee/spec/services/arkose/blocked_users_report_service_spec.rb'
+ - 'ee/spec/services/arkose/user_verification_service_spec.rb'
+ - 'ee/spec/services/audit_event_service_spec.rb'
+ - 'ee/spec/services/audit_events/protected_branch_audit_event_service_spec.rb'
+ - 'ee/spec/services/ee/issue_links/create_service_spec.rb'
+ - 'ee/spec/services/epic_issues/create_service_spec.rb'
+ - 'ee/spec/services/epics/issue_promote_service_spec.rb'
+ - 'ee/spec/services/gitlab_subscriptions/activate_service_spec.rb'
+ - 'ee/spec/services/group_saml/saml_provider/create_service_spec.rb'
+ - 'ee/spec/services/group_saml/saml_provider/update_service_spec.rb'
+ - 'ee/spec/services/groups/memberships/export_service_spec.rb'
+ - 'ee/spec/services/incident_management/escalation_policies/create_service_spec.rb'
+ - 'ee/spec/services/incident_management/oncall_rotations/remove_participant_service_spec.rb'
+ - 'ee/spec/services/merge_request_approval_settings/update_service_spec.rb'
+ - 'ee/spec/services/merge_trains/refresh_service_spec.rb'
+ - 'ee/spec/services/projects/destroy_service_spec.rb'
+ - 'ee/spec/services/projects/prometheus/alerts/notify_service_spec.rb'
+ - 'ee/spec/services/quality_management/test_cases/create_service_spec.rb'
+ - 'ee/spec/services/quick_actions/interpret_service_spec.rb'
+ - 'ee/spec/services/requirements_management/update_requirement_service_spec.rb'
+ - 'ee/spec/services/search/group_service_spec.rb'
+ - 'ee/spec/services/search/project_service_spec.rb'
+ - 'ee/spec/services/todo_service_spec.rb'
+ - 'ee/spec/views/shared/_mirror_update_button.html.haml_spec.rb'
+ - 'ee/spec/views/subscriptions/groups/edit.html.haml_spec.rb'
+ - 'ee/spec/workers/compliance_management/merge_requests/compliance_violations_worker_spec.rb'
+ - 'ee/spec/workers/concerns/update_orchestration_policy_configuration_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_audit_logs_1_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/project/project_audit_logs_spec.rb'
+ - 'spec/controllers/projects/artifacts_controller_spec.rb'
+ - 'spec/controllers/projects/deploy_keys_controller_spec.rb'
+ - 'spec/controllers/projects/environments_controller_spec.rb'
+ - 'spec/controllers/projects/issues_controller_spec.rb'
+ - 'spec/controllers/projects/releases/evidences_controller_spec.rb'
+ - 'spec/controllers/projects/releases_controller_spec.rb'
+ - 'spec/finders/ci/daily_build_group_report_results_finder_spec.rb'
+ - 'spec/finders/concerns/finder_with_cross_project_access_spec.rb'
+ - 'spec/finders/concerns/finder_with_group_hierarchy_spec.rb'
+ - 'spec/finders/events_finder_spec.rb'
+ - 'spec/finders/group_projects_finder_spec.rb'
+ - 'spec/finders/license_template_finder_spec.rb'
+ - 'spec/frontend/fixtures/pipelines.rb'
+ - 'spec/graphql/resolvers/commit_pipelines_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/version_in_collection_resolver_spec.rb'
+ - 'spec/graphql/resolvers/design_management/versions_resolver_spec.rb'
+ - 'spec/graphql/types/ci/job_token_scope_type_spec.rb'
+ - 'spec/helpers/merge_requests_helper_spec.rb'
+ - 'spec/lib/banzai/filter/references/project_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/user_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/upload_link_filter_spec.rb'
+ - 'spec/lib/banzai/reference_parser/alert_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/commit_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/commit_range_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/external_issue_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/label_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/merge_request_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/milestone_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/project_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/snippet_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/user_parser_spec.rb'
+ - 'spec/lib/bulk_imports/projects/pipelines/snippets_repository_pipeline_spec.rb'
+ - 'spec/lib/gitlab/asciidoc/include_processor_spec.rb'
+ - 'spec/lib/gitlab/auth/ldap/person_spec.rb'
+ - 'spec/lib/gitlab/auth/saml/auth_hash_spec.rb'
+ - 'spec/lib/gitlab/background_migration/copy_ci_builds_columns_to_security_scans_spec.rb'
+ - 'spec/lib/gitlab/background_migration/encrypt_static_object_token_spec.rb'
+ - 'spec/lib/gitlab/background_migration/legacy_uploads_migrator_spec.rb'
+ - 'spec/lib/gitlab/background_migration/nullify_orphan_runner_id_on_ci_builds_spec.rb'
+ - 'spec/lib/gitlab/background_migration/update_jira_tracker_data_deployment_type_based_on_url_spec.rb'
+ - 'spec/lib/gitlab/ci/config/external/file/artifact_spec.rb'
+ - 'spec/lib/gitlab/ci/pipeline/chain/helpers_spec.rb'
+ - 'spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb'
+ - 'spec/lib/gitlab/ci/status/stage/factory_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/group_spec.rb'
+ - 'spec/lib/gitlab/ci/variables/builder/project_spec.rb'
+ - 'spec/lib/gitlab/ci/yaml_processor_spec.rb'
+ - 'spec/lib/gitlab/cycle_analytics/stage_summary_spec.rb'
+ - 'spec/lib/gitlab/database/background_migration/batched_migration_wrapper_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/test_batched_background_runner_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning/partition_manager_spec.rb'
+ - 'spec/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers_spec.rb'
+ - 'spec/lib/gitlab/database/postgresql_adapter/empty_query_ping_spec.rb'
+ - 'spec/lib/gitlab/database/reindexing/grafana_notifier_spec.rb'
+ - 'spec/lib/gitlab/diff/file_collection/merge_request_diff_batch_spec.rb'
+ - 'spec/lib/gitlab/diff/formatters/text_formatter_spec.rb'
+ - 'spec/lib/gitlab/diff/position_spec.rb'
+ - 'spec/lib/gitlab/diff/position_tracer/image_strategy_spec.rb'
+ - 'spec/lib/gitlab/diff/position_tracer/line_strategy_spec.rb'
+ - 'spec/lib/gitlab/diff/suggestion_diff_spec.rb'
+ - 'spec/lib/gitlab/diff/suggestion_spec.rb'
+ - 'spec/lib/gitlab/elasticsearch/logs/lines_spec.rb'
+ - 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/processor/context_payload_processor_spec.rb'
+ - 'spec/lib/gitlab/error_tracking_spec.rb'
+ - 'spec/lib/gitlab/git/blame_spec.rb'
+ - 'spec/lib/gitlab/git/diff_collection_spec.rb'
+ - 'spec/lib/gitlab/git_access_spec.rb'
+ - 'spec/lib/gitlab/github_import/parallel_scheduling_spec.rb'
+ - 'spec/lib/gitlab/import_export/group/relation_tree_restorer_spec.rb'
+ - 'spec/lib/gitlab/import_export/project/export_task_spec.rb'
+ - 'spec/lib/gitlab/jira_import/issue_serializer_spec.rb'
+ - 'spec/lib/gitlab/lets_encrypt/client_spec.rb'
+ - 'spec/lib/gitlab/metrics/dashboard/stages/grafana_formatter_spec.rb'
+ - 'spec/lib/gitlab/metrics/subscribers/external_http_spec.rb'
+ - 'spec/lib/gitlab/middleware/memory_report_spec.rb'
+ - 'spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb'
+ - 'spec/lib/gitlab/pagination/keyset/page_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_pagination_spec.rb'
+ - 'spec/lib/gitlab/patch/database_config_spec.rb'
+ - 'spec/lib/gitlab/path_regex_spec.rb'
+ - 'spec/lib/gitlab/prometheus/queries/matched_metric_query_spec.rb'
+ - 'spec/lib/gitlab/serializer/pagination_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/extra_done_log_metadata_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/size_limiter/validator_spec.rb'
+ - 'spec/lib/gitlab/spamcheck/client_spec.rb'
+ - 'spec/lib/gitlab/template/finders/global_template_finder_spec.rb'
+ - 'spec/lib/gitlab/tree_summary_spec.rb'
+ - 'spec/lib/gitlab/usage/service_ping_report_spec.rb'
+ - 'spec/lib/gitlab/usage_data_metrics_spec.rb'
+ - 'spec/lib/gitlab/utils/measuring_spec.rb'
+ - 'spec/lib/gitlab/zentao/client_spec.rb'
+ - 'spec/lib/peek/views/external_http_spec.rb'
+ - 'spec/mailers/emails/in_product_marketing_spec.rb'
+ - 'spec/migrations/20210421163509_schedule_update_jira_tracker_data_deployment_type_based_on_url_spec.rb'
+ - 'spec/migrations/20220329175119_remove_leftover_ci_job_artifact_deletions_spec.rb'
+ - 'spec/models/application_record_spec.rb'
+ - 'spec/models/ci/build_dependencies_spec.rb'
+ - 'spec/models/ci/pipeline_spec.rb'
+ - 'spec/models/concerns/issuable_spec.rb'
+ - 'spec/models/concerns/manual_inverse_association_spec.rb'
+ - 'spec/models/concerns/noteable_spec.rb'
+ - 'spec/models/deploy_keys_project_spec.rb'
+ - 'spec/models/design_management/design_at_version_spec.rb'
+ - 'spec/models/diff_note_spec.rb'
+ - 'spec/models/environment_spec.rb'
+ - 'spec/models/integration_spec.rb'
+ - 'spec/models/merge_request_diff_spec.rb'
+ - 'spec/models/merge_request_spec.rb'
+ - 'spec/models/milestone_spec.rb'
+ - 'spec/models/push_event_spec.rb'
+ - 'spec/models/ssh_host_key_spec.rb'
+ - 'spec/models/user_spec.rb'
+ - 'spec/models/users/credit_card_validation_spec.rb'
+ - 'spec/models/wiki_page_spec.rb'
+ - 'spec/policies/ci/build_policy_spec.rb'
+ - 'spec/policies/design_management/design_policy_spec.rb'
+ - 'spec/policies/group_member_policy_spec.rb'
+ - 'spec/requests/admin/background_migrations_controller_spec.rb'
+ - 'spec/requests/api/ci/pipeline_schedules_spec.rb'
+ - 'spec/requests/api/ci/pipelines_spec.rb'
+ - 'spec/requests/api/commit_statuses_spec.rb'
+ - 'spec/requests/api/graphql/ci/groups_spec.rb'
+ - 'spec/requests/api/graphql/ci/pipelines_spec.rb'
+ - 'spec/requests/api/graphql/mutations/boards/create_spec.rb'
+ - 'spec/requests/api/graphql/namespace/projects_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/design_collection/version_spec.rb'
+ - 'spec/requests/api/graphql/project/issue/design_collection/versions_spec.rb'
+ - 'spec/requests/api/graphql/project/issue_spec.rb'
+ - 'spec/requests/api/graphql/project/milestones_spec.rb'
+ - 'spec/requests/api/graphql/project/pipeline_spec.rb'
+ - 'spec/requests/api/graphql/project/release_spec.rb'
+ - 'spec/requests/api/graphql/user/starred_projects_query_spec.rb'
+ - 'spec/requests/api/issues/get_group_issues_spec.rb'
+ - 'spec/requests/api/issues/get_project_issues_spec.rb'
+ - 'spec/requests/api/issues/post_projects_issues_spec.rb'
+ - 'spec/requests/api/issues/put_projects_issues_spec.rb'
+ - 'spec/requests/api/merge_requests_spec.rb'
+ - 'spec/requests/api/notes_spec.rb'
+ - 'spec/requests/api/project_clusters_spec.rb'
+ - 'spec/requests/api/project_export_spec.rb'
+ - 'spec/requests/api/rubygem_packages_spec.rb'
+ - 'spec/requests/projects/releases_controller_spec.rb'
+ - 'spec/rubocop/cop/migration/update_column_in_batches_spec.rb'
+ - 'spec/scripts/pipeline_test_report_builder_spec.rb'
+ - 'spec/serializers/build_details_entity_spec.rb'
+ - 'spec/serializers/ci/job_entity_spec.rb'
+ - 'spec/serializers/merge_requests/pipeline_entity_spec.rb'
+ - 'spec/services/ci/change_variable_service_spec.rb'
+ - 'spec/services/ci/change_variables_service_spec.rb'
+ - 'spec/services/ci/create_downstream_pipeline_service_spec.rb'
+ - 'spec/services/ci/create_pipeline_service/logger_spec.rb'
+ - 'spec/services/ci/create_pipeline_service_spec.rb'
+ - 'spec/services/ci/destroy_pipeline_service_spec.rb'
+ - 'spec/services/ci/find_exposed_artifacts_service_spec.rb'
+ - 'spec/services/ci/pipeline_bridge_status_service_spec.rb'
+ - 'spec/services/commits/cherry_pick_service_spec.rb'
+ - 'spec/services/design_management/delete_designs_service_spec.rb'
+ - 'spec/services/design_management/save_designs_service_spec.rb'
+ - 'spec/services/discussions/capture_diff_note_positions_service_spec.rb'
+ - 'spec/services/events/destroy_service_spec.rb'
+ - 'spec/services/git/base_hooks_service_spec.rb'
+ - 'spec/services/groups/group_links/update_service_spec.rb'
+ - 'spec/services/jira_import/cloud_users_mapper_service_spec.rb'
+ - 'spec/services/jira_import/server_users_mapper_service_spec.rb'
+ - 'spec/services/lfs/push_service_spec.rb'
+ - 'spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/dynamic_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/gitlab_alert_embed_service_spec.rb'
+ - 'spec/services/metrics/dashboard/grafana_metric_embed_service_spec.rb'
+ - 'spec/services/notification_service_spec.rb'
+ - 'spec/services/packages/composer/create_package_service_spec.rb'
+ - 'spec/services/packages/conan/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/create_package_file_service_spec.rb'
+ - 'spec/services/packages/debian/generate_distribution_key_service_spec.rb'
+ - 'spec/services/packages/debian/update_distribution_service_spec.rb'
+ - 'spec/services/projects/lfs_pointers/lfs_download_link_list_service_spec.rb'
+ - 'spec/services/snippets/create_service_spec.rb'
+ - 'spec/services/spam/spam_verdict_service_spec.rb'
+ - 'spec/services/suggestions/create_service_spec.rb'
+ - 'spec/services/system_notes/design_management_service_spec.rb'
+ - 'spec/services/system_notes/merge_requests_service_spec.rb'
+ - 'spec/services/todo_service_spec.rb'
+ - 'spec/support/shared_examples/graphql/sorted_paginated_query_shared_examples.rb'
+ - 'spec/tasks/gitlab/artifacts/migrate_rake_spec.rb'
+ - 'spec/workers/concerns/gitlab/github_import/object_importer_spec.rb'
+ - 'spec/workers/packages/debian/generate_distribution_worker_spec.rb'
diff --git a/.rubocop_todo/style/bare_percent_literals.yml b/.rubocop_todo/style/bare_percent_literals.yml
new file mode 100644
index 00000000000..658c6c22baa
--- /dev/null
+++ b/.rubocop_todo/style/bare_percent_literals.yml
@@ -0,0 +1,115 @@
+---
+# Cop supports --auto-correct.
+Style/BarePercentLiterals:
+ # Offense count: 220
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/models/commit.rb'
+ - 'app/models/concerns/storage/legacy_namespace.rb'
+ - 'app/models/integrations/datadog.rb'
+ - 'app/services/feature_flags/base_service.rb'
+ - 'app/services/repositories/base_service.rb'
+ - 'app/services/repositories/destroy_rollback_service.rb'
+ - 'app/services/repositories/destroy_service.rb'
+ - 'ee/app/services/jira/jql_builder_service.rb'
+ - 'ee/lib/ee/gitlab/checks/push_rules/file_size_check.rb'
+ - 'ee/spec/features/projects/environments/environments_spec.rb'
+ - 'ee/spec/helpers/subscriptions_helper_spec.rb'
+ - 'ee/spec/lib/banzai/filter/references/iteration_reference_filter_spec.rb'
+ - 'ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb'
+ - 'ee/spec/lib/gitlab/status_page/filter/image_filter_spec.rb'
+ - 'ee/spec/requests/api/ci/jobs_spec.rb'
+ - 'ee/spec/services/geo/container_repository_sync_spec.rb'
+ - 'lib/banzai/filter/autolink_filter.rb'
+ - 'lib/banzai/filter/references/reference_filter.rb'
+ - 'lib/banzai/filter/spaced_link_filter.rb'
+ - 'lib/banzai/filter/table_of_contents_filter.rb'
+ - 'lib/banzai/issuable_extractor.rb'
+ - 'lib/gitlab/authorized_keys.rb'
+ - 'lib/gitlab/etag_caching/middleware.rb'
+ - 'lib/gitlab/etag_caching/router/rails.rb'
+ - 'lib/gitlab/gl_repository/identifier.rb'
+ - 'lib/gitlab/import_export/repo_restorer.rb'
+ - 'lib/kramdown/parser/atlassian_document_format.rb'
+ - 'lib/tasks/tanuki_emoji.rake'
+ - 'qa/qa/ee/page/dashboard/projects.rb'
+ - 'qa/qa/ee/page/group/settings/general.rb'
+ - 'qa/qa/ee/page/project/issue/show.rb'
+ - 'qa/qa/ee/page/project/job/show.rb'
+ - 'qa/qa/ee/page/project/packages/index.rb'
+ - 'qa/qa/ee/page/project/pipeline/show.rb'
+ - 'qa/qa/ee/page/project/show.rb'
+ - 'qa/qa/ee/page/project/snippet/index.rb'
+ - 'qa/qa/ee/page/project/wiki/show.rb'
+ - 'qa/qa/page/component/design_management.rb'
+ - 'qa/qa/page/component/select2.rb'
+ - 'qa/qa/page/element.rb'
+ - 'qa/qa/page/file/form.rb'
+ - 'qa/qa/page/project/web_ide/edit.rb'
+ - 'qa/qa/resource/events/project.rb'
+ - 'qa/qa/resource/members.rb'
+ - 'qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/1_manage/group/group_saml_enforced_sso_new_account_spec.rb'
+ - 'qa/qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb'
+ - 'qa/qa/support/page/logging.rb'
+ - 'qa/spec/runtime/feature_spec.rb'
+ - 'scripts/regenerate-schema'
+ - 'scripts/trigger-build.rb'
+ - 'spec/controllers/import/fogbugz_controller_spec.rb'
+ - 'spec/controllers/projects/artifacts_controller_spec.rb'
+ - 'spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb'
+ - 'spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb'
+ - 'spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb'
+ - 'spec/features/projects/artifacts/user_downloads_artifacts_spec.rb'
+ - 'spec/features/projects/badges/coverage_spec.rb'
+ - 'spec/features/projects/badges/pipeline_badge_spec.rb'
+ - 'spec/features/projects/issuable_templates_spec.rb'
+ - 'spec/features/projects/jobs_spec.rb'
+ - 'spec/features/projects/pipelines/legacy_pipeline_spec.rb'
+ - 'spec/features/projects/pipelines/legacy_pipelines_spec.rb'
+ - 'spec/features/projects/pipelines/pipeline_spec.rb'
+ - 'spec/features/projects/pipelines/pipelines_spec.rb'
+ - 'spec/features/uploads/user_uploads_avatar_to_group_spec.rb'
+ - 'spec/features/uploads/user_uploads_avatar_to_profile_spec.rb'
+ - 'spec/graphql/resolvers/echo_resolver_spec.rb'
+ - 'spec/helpers/markup_helper_spec.rb'
+ - 'spec/lib/banzai/filter/autolink_filter_spec.rb'
+ - 'spec/lib/banzai/filter/external_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/image_link_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/label_reference_filter_spec.rb'
+ - 'spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb'
+ - 'spec/lib/banzai/pipeline/full_pipeline_spec.rb'
+ - 'spec/lib/banzai/pipeline/plain_markdown_pipeline_spec.rb'
+ - 'spec/lib/banzai/reference_parser/commit_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/issue_parser_spec.rb'
+ - 'spec/lib/banzai/reference_parser/merge_request_parser_spec.rb'
+ - 'spec/lib/gitlab/diff/highlight_spec.rb'
+ - 'spec/lib/gitlab/error_tracking/stack_trace_highlight_decorator_spec.rb'
+ - 'spec/lib/gitlab/gfm/reference_rewriter_spec.rb'
+ - 'spec/lib/gitlab/highlight_spec.rb'
+ - 'spec/lib/gitlab/pagination/gitaly_keyset_pager_spec.rb'
+ - 'spec/lib/gitlab/pagination/offset_pagination_spec.rb'
+ - 'spec/lib/gitlab/prometheus/query_variables_spec.rb'
+ - 'spec/lib/gitlab/reference_extractor_spec.rb'
+ - 'spec/lib/gitlab/url_sanitizer_spec.rb'
+ - 'spec/mailers/emails/releases_spec.rb'
+ - 'spec/mailers/emails/service_desk_spec.rb'
+ - 'spec/models/deployment_spec.rb'
+ - 'spec/models/integrations/drone_ci_spec.rb'
+ - 'spec/models/integrations/teamcity_spec.rb'
+ - 'spec/models/project_label_spec.rb'
+ - 'spec/presenters/snippet_blob_presenter_spec.rb'
+ - 'spec/requests/api/ci/job_artifacts_spec.rb'
+ - 'spec/requests/api/deployments_spec.rb'
+ - 'spec/requests/api/graphql/mutations/snippets/destroy_spec.rb'
+ - 'spec/rubocop/cop/gitlab/mark_used_feature_flags_spec.rb'
+ - 'spec/services/prometheus/proxy_variable_substitution_service_spec.rb'
+ - 'spec/support/banzai/reference_filter_shared_examples.rb'
+ - 'spec/support/helpers/graphql_helpers.rb'
+ - 'spec/support/shared_examples/controllers/repository_lfs_file_load_shared_examples.rb'
+ - 'spec/support/shared_examples/features/resolving_discussions_in_issues_shared_examples.rb'
+ - 'spec/support/shared_examples/graphql/label_fields.rb'
+ - 'spec/support/shared_examples/lib/banzai/filters/sanitization_filter_shared_examples.rb'
+ - 'spec/support_specs/matchers/exceed_query_limit_helpers_spec.rb'
+ - 'spec/views/layouts/_head.html.haml_spec.rb'
diff --git a/.rubocop_todo/style/rescue_modifier.yml b/.rubocop_todo/style/rescue_modifier.yml
new file mode 100644
index 00000000000..298ef3aece9
--- /dev/null
+++ b/.rubocop_todo/style/rescue_modifier.yml
@@ -0,0 +1,51 @@
+---
+# Cop supports --auto-correct.
+Style/RescueModifier:
+ # Offense count: 59
+ # Temporarily disabled due to too many offenses
+ Enabled: false
+ Exclude:
+ - 'app/controllers/admin/system_info_controller.rb'
+ - 'app/controllers/users_controller.rb'
+ - 'app/finders/ci/daily_build_group_report_results_finder.rb'
+ - 'app/helpers/blob_helper.rb'
+ - 'app/models/concerns/diff_positionable_note.rb'
+ - 'app/models/integrations/jira.rb'
+ - 'app/models/sent_notification.rb'
+ - 'app/models/todo.rb'
+ - 'app/services/security/ci_configuration/sast_parser_service.rb'
+ - 'config/initializers/active_record_data_types.rb'
+ - 'config/settings.rb'
+ - 'ee/app/models/license.rb'
+ - 'ee/lib/ee/gitlab/background_migration/drop_invalid_remediations.rb'
+ - 'ee/lib/gitlab/geo.rb'
+ - 'ee/lib/gitlab/geo/health_check.rb'
+ - 'lib/api/helpers.rb'
+ - 'lib/feature.rb'
+ - 'lib/gitlab/current_settings.rb'
+ - 'lib/gitlab/dependency_linker/cargo_toml_linker.rb'
+ - 'lib/gitlab/dependency_linker/json_linker.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/import_export/after_export_strategy_builder.rb'
+ - 'lib/gitlab/kubernetes.rb'
+ - 'lib/gitlab/middleware/read_only/controller.rb'
+ - 'lib/gitlab/process_management.rb'
+ - 'lib/gitlab/query_limiting/middleware.rb'
+ - 'lib/gitlab/quick_actions/command_definition.rb'
+ - 'lib/gitlab/quick_actions/spend_time_and_date_separator.rb'
+ - 'lib/gitlab/word_diff/segments/diff_hunk.rb'
+ - 'lib/gitlab/zentao/client.rb'
+ - 'lib/tasks/gitlab/praefect.rake'
+ - 'qa/qa/page/component/access_tokens.rb'
+ - 'qa/qa/page/profile/ssh_keys.rb'
+ - 'spec/finders/concerns/finder_with_cross_project_access_spec.rb'
+ - 'spec/lib/gitlab/database/load_balancing/session_spec.rb'
+ - 'spec/lib/gitlab/database/migrations/instrumentation_spec.rb'
+ - 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
+ - 'spec/lib/gitlab/sidekiq_middleware/monitor_spec.rb'
+ - 'spec/models/concerns/bulk_insert_safe_spec.rb'
+ - 'spec/models/design_management/version_spec.rb'
+ - 'spec/models/group_spec.rb'
+ - 'spec/models/namespace/traversal_hierarchy_spec.rb'
+ - 'spec/services/design_management/delete_designs_service_spec.rb'
+ - 'spec/support/shared_examples/lib/gitlab/config/inheritable_shared_examples.rb'
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index f7c29cb018f..235e115267d 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-60a7383d965aa6a8e69aa2e33a84792cde486cd3
+42fab8fc526215f9426bc9f459f9e6da0951c574
diff --git a/app/assets/javascripts/blob_edit/edit_blob.js b/app/assets/javascripts/blob_edit/edit_blob.js
index ee2f6cfb46c..2ee2e199358 100644
--- a/app/assets/javascripts/blob_edit/edit_blob.js
+++ b/app/assets/javascripts/blob_edit/edit_blob.js
@@ -1,8 +1,8 @@
import $ from 'jquery';
import { SourceEditorExtension } from '~/editor/extensions/source_editor_extension_base';
import { FileTemplateExtension } from '~/editor/extensions/source_editor_file_template_ext';
+import { ToolbarExtension } from '~/editor/extensions/source_editor_toolbar_ext';
import SourceEditor from '~/editor/source_editor';
-import { getBlobLanguage } from '~/editor/utils';
import createFlash from '~/flash';
import axios from '~/lib/utils/axios_utils';
import { addEditorMarkdownListeners } from '~/lib/utils/text_markdown';
@@ -36,7 +36,7 @@ export default class EditBlob {
import('~/editor/extensions/source_editor_markdown_ext'),
import('~/editor/extensions/source_editor_markdown_livepreview_ext'),
]);
- this.editor.use([
+ this.markdownExtensions = this.editor.use([
{ definition: MarkdownExtension },
{
definition: MarkdownLivePreview,
@@ -48,7 +48,6 @@ export default class EditBlob {
message: `${BLOB_EDITOR_ERROR}: ${e}`,
});
}
- this.hasMarkdownExtension = true;
addEditorMarkdownListeners(this.editor);
}
@@ -58,8 +57,6 @@ export default class EditBlob {
const fileContentEl = document.getElementById('file-content');
const form = document.querySelector('.js-edit-blob-form');
- this.hasMarkdownExtension = false;
-
const rootEditor = new SourceEditor();
this.editor = rootEditor.createInstance({
@@ -67,21 +64,29 @@ export default class EditBlob {
blobPath: fileNameEl.value,
blobContent: editorEl.innerText,
});
- this.editor.use([{ definition: SourceEditorExtension }, { definition: FileTemplateExtension }]);
+ this.editor.use([
+ { definition: SourceEditorExtension },
+ { definition: FileTemplateExtension },
+ { definition: ToolbarExtension },
+ ]);
fileNameEl.addEventListener('change', () => {
this.editor.updateModelLanguage(fileNameEl.value);
- const newLang = getBlobLanguage(fileNameEl.value);
- if (newLang === 'markdown') {
- if (!this.hasMarkdownExtension) {
- this.fetchMarkdownExtension();
- }
- }
});
form.addEventListener('submit', () => {
fileContentEl.value = insertFinalNewline(this.editor.getValue());
});
+
+ // onDidChangeModelLanguage is part of the native Monaco API
+ // https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IStandaloneCodeEditor.html#onDidChangeModelLanguage
+ this.editor.onDidChangeModelLanguage(({ newLanguage = '', oldLanguage = '' }) => {
+ if (newLanguage === 'markdown') {
+ this.fetchMarkdownExtension();
+ } else if (oldLanguage === 'markdown') {
+ this.editor.unuse(this.markdownExtensions);
+ }
+ });
}
initFileSelectors() {
diff --git a/app/assets/javascripts/editor/components/source_editor_toolbar.vue b/app/assets/javascripts/editor/components/source_editor_toolbar.vue
index 1427f2df461..2c177634bbe 100644
--- a/app/assets/javascripts/editor/components/source_editor_toolbar.vue
+++ b/app/assets/javascripts/editor/components/source_editor_toolbar.vue
@@ -55,8 +55,8 @@ export default {
id="se-toolbar"
class="gl-py-3 gl-px-5 gl-bg-white gl-border-t gl-border-b gl-display-flex gl-justify-content-space-between gl-align-items-center"
>
-
-
{{ commentDescription }}
{{ startDiscussionDescription }}
diff --git a/app/assets/javascripts/notes/components/note_body.vue b/app/assets/javascripts/notes/components/note_body.vue index fe17a061c0a..6c9bc4461c2 100644 --- a/app/assets/javascripts/notes/components/note_body.vue +++ b/app/assets/javascripts/notes/components/note_body.vue @@ -4,6 +4,7 @@ import { GlSafeHtmlDirective } from '@gitlab/ui'; import { escape } from 'lodash'; import { mapActions, mapGetters, mapState } from 'vuex'; +import { __ } from '~/locale'; import '~/behaviors/markdown/render_gfm'; import Suggestions from '~/vue_shared/components/markdown/suggestions.vue'; import autosave from '../mixins/autosave'; @@ -69,6 +70,9 @@ export default { noteBody() { return this.note.note; }, + saveButtonTitle() { + return this.note.confidential ? __('Save internal note') : __('Save comment'); + }, hasSuggestion() { return this.note.suggestions && this.note.suggestions.length; }, @@ -180,6 +184,7 @@ export default { :note-id="note.id" :line="line" :note="note" + :save-button-title="saveButtonTitle" :help-page-path="helpPagePath" :discussion="discussion" :resolve-discussion="note.resolve_discussion" diff --git a/app/assets/javascripts/notes/components/note_form.vue b/app/assets/javascripts/notes/components/note_form.vue index c1e763d81ee..5dd032abd72 100644 --- a/app/assets/javascripts/notes/components/note_form.vue +++ b/app/assets/javascripts/notes/components/note_form.vue @@ -8,9 +8,11 @@ import markdownField from '~/vue_shared/components/markdown/field.vue'; import eventHub from '../event_hub'; import issuableStateMixin from '../mixins/issuable_state'; import resolvable from '../mixins/resolvable'; +import { COMMENT_FORM } from '../i18n'; import CommentFieldLayout from './comment_field_layout.vue'; export default { + i18n: COMMENT_FORM, name: 'NoteForm', components: { markdownField, @@ -133,6 +135,11 @@ export default { .some((n) => n.current_user?.can_resolve_discussion) || this.isDraft ); }, + textareaPlaceholder() { + return this.discussionNote?.confidential + ? this.$options.i18n.bodyPlaceholderInternal + : this.$options.i18n.bodyPlaceholder; + }, noteHash() { if (this.noteId) { return `#note_${this.noteId}`; @@ -350,7 +357,7 @@ export default { data-qa-selector="reply_field" dir="auto" :aria-label="__('Reply to comment')" - :placeholder="__('Write a comment or drag your files here…')" + :placeholder="textareaPlaceholder" @keydown.meta.enter="handleKeySubmit()" @keydown.ctrl.enter="handleKeySubmit()" @keydown.exact.up="editMyLastNote()" diff --git a/app/assets/javascripts/notes/components/note_header.vue b/app/assets/javascripts/notes/components/note_header.vue index 11b427b9346..1ad9d593ccc 100644 --- a/app/assets/javascripts/notes/components/note_header.vue +++ b/app/assets/javascripts/notes/components/note_header.vue @@ -1,6 +1,7 @@