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



1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1034

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



1031
1032
1033
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1031

def checksum
  @checksum
end

#mirrorsObject (readonly)

Returns the value of attribute mirrors



1031
1032
1033
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1031

def mirrors
  @mirrors
end

#nameObject (readonly)

Returns the value of attribute name



1031
1032
1033
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1031

def name
  @name
end

#ownerObject (readonly)

Returns the value of attribute owner



1031
1032
1033
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1031

def owner
  @owner
end

#problemsObject (readonly)

Returns the value of attribute problems



1032
1033
1034
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1032

def problems
  @problems
end

#spec_nameObject (readonly)

Returns the value of attribute spec_name



1032
1033
1034
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1032

def spec_name
  @spec_name
end

#specsObject (readonly)

Returns the value of attribute specs



1031
1032
1033
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1031

def specs
  @specs
end

#urlObject (readonly)

Returns the value of attribute url



1031
1032
1033
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1031

def url
  @url
end

#usingObject (readonly)

Returns the value of attribute using



1031
1032
1033
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1031

def using
  @using
end

#versionObject (readonly)

Returns the value of attribute version



1031
1032
1033
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1031

def version
  @version
end

Class Method Details

.curl_openssl_and_depsObject



1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1110

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



1049
1050
1051
1052
1053
1054
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1049

def audit
  audit_version
  audit_download_strategy
  audit_urls
  self
end

#audit_download_strategyObject



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
1101
1102
1103
1104
1105
1106
1107
1108
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1076

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



1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1122

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



1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1056

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



1149
1150
1151
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1149

def problem(text)
  @problems << text
end