audit: Port rules from line_problems to rubocop part 4(WIP-3)
This commit is contained in:
parent
4295a4ca78
commit
087c1ca8d6
@ -824,50 +824,8 @@ class FormulaAuditor
|
||||
problem "\"(#{Regexp.last_match(1)}...#{Regexp.last_match(2)})\" should be \"(#{Regexp.last_match(3).downcase}+...)\""
|
||||
end
|
||||
|
||||
if line =~ /((man)\s*\+\s*(['"])(man[1-8])(['"]))/
|
||||
problem "\"#{Regexp.last_match(1)}\" should be \"#{Regexp.last_match(4)}\""
|
||||
end
|
||||
|
||||
# Prefer formula path shortcuts in strings
|
||||
if line =~ %r[(\#\{prefix\}/(bin|include|libexec|lib|sbin|share|Frameworks))]
|
||||
problem "\"#{Regexp.last_match(1)}\" should be \"\#{#{Regexp.last_match(2).downcase}}\""
|
||||
end
|
||||
|
||||
if line =~ %r[((\#\{prefix\}/share/man/|\#\{man\}/)(man[1-8]))]
|
||||
problem "\"#{Regexp.last_match(1)}\" should be \"\#{#{Regexp.last_match(3)}}\""
|
||||
end
|
||||
|
||||
if line =~ %r[((\#\{share\}/(man)))[/'"]]
|
||||
problem "\"#{Regexp.last_match(1)}\" should be \"\#{#{Regexp.last_match(3)}}\""
|
||||
end
|
||||
|
||||
if line =~ %r[(\#\{prefix\}/share/(info|man))]
|
||||
problem "\"#{Regexp.last_match(1)}\" should be \"\#{#{Regexp.last_match(2)}}\""
|
||||
end
|
||||
|
||||
if line =~ /depends_on\s+['"](.+)['"]\s+=>\s+:(lua|perl|python|ruby)(\d*)/
|
||||
problem "#{Regexp.last_match(2)} modules should be vendored rather than use deprecated `depends_on \"#{Regexp.last_match(1)}\" => :#{Regexp.last_match(2)}#{Regexp.last_match(3)}`"
|
||||
end
|
||||
|
||||
problem "Use separate make calls" if line.include?("make && make")
|
||||
|
||||
# Avoid hard-coding compilers
|
||||
if line =~ %r{(system|ENV\[.+\]\s?=)\s?['"](/usr/bin/)?(gcc|llvm-gcc|clang)['" ]}
|
||||
problem "Use \"\#{ENV.cc}\" instead of hard-coding \"#{Regexp.last_match(3)}\""
|
||||
end
|
||||
|
||||
if line =~ %r{(system|ENV\[.+\]\s?=)\s?['"](/usr/bin/)?((g|llvm-g|clang)\+\+)['" ]}
|
||||
problem "Use \"\#{ENV.cxx}\" instead of hard-coding \"#{Regexp.last_match(3)}\""
|
||||
end
|
||||
|
||||
if line =~ /system\s+['"](env|export)(\s+|['"])/
|
||||
problem "Use ENV instead of invoking '#{Regexp.last_match(1)}' to modify the environment"
|
||||
end
|
||||
|
||||
if line =~ /ARGV\.(?!(debug\?|verbose\?|value[\(\s]))/
|
||||
problem "Use build instead of ARGV to check options"
|
||||
end
|
||||
|
||||
if line =~ /JAVA_HOME/i && !formula.requirements.map(&:class).include?(JavaRequirement)
|
||||
problem "Use `depends_on :java` to set JAVA_HOME"
|
||||
end
|
||||
|
||||
@ -88,6 +88,66 @@ module RuboCop
|
||||
end
|
||||
end
|
||||
|
||||
[:debug?, :verbose?, :value].each do |m|
|
||||
find_instance_method_call(body_node, :ARGV, m) do
|
||||
problem "Use build instead of ARGV to check options"
|
||||
end
|
||||
end
|
||||
|
||||
find_instance_method_call(body_node, :man, :+) do |m|
|
||||
next unless match = regex_match_group(parameters(m).first, %r{man[1-8]})
|
||||
problem "\"#{m.source}\" should be \"#{match[1]}\""
|
||||
end
|
||||
|
||||
# Avoid hard-coding compilers
|
||||
find_every_method_call_by_name(body_node, :system).each do |m|
|
||||
param = parameters(m).first
|
||||
if match = regex_match_group(param, %r{(/usr/bin/)?(gcc|llvm-gcc|clang)\s?})
|
||||
problem "Use \"\#{ENV.cc}\" instead of hard-coding \"#{match[3]}\""
|
||||
elsif match = regex_match_group(param, %r{(/usr/bin/)?((g|llvm-g|clang)\+\+)\s?})
|
||||
problem "Use \"\#{ENV.cxx}\" instead of hard-coding \"#{match[3]}\""
|
||||
end
|
||||
end
|
||||
|
||||
find_instance_method_call(body_node, :ENV, :[]=) do |m|
|
||||
param = parameters(m)[1]
|
||||
if match = regex_match_group(param, %r{(/usr/bin/)?(gcc|llvm-gcc|clang)\s?})
|
||||
problem "Use \"\#{ENV.cc}\" instead of hard-coding \"#{match[3]}\""
|
||||
elsif match = regex_match_group(param, %r{(/usr/bin/)?((g|llvm-g|clang)\+\+)\s?})
|
||||
problem "Use \"\#{ENV.cxx}\" instead of hard-coding \"#{match[3]}\""
|
||||
end
|
||||
end
|
||||
|
||||
# Prefer formula path shortcuts in strings
|
||||
formula_path_strings(body_node, :prefix) do |p|
|
||||
next unless match = regex_match_group(p, %r{(/(man))[/'"]})
|
||||
problem "\"\#\{prefix}#{match[1]}\" should be \"\#{#{match[3]}}\""
|
||||
end
|
||||
|
||||
formula_path_strings(body_node, :share) do |p|
|
||||
if match = regex_match_group(p, %r{/(bin|include|libexec|lib|sbin|share|Frameworks)}i)
|
||||
problem "\"\#\{prefix}#{match[1]}\" should be \"\#{#{match[1].downcase}}\""
|
||||
end
|
||||
if match = regex_match_group(p, %r{((/share/man/|\#\{man\}/)(man[1-8]))})
|
||||
problem "\"\#\{prefix}#{match[1]}\" should be \"\#{#{match[3]}}\""
|
||||
end
|
||||
if match = regex_match_group(p, %r{(/share/(info|man))})
|
||||
problem "\"\#\{prefix}#{match[1]}\" should be \"\#{#{match[2]}}\""
|
||||
end
|
||||
end
|
||||
|
||||
find_every_method_call_by_name(body_node, :depends_on) do |m|
|
||||
key, value = destructure_hash(paramters(m).first)
|
||||
next unless key.str_type?
|
||||
next unless match = regex_match_group(value, %r{(lua|perl|python|ruby)(\d*)})
|
||||
problem "#{match[1]} modules should be vendored rather than use deprecated #{m.source}`"
|
||||
end
|
||||
|
||||
find_every_method_call_by_name(body_node, :system).each do |m|
|
||||
next unless match = regex_match_group(parameters(m).first, %r{(env|export)(\s+)?})
|
||||
problem "Use ENV instead of invoking '#{match[1]}' to modify the environment"
|
||||
end
|
||||
|
||||
find_every_method_call_by_name(body_node, :depends_on).each do |m|
|
||||
next unless modifier?(m)
|
||||
dep, option = hash_dep(m)
|
||||
@ -281,6 +341,14 @@ module RuboCop
|
||||
$(hash (pair $(str _) (array $(str _) ...)))}
|
||||
EOS
|
||||
|
||||
def_node_search :destructure_hash, <<-EOS.undent
|
||||
(hash (pair $_ $_))
|
||||
EOS
|
||||
|
||||
def_node_matcher :formula_path_strings, <<-EOS.undent
|
||||
(dstr (begin (send nil %1)) $(str _ ))
|
||||
EOS
|
||||
|
||||
def_node_matcher :negation?, '(send ... :!)'
|
||||
# This is Pattern Matching method for AST
|
||||
# Takes the AST node as argument and yields matching node if block given
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user