Class: Homebrew::ResourceAuditor

Inherits:
Object
  • Object
show all
Defined in:
brew/Library/Homebrew/dev-cmd/audit.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(resource, spec_name, options = {}) ⇒ ResourceAuditor

Returns a new instance of ResourceAuditor



978
979
980
981
982
983
984
985
986
987
988
989
990
991
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 978

def initialize(resource, spec_name, options = {})
  @name     = resource.name
  @version  = resource.version
  @checksum = resource.checksum
  @url      = resource.url
  @mirrors  = resource.mirrors
  @using    = resource.using
  @specs    = resource.specs
  @owner    = resource.owner
  @spec_name = spec_name
  @online    = options[:online]
  @strict    = options[:strict]
  @problems  = []
end

Instance Attribute Details

#checksumObject (readonly)

Returns the value of attribute checksum



975
976
977
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 975

def checksum
  @checksum
end

#mirrorsObject (readonly)

Returns the value of attribute mirrors



975
976
977
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 975

def mirrors
  @mirrors
end

#nameObject (readonly)

Returns the value of attribute name



975
976
977
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 975

def name
  @name
end

#ownerObject (readonly)

Returns the value of attribute owner



975
976
977
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 975

def owner
  @owner
end

#problemsObject (readonly)

Returns the value of attribute problems



976
977
978
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 976

def problems
  @problems
end

#spec_nameObject (readonly)

Returns the value of attribute spec_name



976
977
978
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 976

def spec_name
  @spec_name
end

#specsObject (readonly)

Returns the value of attribute specs



975
976
977
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 975

def specs
  @specs
end

#urlObject (readonly)

Returns the value of attribute url



975
976
977
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 975

def url
  @url
end

#usingObject (readonly)

Returns the value of attribute using



975
976
977
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 975

def using
  @using
end

#versionObject (readonly)

Returns the value of attribute version



975
976
977
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 975

def version
  @version
end

Class Method Details

.curl_openssl_and_depsObject



1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1054

def self.curl_openssl_and_deps
  @curl_openssl_and_deps ||= begin
    formulae_names = ["curl", "openssl"]
    formulae_names += formulae_names.flat_map do |f|
      Formula[f].recursive_dependencies.map(&:name)
    end
    formulae_names.uniq
  rescue FormulaUnavailableError
    []
  end
end

Instance Method Details

#auditObject



993
994
995
996
997
998
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 993

def audit
  audit_version
  audit_download_strategy
  audit_urls
  self
end

#audit_download_strategyObject



1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1020

def audit_download_strategy
  if url =~ %r{^(cvs|bzr|hg|fossil)://} || url =~ %r{^(svn)\+http://}
    problem "Use of the #{$&} scheme is deprecated, pass `:using => :#{Regexp.last_match(1)}` instead"
  end

  url_strategy = DownloadStrategyDetector.detect(url)

  if using == :git || url_strategy == GitDownloadStrategy
    problem "Git should specify :revision when a :tag is specified." if specs[:tag] && !specs[:revision]
  end

  return unless using

  if using == :cvs
    mod = specs[:module]

    problem "Redundant :module value in URL" if mod == name

    if url =~ %r{:[^/]+$}
      mod = url.split(":").last

      if mod == name
        problem "Redundant CVS module appended to URL"
      else
        problem "Specify CVS module as `:module => \"#{mod}\"` instead of appending it to the URL"
      end
    end
  end

  return unless url_strategy == DownloadStrategyDetector.detect("", using)

  problem "Redundant :using value in URL"
end

#audit_urlsObject



1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1066

def audit_urls
  return unless @online

  urls = [url] + mirrors
  urls.each do |url|
    next if !@strict && mirrors.include?(url)

    strategy = DownloadStrategyDetector.detect(url, using)
    if strategy <= CurlDownloadStrategy && !url.start_with?("file")
      # A `brew mirror`'ed URL is usually not yet reachable at the time of
      # pull request.
      next if url =~ %r{^https://dl.bintray.com/homebrew/mirror/}

      if http_content_problem = curl_check_http_content(url)
        problem http_content_problem
      end
    elsif strategy <= GitDownloadStrategy
      problem "The URL #{url} is not a valid git URL" unless Utils.git_remote_exists? url
    elsif strategy <= SubversionDownloadStrategy
      next unless DevelopmentTools.subversion_handles_most_https_certificates?
      next unless Utils.svn_available?

      problem "The URL #{url} is not a valid svn URL" unless Utils.svn_remote_exists? url
    end
  end
end

#audit_versionObject



1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1000

def audit_version
  if version.nil?
    problem "missing version"
  elsif version.blank?
    problem "version is set to an empty string"
  elsif !version.detected_from_url?
    version_text = version
    version_url = Version.detect(url, specs)
    if version_url.to_s == version_text.to_s && version.instance_of?(Version)
      problem "version #{version_text} is redundant with version scanned from URL"
    end
  end

  problem "version #{version} should not have a leading 'v'" if version.to_s.start_with?("v")

  return unless version.to_s =~ /_\d+$/

  problem "version #{version} should not end with an underline and a number"
end

#problem(text) ⇒ Object



1093
1094
1095
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1093

def problem(text)
  @problems << text
end