62 lines
1.5 KiB
Ruby
62 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module RuboCop
|
|
module Cop
|
|
module Gemspec
|
|
# Checks that `git` is not executed in a vendored gemspec file.
|
|
# In some installed containers, `git` is not available.
|
|
#
|
|
# @example
|
|
#
|
|
# # bad
|
|
# Gem::Specification.new do |spec|
|
|
# spec.test_files = `git ls-files -- test/*`.split("\n")
|
|
# end
|
|
#
|
|
# # good
|
|
# Gem::Specification.new do |spec|
|
|
# spec.name = 'your_cool_gem_name'
|
|
# spec.test_files += Dir.glob('test/**/*')
|
|
# end
|
|
#
|
|
class AvoidExecutingGit < Base
|
|
include RangeHelp
|
|
|
|
MSG = 'Do not execute `git` in gemspec.'
|
|
|
|
# @!method gem_specification(node)
|
|
def_node_matcher :gem_specification, <<~PATTERN
|
|
(block
|
|
(send
|
|
(const
|
|
(const {cbase nil?} :Gem) :Specification) :new)
|
|
...)
|
|
PATTERN
|
|
|
|
def_node_matcher :send_node?, <<~PATTERN
|
|
send
|
|
PATTERN
|
|
|
|
def_node_search :executes_string, <<~PATTERN
|
|
$(xstr (str $_))
|
|
PATTERN
|
|
|
|
def on_block(block_node)
|
|
return unless gem_specification(block_node)
|
|
|
|
block_node.descendants.each do |node|
|
|
next unless send_node?(node)
|
|
|
|
str = executes_string(node)
|
|
|
|
str.each do |execute_node, val|
|
|
break unless val.start_with?('git ')
|
|
|
|
add_offense(execute_node, message: message)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|