debian-mirror-gitlab/tooling/danger/sidekiq_args.rb
2023-05-27 22:25:52 +05:30

60 lines
2.1 KiB
Ruby

# frozen_string_literal: true
module Tooling
module Danger
module SidekiqArgs
include ::Danger::Helpers
WORKER_FILES_REGEX = 'app/workers'
EE_PREFIX = 'ee/'
DEF_PERFORM = "def perform"
DEF_PERFORM_REGEX = /[\s+-]*def perform\((.*)\)/
BEFORE_DEF_PERFORM_REGEX = /^[\s-]*def perform\b/
AFTER_DEF_PERFORM_REGEX = /^[\s+]*def perform\b/
SUGGEST_MR_COMMENT = <<~SUGGEST_COMMENT
Please follow the [sidekiq development guidelines](https://docs.gitlab.com/ee/development/sidekiq/compatibility_across_updates.html#changing-the-arguments-for-a-worker) when changing sidekiq worker arguments.
SUGGEST_COMMENT
def changed_worker_files(ee: :include)
changed_files = helper.all_changed_files
folder_prefix =
case ee
when :include
"(#{EE_PREFIX})?"
when :only
EE_PREFIX
when :exclude
nil
end
changed_files.grep(%r{\A#{folder_prefix}#{WORKER_FILES_REGEX}})
end
def args_changed?(diff)
# Find the "before" and "after" versions of the perform method definition
before_def_perform = diff.find { |line| BEFORE_DEF_PERFORM_REGEX.match?(line) }
after_def_perform = diff.find { |line| AFTER_DEF_PERFORM_REGEX.match?(line) }
# args are not changed if there is no before or after def perform method
return false unless before_def_perform && after_def_perform
# Extract the perform method arguments from the "before" and "after" versions
before_args, after_args = diff.flat_map { |line| line.scan(DEF_PERFORM_REGEX) }
before_args != after_args
end
def add_comment_for_matched_line(filename)
diff = helper.changed_lines(filename)
return unless args_changed?(diff)
file_lines = project_helper.file_lines(filename)
perform_method_line = file_lines.index { |line| line.include?(DEF_PERFORM) }
markdown(format(SUGGEST_MR_COMMENT), file: filename, line: perform_method_line.succ)
end
end
end
end