diff --git a/Library/.rubocop.yml b/Library/.rubocop.yml index 097eff9953..012fcd6095 100644 --- a/Library/.rubocop.yml +++ b/Library/.rubocop.yml @@ -6,6 +6,12 @@ AllCops: - '**/Casks/**/*' - '**/vendor/**/*' +require: + - ./Homebrew/rubocops/bottle_block_cop.rb + +CustomCops/CorrectBottleBlock: + Enabled: true + Metrics/AbcSize: Enabled: false diff --git a/Library/Homebrew/rubocops/bottle_block_cop.rb b/Library/Homebrew/rubocops/bottle_block_cop.rb new file mode 100644 index 0000000000..7cb97ea89e --- /dev/null +++ b/Library/Homebrew/rubocops/bottle_block_cop.rb @@ -0,0 +1,54 @@ +module RuboCop + module Cop + module CustomCops + class CorrectBottleBlock < Cop + MSG = 'Use rebuild instead of revision in bottle block'.freeze + + def on_block(node) + return if block_length(node).zero? + method, _args, _body = *node + + keyword, method_name = *method + + if method_name.equal?(:bottle) and has_revision?(_body) + add_offense(node, :expression) + end + end + + private + + def autocorrect(node) + ->(corrector) do + # Check for revision + method, _args, _body = *node + if has_revision?(_body) + replace_revision(corrector, node) + end + end + end + + def has_revision?(body) + body.children.each do |method_call_node| + _receiver, _method_name, *args = *method_call_node + if _method_name == :revision + return true + end + end + false + end + + def replace_revision(corrector, node) + new_source = String.new + node.source.each_line do |line| + if line =~ /\A\s*revision/ + line = line.sub('revision','rebuild') + end + new_source << line + end + corrector.insert_before(node.source_range, new_source) + corrector.remove(node.source_range) + end + end + end + end +end