diff --git a/.rubocop.yml b/.rubocop.yml index af1c7ad50f47e182a0a8aef691eccee3b7e12f8f..8edba38cc655451a6421acd95c4bde4d74d29b21 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1025,3 +1025,10 @@ RSpec/FactoryBot/LocalStaticAssignment: Rails/TransactionExitStatement: Enabled: true + +Search/AvoidCheckingFinishedOnDeprecatedMigrations: + Include: + - 'ee/app/models/**/*.rb' + - 'ee/lib/elastic/**/*.rb' + - 'ee/lib/gitlab/elastic/**/*.rb' + - 'ee/spec/support/helpers/elasticsearch_helpers.rb' diff --git a/.rubocop_todo/search/avoid_checking_finished_on_deprecated_migrations.yml b/.rubocop_todo/search/avoid_checking_finished_on_deprecated_migrations.yml new file mode 100644 index 0000000000000000000000000000000000000000..d4b532ff76ceef221d3f4fdbd37d730cc89cf31d --- /dev/null +++ b/.rubocop_todo/search/avoid_checking_finished_on_deprecated_migrations.yml @@ -0,0 +1,3 @@ +--- +Search/AvoidCheckingFinishedOnDeprecatedMigrations: + Details: grace period diff --git a/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations.rb b/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations.rb new file mode 100644 index 0000000000000000000000000000000000000000..0a6813d4bbaa3555ef01dc39f8fd404a1e323945 --- /dev/null +++ b/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Search + # Cop that prevents checking migration_has_finished? on deprecated migrations + # + # @example + # + # # bad + # def disable_project_joins_for_blob? + # Elastic::DataMigrationService + # .migration_has_finished?(:backfill_project_permissions_in_blobs_using_permutations) + # end + # + # # good + # def disable_project_joins_for_blob? + # Elastic::DataMigrationService.migration_has_finished?(:backfill_project_permissions_in_blobs) + # end + + class AvoidCheckingFinishedOnDeprecatedMigrations < RuboCop::Cop::Base + MSG = 'Migration is deprecated and can not be used with `migration_has_finished?`.' + + def_node_matcher :deprecated_migration?, <<~PATTERN + (send + (const (const {nil? cbase} :Elastic) :DataMigrationService) :migration_has_finished? + (sym :backfill_project_permissions_in_blobs_using_permutations)) + PATTERN + + RESTRICT_ON_SEND = %i[migration_has_finished?].freeze + + def on_send(node) + add_offense(node) if deprecated_migration?(node) + end + end + end + end +end diff --git a/spec/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations_spec.rb b/spec/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..9853423e758167ef36db9b74774c578f651c829c --- /dev/null +++ b/spec/rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require 'rubocop_spec_helper' +require_relative '../../../../rubocop/cop/search/avoid_checking_finished_on_deprecated_migrations' + +RSpec.describe RuboCop::Cop::Search::AvoidCheckingFinishedOnDeprecatedMigrations, feature_category: :global_search do + context 'when a deprecated class is used with migration_has_finished?' do + it 'flags it as an offense' do + expect_offense <<~SOURCE + return if Elastic::DataMigrationService.migration_has_finished?(:backfill_project_permissions_in_blobs_using_permutations) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Migration is deprecated and can not be used with `migration_has_finished?`. + SOURCE + end + end + + context 'when a non deprecated class is used with migration_has_finished?' do + it 'does not flag it as an offense' do + expect_no_offenses <<~SOURCE + return if Elastic::DataMigrationService.migration_has_finished?(:backfill_project_permissions_in_blobs) + SOURCE + end + end + + context 'when migration_has_finished? method is called on another class' do + it 'does not flag it as an offense' do + expect_no_offenses <<~SOURCE + return if Klass.migration_has_finished?(:backfill_project_permissions_in_blobs_using_permutations) + SOURCE + end + end +end