aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/resource.rb
diff options
context:
space:
mode:
authorJack Nagel2013-09-17 21:25:38 -0500
committerJack Nagel2013-09-17 21:29:50 -0500
commiteb3071332c07c7841c44020e2a644889d131f0c6 (patch)
tree5548cdaf011cefc18f76095dd6c79e9b2b55a251 /Library/Homebrew/resource.rb
parent32315c93480edea8cdf02c97876ffca6b1d99b32 (diff)
downloadbrew-eb3071332c07c7841c44020e2a644889d131f0c6.tar.bz2
Decouple Resource from SoftwareSpec
Diffstat (limited to 'Library/Homebrew/resource.rb')
-rw-r--r--Library/Homebrew/resource.rb68
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