diff options
| -rw-r--r-- | Library/Homebrew/formula.rb | 1 | ||||
| -rw-r--r-- | Library/Homebrew/formula_support.rb | 113 | ||||
| -rw-r--r-- | Library/Homebrew/software_spec.rb | 111 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_software_spec.rb | 2 |
4 files changed, 113 insertions, 114 deletions
diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index ecae17544..313e5f850 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -11,6 +11,7 @@ require 'compilers' require 'build_environment' require 'build_options' require 'formulary' +require 'software_spec' class Formula diff --git a/Library/Homebrew/formula_support.rb b/Library/Homebrew/formula_support.rb index 69420ff0f..d70a0aa59 100644 --- a/Library/Homebrew/formula_support.rb +++ b/Library/Homebrew/formula_support.rb @@ -1,118 +1,5 @@ -require 'download_strategy' -require 'checksum' -require 'version' - FormulaConflict = Struct.new(:name, :reason) -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 - - # Used to annotate formulae that duplicate OS X provided software # or cause conflicts when linked in. class KegOnlyReason 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 diff --git a/Library/Homebrew/test/test_software_spec.rb b/Library/Homebrew/test/test_software_spec.rb index 856bea611..9cc491a07 100644 --- a/Library/Homebrew/test/test_software_spec.rb +++ b/Library/Homebrew/test/test_software_spec.rb @@ -1,5 +1,5 @@ require 'testing_env' -require 'formula_support' +require 'software_spec' require 'bottles' class SoftwareSpecTests < Test::Unit::TestCase |
