60 lines
2.1 KiB
Ruby
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
|