From dc149736154b6f3a244573f299fa0d6283399ec1 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Sat, 9 Dec 2023 03:15:10 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .../database/avoid_using_pluck_without_limit.yml | 328 +++++++++++---------- app/controllers/projects_controller.rb | 8 +- app/services/projects/create_service.rb | 7 +- .../documentation/styleguide/word_list.md | 12 + spec/services/projects/create_service_spec.rb | 2 +- spec/support/rspec_run_time.rb | 65 +++- 6 files changed, 246 insertions(+), 176 deletions(-) diff --git a/.rubocop_todo/database/avoid_using_pluck_without_limit.yml b/.rubocop_todo/database/avoid_using_pluck_without_limit.yml index 254dc429c89..5318a6194a4 100644 --- a/.rubocop_todo/database/avoid_using_pluck_without_limit.yml +++ b/.rubocop_todo/database/avoid_using_pluck_without_limit.yml @@ -2,166 +2,168 @@ Database/AvoidUsingPluckWithoutLimit: Details: grace period Exclude: - - app/finders/groups/projects_requiring_authorizations_refresh/base.rb - - app/finders/issuables/label_filter.rb - - app/finders/projects/members/effective_access_level_finder.rb - - app/models/application_record.rb - - app/models/ci/build.rb - - app/models/ci/build_trace_chunks/fog.rb - - app/models/ci/build_trace_chunks/redis_base.rb - - app/models/ci/group_variable.rb - - app/models/ci/job_artifact.rb - - app/models/ci/job_token/allowlist.rb - - app/models/ci/pipeline.rb - - app/models/ci/runner.rb - - app/models/ci/runner_manager_build.rb - - app/models/commit_collection.rb - - app/models/commit_signatures/gpg_signature.rb - - app/models/commit_status.rb - - app/models/concerns/cascading_namespace_setting_attribute.rb - - app/models/concerns/commit_signature.rb - - app/models/concerns/integrations/reset_secret_fields.rb - - app/models/concerns/issuable.rb - - app/models/concerns/packages/debian/distribution.rb - - app/models/concerns/subquery.rb - - app/models/concerns/taggable_queries.rb - - app/models/customer_relations/contact.rb - - app/models/customer_relations/issue_contact.rb - - app/models/environment.rb - - app/models/event_collection.rb - - app/models/group.rb - - app/models/incident_management/timeline_event_tag.rb - - app/models/integration.rb - - app/models/integrations/base_chat_notification.rb - - app/models/integrations/slack_workspace/api_scope.rb - - app/models/integrations/slack_workspace/integration_api_scope.rb - - app/models/issue.rb - - app/models/label.rb - - app/models/loose_foreign_keys/deleted_record.rb - - app/models/member.rb - - app/models/members/last_group_owner_assigner.rb - - app/models/merge_request.rb - - app/models/merge_request_diff.rb - - app/models/merge_requests_closing_issues.rb - - app/models/namespace.rb - - app/models/namespaces/traversal/linear.rb - - app/models/namespaces/traversal/recursive.rb - - app/models/note.rb - - app/models/packages/build_info.rb - - app/models/packages/dependency.rb - - app/models/packages/maven/metadatum.rb - - app/models/packages/package.rb - - app/models/pages_deployment.rb - - app/models/postgresql/replication_slot.rb - - app/models/project.rb - - app/models/project_authorizations/changes.rb - - app/models/project_team.rb - - app/models/prometheus_alert.rb - - app/models/protected_branch.rb - - app/models/remote_mirror.rb - - app/models/shard.rb - - app/models/slack_integration.rb - - app/models/todo.rb - - app/models/uploads/fog.rb - - app/models/user.rb - - app/models/users/group_visit.rb - - app/models/users/project_visit.rb - - app/models/x509_certificate.rb - - app/services/authorized_project_update/project_recalculate_service.rb - - app/services/boards/base_items_list_service.rb - - app/services/branches/delete_merged_service.rb - - app/services/bulk_imports/batched_relation_export_service.rb - - app/services/ci/job_artifacts/bulk_delete_by_project_service.rb - - app/services/ci/pipeline_creation/cancel_redundant_pipelines_service.rb - - app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb - - app/services/ci/queue/pending_builds_strategy.rb - - app/services/ci/refs/enqueue_pipelines_to_unlock_service.rb - - app/services/ci/runners/reconcile_existing_runner_versions_service.rb - - app/services/ci/unlock_pipeline_service.rb - - app/services/groups/autocomplete_service.rb - - app/services/groups/destroy_service.rb - - app/services/groups/transfer_service.rb - - app/services/issues/referenced_merge_requests_service.rb - - app/services/labels/available_labels_service.rb - - app/services/labels/promote_service.rb - - app/services/labels/transfer_service.rb - - app/services/merge_requests/push_options_handler_service.rb - - app/services/merge_requests/pushed_branches_service.rb - - app/services/packages/cleanup/execute_policy_service.rb - - app/services/projects/slack_application_install_service.rb - - app/services/projects/unlink_fork_service.rb - - ee/app/finders/ee/issuables/label_filter.rb - - ee/app/finders/ee/merge_requests_finder.rb - - ee/app/finders/groups_with_templates_finder.rb - - ee/app/finders/namespaces/billed_users_finder.rb - - ee/app/finders/namespaces/free_user_cap/users_finder.rb - - ee/app/finders/namespaces/free_user_cap/users_without_added_members_finder.rb - - ee/app/models/ai/ai_resource/concerns/noteable.rb - - ee/app/models/allowed_email_domain.rb - - ee/app/models/analytics/issues_analytics.rb - - ee/app/models/approval_wrapped_rule.rb - - ee/app/models/concerns/audit_events/streaming/streamable_event_type_filter.rb - - ee/app/models/concerns/ee/ci/artifactable.rb - - ee/app/models/concerns/ee/issuable_link.rb - - ee/app/models/concerns/elasticsearch_indexed_container.rb - - ee/app/models/concerns/geo/verifiable_model.rb - - ee/app/models/dast_scanner_profile.rb - - ee/app/models/dast_site_profile.rb - - ee/app/models/ee/ci/daily_build_group_report_result.rb - - ee/app/models/ee/ci/pipeline.rb - - ee/app/models/ee/design_management/repository.rb - - ee/app/models/ee/epic.rb - - ee/app/models/ee/group.rb - - ee/app/models/ee/group_group_link.rb - - ee/app/models/ee/group_member.rb - - ee/app/models/ee/label.rb - - ee/app/models/ee/merge_request.rb - - ee/app/models/ee/personal_access_token.rb - - ee/app/models/ee/project.rb - - ee/app/models/ee/project_authorization.rb - - ee/app/models/ee/project_group_link.rb - - ee/app/models/ee/projects/wiki_repository.rb - - ee/app/models/ee/uploads/local.rb - - ee/app/models/ee/user.rb - - ee/app/models/embedding/application_record.rb - - ee/app/models/geo/base_registry.rb - - ee/app/models/geo/container_repository_registry.rb - - ee/app/models/geo/lfs_object_registry.rb - - ee/app/models/geo/tracking_base.rb - - ee/app/models/geo/upload_registry.rb - - ee/app/models/gitlab_subscriptions/user_add_on_assignment.rb - - ee/app/models/incident_management/oncall_rotation.rb - - ee/app/models/instance_security_dashboard.rb - - ee/app/models/issuables_analytics.rb - - ee/app/models/iteration.rb - - ee/app/models/merge_requests/external_status_check.rb - - ee/app/models/protected_environment.rb - - ee/app/models/security/finding.rb - - ee/app/models/security/scan.rb - - ee/app/models/security/scan_result_policy_violation.rb - - ee/app/models/software_license.rb - - ee/app/models/vulnerabilities/finding.rb - - ee/app/models/vulnerabilities/read.rb - - ee/app/services/analytics/cycle_analytics/consistency_check_service.rb - - ee/app/services/analytics/cycle_analytics/data_loader_service.rb - - ee/app/services/approval_rules/params_filtering_service.rb - - ee/app/services/click_house/data_ingestion/ci_finished_builds_sync_service.rb - - ee/app/services/ee/groups/destroy_service.rb - - ee/app/services/ee/search/global_service.rb - - ee/app/services/epics/update_dates_service.rb - - ee/app/services/gitlab_subscriptions/preview_billable_user_change_service.rb - - ee/app/services/security/merge_request_security_report_generation_service.rb - - ee/app/services/security/scan_result_policies/sync_any_merge_request_rules_service.rb - - ee/app/services/security/scan_result_policies/update_approvals_service.rb - - ee/app/services/security/security_orchestration_policies/default_branch_updation_check_service.rb - - ee/app/services/security/security_orchestration_policies/fetch_policy_approvers_service.rb - - ee/app/services/security/security_orchestration_policies/policy_branches_service.rb - - ee/app/services/security/security_orchestration_policies/process_scan_result_policy_service.rb - - ee/app/services/security/security_orchestration_policies/protected_branches_deletion_check_service.rb - - ee/app/services/security/security_orchestration_policies/protected_branches_push_service.rb - - ee/app/services/security/security_orchestration_policies/rule_schedule_service.rb - - ee/app/services/security/security_orchestration_policies/validate_policy_service.rb - - ee/app/services/security/sync_license_scanning_rules_service.rb - - ee/app/services/vulnerabilities/bulk_dismiss_service.rb - - ee/app/services/vulnerability_exports/export_service.rb - - ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules.rb + - 'app/finders/groups/projects_requiring_authorizations_refresh/base.rb' + - 'app/finders/issuables/label_filter.rb' + - 'app/finders/projects/members/effective_access_level_finder.rb' + - 'app/models/application_record.rb' + - 'app/models/ci/build.rb' + - 'app/models/ci/build_trace_chunks/fog.rb' + - 'app/models/ci/build_trace_chunks/redis_base.rb' + - 'app/models/ci/group_variable.rb' + - 'app/models/ci/job_artifact.rb' + - 'app/models/ci/job_token/allowlist.rb' + - 'app/models/ci/pipeline.rb' + - 'app/models/ci/runner.rb' + - 'app/models/ci/runner_manager_build.rb' + - 'app/models/commit_collection.rb' + - 'app/models/commit_signatures/gpg_signature.rb' + - 'app/models/commit_status.rb' + - 'app/models/concerns/cascading_namespace_setting_attribute.rb' + - 'app/models/concerns/commit_signature.rb' + - 'app/models/concerns/integrations/reset_secret_fields.rb' + - 'app/models/concerns/issuable.rb' + - 'app/models/concerns/packages/debian/distribution.rb' + - 'app/models/concerns/routable.rb' + - 'app/models/concerns/subquery.rb' + - 'app/models/concerns/taggable_queries.rb' + - 'app/models/customer_relations/contact.rb' + - 'app/models/customer_relations/issue_contact.rb' + - 'app/models/environment.rb' + - 'app/models/event_collection.rb' + - 'app/models/group.rb' + - 'app/models/incident_management/timeline_event_tag.rb' + - 'app/models/integration.rb' + - 'app/models/integrations/base_chat_notification.rb' + - 'app/models/integrations/slack_workspace/api_scope.rb' + - 'app/models/integrations/slack_workspace/integration_api_scope.rb' + - 'app/models/issue.rb' + - 'app/models/label.rb' + - 'app/models/loose_foreign_keys/deleted_record.rb' + - 'app/models/member.rb' + - 'app/models/members/last_group_owner_assigner.rb' + - 'app/models/merge_request.rb' + - 'app/models/merge_request_diff.rb' + - 'app/models/merge_requests_closing_issues.rb' + - 'app/models/namespace.rb' + - 'app/models/namespaces/traversal/linear.rb' + - 'app/models/namespaces/traversal/recursive.rb' + - 'app/models/note.rb' + - 'app/models/packages/build_info.rb' + - 'app/models/packages/dependency.rb' + - 'app/models/packages/maven/metadatum.rb' + - 'app/models/packages/package.rb' + - 'app/models/pages_deployment.rb' + - 'app/models/postgresql/replication_slot.rb' + - 'app/models/project.rb' + - 'app/models/project_authorizations/changes.rb' + - 'app/models/project_team.rb' + - 'app/models/prometheus_alert.rb' + - 'app/models/protected_branch.rb' + - 'app/models/remote_mirror.rb' + - 'app/models/shard.rb' + - 'app/models/slack_integration.rb' + - 'app/models/todo.rb' + - 'app/models/uploads/fog.rb' + - 'app/models/user.rb' + - 'app/models/users/group_visit.rb' + - 'app/models/users/project_visit.rb' + - 'app/models/x509_certificate.rb' + - 'app/services/authorized_project_update/project_recalculate_service.rb' + - 'app/services/boards/base_items_list_service.rb' + - 'app/services/branches/delete_merged_service.rb' + - 'app/services/bulk_imports/batched_relation_export_service.rb' + - 'app/services/ci/job_artifacts/bulk_delete_by_project_service.rb' + - 'app/services/ci/pipeline_creation/cancel_redundant_pipelines_service.rb' + - 'app/services/ci/pipeline_processing/atomic_processing_service/status_collection.rb' + - 'app/services/ci/queue/pending_builds_strategy.rb' + - 'app/services/ci/refs/enqueue_pipelines_to_unlock_service.rb' + - 'app/services/ci/runners/reconcile_existing_runner_versions_service.rb' + - 'app/services/ci/unlock_pipeline_service.rb' + - 'app/services/groups/autocomplete_service.rb' + - 'app/services/groups/destroy_service.rb' + - 'app/services/groups/transfer_service.rb' + - 'app/services/issues/referenced_merge_requests_service.rb' + - 'app/services/labels/available_labels_service.rb' + - 'app/services/labels/promote_service.rb' + - 'app/services/labels/transfer_service.rb' + - 'app/services/merge_requests/push_options_handler_service.rb' + - 'app/services/merge_requests/pushed_branches_service.rb' + - 'app/services/packages/cleanup/execute_policy_service.rb' + - 'app/services/projects/slack_application_install_service.rb' + - 'app/services/projects/unlink_fork_service.rb' + - 'ee/app/finders/ee/issuables/label_filter.rb' + - 'ee/app/finders/ee/merge_requests_finder.rb' + - 'ee/app/finders/groups_with_templates_finder.rb' + - 'ee/app/finders/namespaces/billed_users_finder.rb' + - 'ee/app/finders/namespaces/free_user_cap/users_finder.rb' + - 'ee/app/finders/namespaces/free_user_cap/users_without_added_members_finder.rb' + - 'ee/app/models/ai/ai_resource/concerns/noteable.rb' + - 'ee/app/models/allowed_email_domain.rb' + - 'ee/app/models/analytics/issues_analytics.rb' + - 'ee/app/models/approval_wrapped_rule.rb' + - 'ee/app/models/concerns/audit_events/streaming/streamable_event_type_filter.rb' + - 'ee/app/models/concerns/ee/ci/artifactable.rb' + - 'ee/app/models/concerns/ee/issuable_link.rb' + - 'ee/app/models/concerns/elasticsearch_indexed_container.rb' + - 'ee/app/models/concerns/geo/verifiable_model.rb' + - 'ee/app/models/dast_scanner_profile.rb' + - 'ee/app/models/dast_site_profile.rb' + - 'ee/app/models/ee/ci/daily_build_group_report_result.rb' + - 'ee/app/models/ee/ci/pipeline.rb' + - 'ee/app/models/ee/design_management/repository.rb' + - 'ee/app/models/ee/epic.rb' + - 'ee/app/models/ee/group.rb' + - 'ee/app/models/ee/group_group_link.rb' + - 'ee/app/models/ee/group_member.rb' + - 'ee/app/models/ee/label.rb' + - 'ee/app/models/ee/merge_request.rb' + - 'ee/app/models/ee/personal_access_token.rb' + - 'ee/app/models/ee/project.rb' + - 'ee/app/models/ee/project_authorization.rb' + - 'ee/app/models/ee/project_group_link.rb' + - 'ee/app/models/ee/projects/wiki_repository.rb' + - 'ee/app/models/ee/uploads/local.rb' + - 'ee/app/models/ee/user.rb' + - 'ee/app/models/embedding/application_record.rb' + - 'ee/app/models/geo/base_registry.rb' + - 'ee/app/models/geo/container_repository_registry.rb' + - 'ee/app/models/geo/lfs_object_registry.rb' + - 'ee/app/models/geo/tracking_base.rb' + - 'ee/app/models/geo/upload_registry.rb' + - 'ee/app/models/gitlab_subscriptions/add_on_purchase.rb' + - 'ee/app/models/gitlab_subscriptions/user_add_on_assignment.rb' + - 'ee/app/models/incident_management/oncall_rotation.rb' + - 'ee/app/models/instance_security_dashboard.rb' + - 'ee/app/models/issuables_analytics.rb' + - 'ee/app/models/iteration.rb' + - 'ee/app/models/merge_requests/external_status_check.rb' + - 'ee/app/models/protected_environment.rb' + - 'ee/app/models/security/finding.rb' + - 'ee/app/models/security/scan.rb' + - 'ee/app/models/security/scan_result_policy_violation.rb' + - 'ee/app/models/software_license.rb' + - 'ee/app/models/vulnerabilities/finding.rb' + - 'ee/app/models/vulnerabilities/read.rb' + - 'ee/app/services/analytics/cycle_analytics/consistency_check_service.rb' + - 'ee/app/services/analytics/cycle_analytics/data_loader_service.rb' + - 'ee/app/services/approval_rules/params_filtering_service.rb' + - 'ee/app/services/click_house/data_ingestion/ci_finished_builds_sync_service.rb' + - 'ee/app/services/ee/groups/destroy_service.rb' + - 'ee/app/services/ee/search/global_service.rb' + - 'ee/app/services/epics/update_dates_service.rb' + - 'ee/app/services/gitlab_subscriptions/preview_billable_user_change_service.rb' + - 'ee/app/services/security/merge_request_security_report_generation_service.rb' + - 'ee/app/services/security/scan_result_policies/sync_any_merge_request_rules_service.rb' + - 'ee/app/services/security/scan_result_policies/update_approvals_service.rb' + - 'ee/app/services/security/security_orchestration_policies/default_branch_updation_check_service.rb' + - 'ee/app/services/security/security_orchestration_policies/fetch_policy_approvers_service.rb' + - 'ee/app/services/security/security_orchestration_policies/policy_branches_service.rb' + - 'ee/app/services/security/security_orchestration_policies/process_scan_result_policy_service.rb' + - 'ee/app/services/security/security_orchestration_policies/protected_branches_deletion_check_service.rb' + - 'ee/app/services/security/security_orchestration_policies/protected_branches_push_service.rb' + - 'ee/app/services/security/security_orchestration_policies/rule_schedule_service.rb' + - 'ee/app/services/security/security_orchestration_policies/validate_policy_service.rb' + - 'ee/app/services/security/sync_license_scanning_rules_service.rb' + - 'ee/app/services/vulnerabilities/bulk_dismiss_service.rb' + - 'ee/app/services/vulnerability_exports/export_service.rb' + - 'ee/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules.rb' diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 12decbbfeee..6428e0196a8 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -443,6 +443,7 @@ class ProjectsController < Projects::ApplicationController params.require(:project) .permit(project_params_attributes + attributes) .merge(import_url_params) + .merge(object_format_params) end def project_feature_attributes @@ -513,7 +514,6 @@ class ProjectsController < Projects::ApplicationController :merge_method, :initialize_with_sast, :initialize_with_readme, - :use_sha256_repository, :ci_separated_caches, :suggestion_commit_message, :packages_enabled, @@ -532,6 +532,12 @@ class ProjectsController < Projects::ApplicationController {} end + def object_format_params + return {} unless Gitlab::Utils.to_boolean(params.dig(:project, :use_sha256_repository)) + + { repository_object_format: Repository::FORMAT_SHA256 } + end + def active_new_project_tab project_params[:import_url].present? ? 'import' : 'blank' end diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index e4b0fca729a..6f29c72e25a 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -13,11 +13,11 @@ module Projects @skip_wiki = @params.delete(:skip_wiki) @initialize_with_sast = Gitlab::Utils.to_boolean(@params.delete(:initialize_with_sast)) @initialize_with_readme = Gitlab::Utils.to_boolean(@params.delete(:initialize_with_readme)) - @use_sha256_repository = Gitlab::Utils.to_boolean(@params.delete(:use_sha256_repository)) && Feature.enabled?(:support_sha256_repositories, user) @import_data = @params.delete(:import_data) @relations_block = @params.delete(:relations_block) @default_branch = @params.delete(:default_branch) @readme_template = @params.delete(:readme_template) + @repository_object_format = @params.delete(:repository_object_format) build_topics end @@ -214,7 +214,10 @@ module Projects end def repository_object_format - @use_sha256_repository ? Repository::FORMAT_SHA256 : Repository::FORMAT_SHA1 + return Repository::FORMAT_SHA1 unless Feature.enabled?(:support_sha256_repositories, current_user) + return Repository::FORMAT_SHA256 if @repository_object_format == Repository::FORMAT_SHA256 + + Repository::FORMAT_SHA1 end def readme_content diff --git a/doc/development/documentation/styleguide/word_list.md b/doc/development/documentation/styleguide/word_list.md index 3cbafc8f2c4..ed420341c56 100644 --- a/doc/development/documentation/styleguide/word_list.md +++ b/doc/development/documentation/styleguide/word_list.md @@ -1445,6 +1445,10 @@ When documenting the tasks that must be completed or the conditions that must be Do not use **requirements**. +## reset + +Use **reset** to describe the action associated with resetting an item to a new state. + ## respectively Avoid **respectively** and be more precise instead. @@ -1458,6 +1462,10 @@ Instead of: - Select **Create user** or **Save changes** if you created a new user or edited an existing one respectively. +## restore + +See the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/r/restore) for guidance on **restore**. + ## review app Use lowercase for **review app**. @@ -1797,6 +1805,10 @@ See also [**enter**](#enter). Use **Ultimate**, in uppercase, for the subscription tier. When you refer to **Ultimate** in the context of other subscription tiers, follow [the subscription tier](#subscription-tier) guidance. +## undo + +See the [Microsoft Style Guide](https://learn.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/u/undo) for guidance on **undo**. + ## units of measurement Use a space between the number and the unit of measurement. For example, **128 GB**. diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index 1da786c9fc4..5a7abf6cde8 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -814,7 +814,7 @@ RSpec.describe Projects::CreateService, '#execute', feature_category: :groups_an context 'when SHA256 format is requested' do let(:project) { create_project(user, opts) } - let(:opts) { super().merge(initialize_with_readme: true, use_sha256_repository: true) } + let(:opts) { super().merge(initialize_with_readme: true, repository_object_format: 'sha256') } before do allow(Gitlab::CurrentSettings).to receive(:default_branch_name).and_return('main') diff --git a/spec/support/rspec_run_time.rb b/spec/support/rspec_run_time.rb index 875bdc0852e..841f714e369 100644 --- a/spec/support/rspec_run_time.rb +++ b/spec/support/rspec_run_time.rb @@ -14,25 +14,72 @@ module Support def start(_notification) @group_level = 0 @rspec_test_suite_start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) - output.puts "\n# Starting RSpec timer..." + output.puts "\n# [RSpecRunTime] Starting RSpec timer..." + + init_expected_duration_report end - def example_group_started(_notification) - @start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) if @group_level == 0 + def example_group_started(notification) + if @group_level == 0 + @current_group_start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) + file_path = spec_file_path(notification) + output.puts "# [RSpecRunTime] Starting example group #{file_path}. #{expected_run_time(file_path)}" + end + @group_level += 1 end def example_group_finished(notification) @group_level -= 1 if @group_level > 0 - return unless @group_level == 0 + if @group_level == 0 + file_path = spec_file_path(notification) + time_now = Process.clock_gettime(Process::CLOCK_MONOTONIC) + actual_duration = time_now - @current_group_start_time + + output.puts "\n# [RSpecRunTime] #{file_path} took #{readable_duration(actual_duration)}. " \ + "#{expected_run_time(file_path)}" + end + + output_elapsed_time + end + + private + + def expected_duration_report + report_path = ENV['KNAPSACK_RSPEC_SUITE_REPORT_PATH'] + + return unless report_path && File.exist?(report_path) + + # rubocop:disable Gitlab/Json -- regular JSON is sufficient + @expected_duration_report ||= JSON.parse(File.read(report_path)) + # rubocop:enable Gitlab/Json + end + alias_method :init_expected_duration_report, :expected_duration_report + + def spec_file_path(notification) + notification.group.metadata[:file_path].sub('./', '') + end + + def expected_run_time(spec_file_path) + return '' unless expected_duration_report + + expected_duration = expected_duration_report[spec_file_path] + return "Missing expected duration from Knapsack report for #{spec_file_path}." unless expected_duration + + "Expected to take #{readable_duration(expected_duration)}." + end + + def output_elapsed_time time_now = Process.clock_gettime(Process::CLOCK_MONOTONIC) - duration = time_now - @start_time - elapsed_time = time_now - @rspec_test_suite_start_time + elapsed_seconds = time_now - @rspec_test_suite_start_time + + # skip the output unless the duration increased by at least 1 second + unless @last_elapsed_seconds.nil? || elapsed_seconds - @last_elapsed_seconds < 1 + output.puts "# [RSpecRunTime] RSpec elapsed time: #{readable_duration(elapsed_seconds)}.\n\n" + end - output.puts "\n# Example group #{notification.group.description} " \ - "(#{notification.group.metadata[:file_path]}) took #{readable_duration(duration)}." - output.puts "# RSpec elapsed time: #{readable_duration(elapsed_time)}.\n\n" + @last_elapsed_seconds = elapsed_seconds end end end -- cgit v1.2.3