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.



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

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.



997
998
999
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 997

def checksum
  @checksum
end

#mirrorsObject (readonly)

Returns the value of attribute mirrors.



997
998
999
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 997

def mirrors
  @mirrors
end

#nameObject (readonly)

Returns the value of attribute name.



997
998
999
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 997

def name
  @name
end

#ownerObject (readonly)

Returns the value of attribute owner.



997
998
999
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 997

def owner
  @owner
end

#problemsObject (readonly)

Returns the value of attribute problems.



997
998
999
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 997

def problems
  @problems
end

#spec_nameObject (readonly)

Returns the value of attribute spec_name.



997
998
999
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 997

def spec_name
  @spec_name
end

#specsObject (readonly)

Returns the value of attribute specs.



997
998
999
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 997

def specs
  @specs
end

#urlObject (readonly)

Returns the value of attribute url.



997
998
999
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 997

def url
  @url
end

#usingObject (readonly)

Returns the value of attribute using.



997
998
999
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 997

def using
  @using
end

#versionObject (readonly)

Returns the value of attribute version.



997
998
999
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 997

def version
  @version
end

Class Method Details

.curl_openssl_and_depsObject



1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1063

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



1014
1015
1016
1017
1018
1019
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1014

def audit
  audit_version
  audit_download_strategy
  audit_urls
  self
end

#audit_download_strategyObject



1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1033

def audit_download_strategy
  url_strategy = DownloadStrategyDetector.detect(url)

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

  return unless using

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

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

    if url.match?(%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



1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1075

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.match?(%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



1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1021

def audit_version
  if version.nil?
    problem "missing version"
  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
end

#problem(text) ⇒ Object



1102
1103
1104
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1102

def problem(text)
  @problems << text
end