Decouple Resource from SoftwareSpec
This commit is contained in:
parent
32315c9348
commit
eb3071332c
@ -720,11 +720,11 @@ class Formula
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Define a named resource using a SoftwareSpec style block
|
# Define a named resource using a SoftwareSpec style block
|
||||||
def resource res_name, &block
|
def resource name, &block
|
||||||
raise DuplicateResourceError.new(res_name) if resources.has_key?(res_name)
|
raise DuplicateResourceError.new(name) if resources.has_key?(name)
|
||||||
spec = SoftwareSpec.new
|
resource = Resource.new(name)
|
||||||
spec.instance_eval(&block)
|
resource.instance_eval(&block)
|
||||||
resources[res_name] = Resource.new(res_name, spec)
|
resources[name] = resource
|
||||||
end
|
end
|
||||||
|
|
||||||
def dependencies
|
def dependencies
|
||||||
|
|||||||
@ -1,3 +1,7 @@
|
|||||||
|
require 'download_strategy'
|
||||||
|
require 'checksum'
|
||||||
|
require 'version'
|
||||||
|
|
||||||
# A Resource describes a tarball that a formula needs in addition
|
# A Resource describes a tarball that a formula needs in addition
|
||||||
# to the formula's own download.
|
# to the formula's own download.
|
||||||
class Resource
|
class Resource
|
||||||
@ -7,16 +11,23 @@ class Resource
|
|||||||
# This is the resource name
|
# This is the resource name
|
||||||
attr_reader :name
|
attr_reader :name
|
||||||
|
|
||||||
def initialize name, spec
|
attr_reader :checksum, :mirrors, :specs, :using
|
||||||
|
|
||||||
|
def initialize name
|
||||||
@name = name
|
@name = name
|
||||||
@spec = spec
|
@url = nil
|
||||||
|
@version = nil
|
||||||
|
@mirrors = []
|
||||||
|
@specs = {}
|
||||||
|
@checksum = nil
|
||||||
|
@using = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
# Formula name must be set after the DSL, as we have no access to the
|
# Formula name must be set after the DSL, as we have no access to the
|
||||||
# formula name before initialization of the formula
|
# formula name before initialization of the formula
|
||||||
def set_owner owner
|
def set_owner owner
|
||||||
@owner = owner
|
@owner = owner
|
||||||
@downloader = @spec.download_strategy.new("#{owner}--#{name}", @spec)
|
@downloader = download_strategy.new("#{owner}--#{name}", self)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Download the resource
|
# Download the resource
|
||||||
@ -36,6 +47,10 @@ class Resource
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def download_strategy
|
||||||
|
@download_strategy ||= DownloadStrategyDetector.detect(url, using)
|
||||||
|
end
|
||||||
|
|
||||||
def cached_download
|
def cached_download
|
||||||
@downloader.cached_location
|
@downloader.cached_location
|
||||||
end
|
end
|
||||||
@ -49,6 +64,51 @@ class Resource
|
|||||||
end
|
end
|
||||||
|
|
||||||
def verify_download_integrity fn
|
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
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user