aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/software_spec.rb
diff options
context:
space:
mode:
authorJack Nagel2013-09-14 10:16:52 -0500
committerJack Nagel2013-09-14 10:16:52 -0500
commit11c4e241248a3ff9e4ed3dd534a06a406da8dccc (patch)
tree3abf7aa70aa35eae40c124a0163f296a76a47b6b /Library/Homebrew/software_spec.rb
parent798d322a4297073c1c75ec0490aec8b2af1f2c57 (diff)
downloadhomebrew-11c4e241248a3ff9e4ed3dd534a06a406da8dccc.tar.bz2
Move SoftwareSpec to a separate file
Diffstat (limited to 'Library/Homebrew/software_spec.rb')
-rw-r--r--Library/Homebrew/software_spec.rb111
1 files changed, 111 insertions, 0 deletions
diff --git a/Library/Homebrew/software_spec.rb b/Library/Homebrew/software_spec.rb
new file mode 100644
index 000000000..28c4cd431
--- /dev/null
+++ b/Library/Homebrew/software_spec.rb
@@ -0,0 +1,111 @@
+require 'download_strategy'
+require 'checksum'
+require 'version'
+
+class SoftwareSpec
+ attr_reader :checksum, :mirrors, :specs
+ attr_reader :using # for auditing
+
+ def initialize url=nil, version=nil
+ @url = url
+ @version = version
+ @mirrors = []
+ @specs = {}
+ @checksum = nil
+ @using = nil
+ end
+
+ def download_strategy
+ @download_strategy ||= DownloadStrategyDetector.detect(url, using)
+ end
+
+ def 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
+
+ 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
+
+ # The methods that follow are used in the block-form DSL spec methods
+ 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
+end
+
+class HeadSoftwareSpec < SoftwareSpec
+ def initialize url=nil, version=Version.new(:HEAD)
+ super
+ end
+
+ def verify_download_integrity fn
+ return
+ end
+end
+
+class Bottle < SoftwareSpec
+ attr_writer :url
+ attr_rw :root_url, :prefix, :cellar, :revision
+
+ def initialize
+ super
+ @revision = 0
+ @prefix = '/usr/local'
+ @cellar = '/usr/local/Cellar'
+ end
+
+ # Checksum methods in the DSL's bottle block optionally take
+ # a Hash, which indicates the platform the checksum applies on.
+ Checksum::TYPES.each do |cksum|
+ class_eval <<-EOS, __FILE__, __LINE__ + 1
+ def #{cksum}(val=nil)
+ return @#{cksum} if val.nil?
+ @#{cksum} ||= Hash.new
+ case val
+ when Hash
+ key, value = val.shift
+ @#{cksum}[value] = Checksum.new(:#{cksum}, key)
+ end
+
+ if @#{cksum}.has_key? bottle_tag
+ @checksum = @#{cksum}[bottle_tag]
+ end
+ end
+ EOS
+ end
+end