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



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

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



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

def checksum
  @checksum
end

#mirrorsObject (readonly)

Returns the value of attribute mirrors



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

def mirrors
  @mirrors
end

#nameObject (readonly)

Returns the value of attribute name



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

def name
  @name
end

#ownerObject (readonly)

Returns the value of attribute owner



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

def owner
  @owner
end

#problemsObject (readonly)

Returns the value of attribute problems



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

def problems
  @problems
end

#spec_nameObject (readonly)

Returns the value of attribute spec_name



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

def spec_name
  @spec_name
end

#specsObject (readonly)

Returns the value of attribute specs



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

def specs
  @specs
end

#urlObject (readonly)

Returns the value of attribute url



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

def url
  @url
end

#usingObject (readonly)

Returns the value of attribute using



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

def using
  @using
end

#versionObject (readonly)

Returns the value of attribute version



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

def version
  @version
end

Class Method Details

.curl_openssl_and_depsObject



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

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



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

def audit
  audit_version
  audit_download_strategy
  audit_urls
  self
end

#audit_download_strategyObject



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

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.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



1121
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
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1121

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



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

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.match?(/_\d+$/)

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

#problem(text) ⇒ Object



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

def problem(text)
  @problems << text
end