gitlab-org--gitlab-foss/rubocop/cop/gemspec/avoid_executing_git.rb

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