diff options
| author | Jack Nagel | 2013-09-17 21:25:38 -0500 |
|---|---|---|
| committer | Jack Nagel | 2013-09-17 21:29:50 -0500 |
| commit | 274c0df3cfaae3dcf012d6b4eee111e0f33755f1 (patch) | |
| tree | b60eb05759971bc8ee61f2804cdb0107c8c9c6cf /Library/Homebrew/resource.rb | |
| parent | bf40e9235d30334d31929d69d682ffaf1c9cee94 (diff) | |
| download | homebrew-274c0df3cfaae3dcf012d6b4eee111e0f33755f1.tar.bz2 | |
Decouple Resource from SoftwareSpec
Diffstat (limited to 'Library/Homebrew/resource.rb')
| -rw-r--r-- | Library/Homebrew/resource.rb | 68 |
1 files changed, 64 insertions, 4 deletions
diff --git a/Library/Homebrew/resource.rb b/Library/Homebrew/resource.rb index 02de04214..df5eef9d2 100644 --- a/Library/Homebrew/resource.rb +++ b/Library/Homebrew/resource.rb @@ -1,3 +1,7 @@ +require 'download_strategy' +require 'checksum' +require 'version' + # A Resource describes a tarball that a formula needs in addition # to the formula's own download. class Resource @@ -7,16 +11,23 @@ class Resource # This is the resource name attr_reader :name - def initialize name, spec + attr_reader :checksum, :mirrors, :specs, :using + + def initialize name @name = name - @spec = spec + @url = nil + @version = nil + @mirrors = [] + @specs = {} + @checksum = nil + @using = nil end # Formula name must be set after the DSL, as we have no access to the # formula name before initialization of the formula def set_owner owner @owner = owner - @downloader = @spec.download_strategy.new("#{owner}--#{name}", @spec) + @downloader = download_strategy.new("#{owner}--#{name}", self) end # Download the resource @@ -36,6 +47,10 @@ class Resource end end + def download_strategy + @download_strategy ||= DownloadStrategyDetector.detect(url, using) + end + def cached_download @downloader.cached_location end @@ -49,6 +64,51 @@ class Resource end def verify_download_integrity fn - @spec.verify_download_integrity(fn) + fn.verify_checksum(checksum) + rescue ChecksumMissingError + opoo "Cannot verify package integrity" + puts "The formula did not provide a download checksum" + puts "For your reference the SHA1 is: #{fn.sha1}" + rescue ChecksumMismatchError => e + e.advice = <<-EOS.undent + Archive: #{fn} + (To retry an incomplete download, remove the file above.) + EOS + raise e + end + + Checksum::TYPES.each do |cksum| + class_eval <<-EOS, __FILE__, __LINE__ + 1 + def #{cksum}(val) + @checksum = Checksum.new(:#{cksum}, val) + end + EOS + end + + def url val=nil, specs={} + return @url if val.nil? + @url = val + @using = specs.delete(:using) + @specs.merge!(specs) + end + + def version val=nil + @version ||= detect_version(val) + end + + def mirror val + mirrors << val + end + + private + + def detect_version(val) + case val + when nil then Version.detect(url, specs) + when String then Version.new(val) + when Hash then Version.new_with_scheme(*val.shift) + else + raise TypeError, "version '#{val.inspect}' should be a string" + end end end |
