63 lines
1.5 KiB
Ruby
63 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
|