diff options
| author | Jack Nagel | 2013-09-17 21:25:38 -0500 | 
|---|---|---|
| committer | Jack Nagel | 2013-09-17 21:29:50 -0500 | 
| commit | eb3071332c07c7841c44020e2a644889d131f0c6 (patch) | |
| tree | 5548cdaf011cefc18f76095dd6c79e9b2b55a251 /Library/Homebrew/resource.rb | |
| parent | 32315c93480edea8cdf02c97876ffca6b1d99b32 (diff) | |
| download | brew-eb3071332c07c7841c44020e2a644889d131f0c6.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  | 
