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.



1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1038

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.



1035
1036
1037
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1035

def checksum
  @checksum
end

#mirrorsObject (readonly)

Returns the value of attribute mirrors.



1035
1036
1037
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1035

def mirrors
  @mirrors
end

#nameObject (readonly)

Returns the value of attribute name.



1035
1036
1037
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1035

def name
  @name
end

#ownerObject (readonly)

Returns the value of attribute owner.



1035
1036
1037
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1035

def owner
  @owner
end

#problemsObject (readonly)

Returns the value of attribute problems.



1036
1037
1038
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1036

def problems
  @problems
end

#spec_nameObject (readonly)

Returns the value of attribute spec_name.



1036
1037
1038
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1036

def spec_name
  @spec_name
end

#specsObject (readonly)

Returns the value of attribute specs.



1035
1036
1037
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1035

def specs
  @specs
end

#urlObject (readonly)

Returns the value of attribute url.



1035
1036
1037
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1035

def url
  @url
end

#usingObject (readonly)

Returns the value of attribute using.



1035
1036
1037
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1035

def using
  @using
end

#versionObject (readonly)

Returns the value of attribute version.



1035
1036
1037
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1035

def version
  @version
end

Class Method Details

.curl_openssl_and_depsObject



1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1114

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



1053
1054
1055
1056
1057
1058
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1053

def audit
  audit_version
  audit_download_strategy
  audit_urls
  self
end

#audit_download_strategyObject



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
1109
1110
1111
1112
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1080

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



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

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



1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1060

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



1153
1154
1155
# File 'brew/Library/Homebrew/dev-cmd/audit.rb', line 1153

def problem(text)
  @problems << text
end