diff options
| author | Gautham Goli | 2017-06-01 00:57:24 +0530 |
|---|---|---|
| committer | Gautham Goli | 2017-06-16 19:45:16 +0530 |
| commit | 4d7a98341556614818223060ca94413b17e3d1e6 (patch) | |
| tree | 16562b6d5e4f34ed3184bbe2ebf90e0e76d3893f /Library/Homebrew/rubocops | |
| parent | 3b376bfa2f8d3e61dc1164304d4f8d64de6e6014 (diff) | |
| download | brew-4d7a98341556614818223060ca94413b17e3d1e6.tar.bz2 | |
audit: Port audit_checksum method to rubocop and add tests
Diffstat (limited to 'Library/Homebrew/rubocops')
| -rw-r--r-- | Library/Homebrew/rubocops/checksum_cop.rb | 61 | ||||
| -rw-r--r-- | Library/Homebrew/rubocops/extend/formula_cop.rb | 9 |
2 files changed, 68 insertions, 2 deletions
diff --git a/Library/Homebrew/rubocops/checksum_cop.rb b/Library/Homebrew/rubocops/checksum_cop.rb new file mode 100644 index 000000000..17ce1e83e --- /dev/null +++ b/Library/Homebrew/rubocops/checksum_cop.rb @@ -0,0 +1,61 @@ +require_relative "./extend/formula_cop" + +module RuboCop + module Cop + module FormulaAudit + class Checksum < FormulaCop + def audit_formula(_node, _class_node, _parent_class_node, body_node) + %w[stable devel head].each do |name| + next unless spec_node = find_block(body_node, name.to_sym) + _, _, spec_body = *spec_node + audit_checksums(spec_body, name) + if name == "stable" + resource_blocks = find_blocks(body_node, :resource) + + find_all_blocks(spec_body, :resource) + else + resource_blocks = find_all_blocks(spec_body, :resource) + end + resource_blocks.each do |rb| + _, _, resource_body = *rb + audit_checksums(resource_body, name, string_content(parameters(rb).first)) + end + end + end + + def audit_checksums(node, spec, resource_name = nil) + msg_prefix = if resource_name + "#{spec} resource \"#{resource_name}\": " + else + "#{spec}: " + end + if find_node_method_by_name(node, :md5) + problem "#{msg_prefix}MD5 checksums are deprecated, please use SHA256" + end + + if find_node_method_by_name(node, :sha1) + problem "#{msg_prefix}SHA1 checksums are deprecated, please use SHA256" + end + + checksum_node = find_node_method_by_name(node, :sha256) + return if checksum_node.nil? + checksum = parameters(checksum_node).first + if string_content(checksum).size.zero? + problem "#{msg_prefix}sha256 is empty" + return + end + + if string_content(checksum).size != 64 && regex_match_group(checksum, /^\w*$/) + problem "#{msg_prefix}sha256 should be 64 characters" + end + + unless regex_match_group(checksum, /^[a-f0-9]+$/i) + problem "#{msg_prefix}sha256 contains invalid characters" + end + + return unless regex_match_group(checksum, /[A-F]+/) + problem "#{msg_prefix}sha256 should be lowercase" + end + end + end + end +end diff --git a/Library/Homebrew/rubocops/extend/formula_cop.rb b/Library/Homebrew/rubocops/extend/formula_cop.rb index 75a3e72d5..98280841c 100644 --- a/Library/Homebrew/rubocops/extend/formula_cop.rb +++ b/Library/Homebrew/rubocops/extend/formula_cop.rb @@ -173,6 +173,12 @@ module RuboCop node.each_child_node(:block).select { |block_node| block_name == block_node.method_name } end + # Returns an array of block nodes of any depth below node in AST + def find_all_blocks(node, block_name) + return if node.nil? + node.each_descendant(:block).select { |block_node| block_name == block_node.method_name } + end + # Returns a method definition node with method_name def find_method_def(node, method_name) return if node.nil? @@ -250,8 +256,7 @@ module RuboCop # Returns the array of arguments of the method_node def parameters(method_node) - return unless method_node.send_type? - method_node.method_args + method_node.method_args if method_node.send_type? || method_node.block_type? end # Returns true if the given parameters are present in method call |
