diff options
| author | Jack Nagel | 2014-03-10 14:56:02 -0500 |
|---|---|---|
| committer | Jack Nagel | 2014-03-10 14:56:02 -0500 |
| commit | 2bf3e69866d30ccfea48f123aab2e9c9bfca0293 (patch) | |
| tree | 6fa9d6576412ed6a38856ffce13aa87a279371d1 /Library/Homebrew | |
| parent | ee7d227a2f31b9f30aeaba4dae7b52d3999038b6 (diff) | |
| download | homebrew-2bf3e69866d30ccfea48f123aab2e9c9bfca0293.tar.bz2 | |
Make bottle implementation more generic
Diffstat (limited to 'Library/Homebrew')
| -rw-r--r-- | Library/Homebrew/bottles.rb | 18 | ||||
| -rw-r--r-- | Library/Homebrew/formula.rb | 48 | ||||
| -rw-r--r-- | Library/Homebrew/software_spec.rb | 49 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_formula.rb | 7 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_formula_spec_selection.rb | 21 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_software_spec.rb | 4 |
6 files changed, 66 insertions, 81 deletions
diff --git a/Library/Homebrew/bottles.rb b/Library/Homebrew/bottles.rb index fa911d200..35654cd23 100644 --- a/Library/Homebrew/bottles.rb +++ b/Library/Homebrew/bottles.rb @@ -3,12 +3,9 @@ require 'os/mac' require 'extend/ARGV' require 'bottle_version' -def bottle_filename f, options={} +def bottle_filename options={} options = { :tag => bottle_tag }.merge(options) - name = f.name.downcase - version = PkgVersion.new(f.stable.version, f.revision) - options[:revision] ||= f.bottle.revision.to_i if f.bottle - "#{name}-#{version}#{bottle_native_suffix(options)}" + "#{options[:name]}-#{options[:version]}#{bottle_native_suffix(options)}" end def install_bottle? f, options={:warn=>false} @@ -16,7 +13,8 @@ def install_bottle? f, options={:warn=>false} return true if ARGV.force_bottle? return false unless f.pour_bottle? return false unless f.default_build? - return false unless bottle_current?(f) + return false unless f.bottle + if f.bottle.cellar != :any && f.bottle.cellar != HOMEBREW_CELLAR.to_s if options[:warn] opoo "Building source; cellar of #{f}'s bottle is #{f.bottle.cellar}" @@ -33,10 +31,6 @@ def built_as_bottle? f tab.built_as_bottle end -def bottle_current? f - f.bottle and f.bottle.url and not f.bottle.checksum.empty? -end - def bottle_file_outdated? f, file filename = file.basename.to_s return nil unless f and f.bottle and f.bottle.url \ @@ -66,8 +60,8 @@ def bottle_regex Pathname::BOTTLE_EXTNAME_RX end -def bottle_url f, tag=bottle_tag - "#{f.bottle.root_url}/#{bottle_filename(f, :tag => tag)}" +def bottle_url(root_url, filename_options={}) + "#{root_url}/#{bottle_filename(filename_options)}" end def bottle_tag diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 57c8a2edf..f2ba1a235 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -18,7 +18,7 @@ class Formula extend BuildEnvironmentDSL attr_reader :name, :path, :homepage, :build - attr_reader :stable, :bottle, :devel, :head, :active_spec + attr_reader :stable, :devel, :head, :active_spec attr_reader :pkg_version, :revision # The current working directory during builds and tests. @@ -41,31 +41,11 @@ class Formula set_spec :stable set_spec :devel set_spec :head - set_spec :bottle do |bottle| - # Ensure the bottle URL is set. If it does not have a checksum, - # then a bottle is not available for the current platform. - # TODO: push this down into Bottle; we can pass the formula instance - # into a validation method on the bottle instance. - unless bottle.checksum.nil? || bottle.checksum.empty? - @bottle = bottle - bottle.url ||= bottle_url(self, bottle.current_tag) - bottle.version = PkgVersion.new(stable.version, revision) - end - end @active_spec = determine_active_spec validate_attributes :url, :name, :version @build = determine_build_options - - # TODO: @pkg_version is already set for bottles, since constructing it - # requires passing in the active_spec version. This should be fixed by - # making the bottle an attribute of SoftwareSpec rather than a separate - # spec itself. - if active_spec == bottle - @pkg_version = bottle.version - else - @pkg_version = PkgVersion.new(version, revision) - end + @pkg_version = PkgVersion.new(version, revision) @pin = FormulaPin.new(self) @@ -74,21 +54,16 @@ class Formula def set_spec(name) spec = self.class.send(name) - if block_given? && yield(spec) || spec.url + if spec.url spec.owner = self instance_variable_set("@#{name}", spec) end end - def select_bottle? - !ARGV.build_bottle? && install_bottle?(self) - end - def determine_active_spec case when head && ARGV.build_head? then head # --HEAD when devel && ARGV.build_devel? then devel # --devel - when bottle && select_bottle? then bottle # bottle available when stable then stable when devel && stable.nil? then devel # devel-only when head && stable.nil? then head # head-only @@ -115,6 +90,10 @@ class Formula build end + def bottle + Bottle.new(self, active_spec.bottle_specification) if active_spec.bottled? + end + def url; active_spec.url; end def version; active_spec.version; end def mirrors; active_spec.mirrors; end @@ -699,7 +678,7 @@ class Formula attr_rw :homepage, :plist_startup, :plist_manual, :revision def specs - @specs ||= [stable, devel, head, bottle].freeze + @specs ||= [stable, devel, head].freeze end def url val, specs={} @@ -722,6 +701,10 @@ class Formula EOS end + def bottle *, &block + stable.bottle(&block) + end + def build stable.build end @@ -732,13 +715,6 @@ class Formula @stable.instance_eval(&block) end - def bottle *, &block - @bottle ||= Bottle.new - return @bottle unless block_given? - @bottle.instance_eval(&block) - @bottle.version = @stable.version - end - def devel &block @devel ||= SoftwareSpec.new return @devel unless block_given? diff --git a/Library/Homebrew/software_spec.rb b/Library/Homebrew/software_spec.rb index fa727d093..9574dd2d3 100644 --- a/Library/Homebrew/software_spec.rb +++ b/Library/Homebrew/software_spec.rb @@ -12,6 +12,7 @@ class SoftwareSpec attr_reader :name attr_reader :build, :resources, :owner attr_reader :dependency_collector + attr_reader :bottle_specification def_delegators :@resource, :stage, :fetch, :verify_download_integrity def_delegators :@resource, :cached_download, :clear_cache @@ -23,6 +24,7 @@ class SoftwareSpec @resources = {} @build = BuildOptions.new(ARGV.options_only) @dependency_collector = DependencyCollector.new + @bottle_specification = BottleSpecification.new end def owner= owner @@ -41,6 +43,14 @@ class SoftwareSpec dependency_collector.add(@resource) end + def bottled? + bottle_specification.fully_specified? + end + + def bottle &block + bottle_specification.instance_eval(&block) + end + def resource? name resources.has_key?(name) end @@ -87,20 +97,47 @@ class HeadSoftwareSpec < SoftwareSpec end end -class Bottle < SoftwareSpec - attr_rw :root_url, :prefix, :cellar, :revision - attr_accessor :current_tag +class Bottle + extend Forwardable + + attr_reader :resource, :prefix, :cellar, :revision + + def_delegators :resource, :url, :fetch, :verify_download_integrity + def_delegators :resource, :downloader, :cached_download, :clear_cache - def_delegators :@resource, :version=, :url= + def initialize(f, spec) + @resource = Resource.new + @resource.owner = f + @resource.url = bottle_url( + spec.root_url, + :name => f.name, + :version => f.pkg_version, + :revision => spec.revision, + :tag => spec.current_tag + ) + @resource.version = f.pkg_version + @resource.checksum = spec.checksum + @prefix = spec.prefix + @cellar = spec.cellar + @revision = spec.revision + end +end + +class BottleSpecification + attr_rw :root_url, :prefix, :cellar, :revision + attr_reader :current_tag, :checksum def initialize - super @revision = 0 @prefix = '/usr/local' @cellar = '/usr/local/Cellar' @root_url = 'https://downloads.sf.net/project/machomebrew/Bottles' end + def fully_specified? + checksum && !checksum.empty? + 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| @@ -115,7 +152,7 @@ class Bottle < SoftwareSpec end cksum, current_tag = @#{cksum}.fetch_bottle_for(bottle_tag) - @resource.checksum = cksum if cksum + @checksum = cksum if cksum @current_tag = current_tag if cksum end EOS diff --git a/Library/Homebrew/test/test_formula.rb b/Library/Homebrew/test/test_formula.rb index 9c168e1e6..910726e58 100644 --- a/Library/Homebrew/test/test_formula.rb +++ b/Library/Homebrew/test/test_formula.rb @@ -182,7 +182,6 @@ class FormulaTests < Test::Unit::TestCase assert_equal f.stable, f.active_spec assert_instance_of SoftwareSpec, f.stable - assert_instance_of Bottle, f.bottle assert_instance_of SoftwareSpec, f.devel assert_instance_of HeadSoftwareSpec, f.head end @@ -216,7 +215,7 @@ class FormulaTests < Test::Unit::TestCase def test_class_specs_are_always_initialized f = formula { url 'foo-1.0' } - %w{stable devel head bottle}.each do |spec| + %w{stable devel head}.each do |spec| assert_kind_of SoftwareSpec, f.class.send(spec) end end @@ -224,7 +223,7 @@ class FormulaTests < Test::Unit::TestCase def test_incomplete_instance_specs_are_not_accessible f = formula { url 'foo-1.0' } - %w{devel head bottle}.each { |spec| assert_nil f.send(spec) } + %w{devel head}.each { |spec| assert_nil f.send(spec) } end def test_honors_attributes_declared_before_specs @@ -234,7 +233,7 @@ class FormulaTests < Test::Unit::TestCase devel { url 'foo-1.1' } end - %w{stable devel head bottle}.each do |spec| + %w{stable devel head}.each do |spec| assert_equal 'foo', f.class.send(spec).deps.first.name end end diff --git a/Library/Homebrew/test/test_formula_spec_selection.rb b/Library/Homebrew/test/test_formula_spec_selection.rb index a572623d8..af23a002c 100644 --- a/Library/Homebrew/test/test_formula_spec_selection.rb +++ b/Library/Homebrew/test/test_formula_spec_selection.rb @@ -34,17 +34,6 @@ class FormulaSpecSelectionTests < Test::Unit::TestCase assert_spec_selected :devel end - def test_selects_bottle_when_available - formula do - def install_bottle?(*); true; end - - url 'foo-1.0' - bottle { sha1 TEST_SHA1 => bottle_tag } - end - - assert_spec_selected :bottle - end - def test_selects_stable_by_default formula do url 'foo-1.0' @@ -119,14 +108,4 @@ class FormulaSpecSelectionTests < Test::Unit::TestCase assert_spec_unset :devel assert_spec_selected :stable end - - def test_incomplete_bottle_not_set - formula do - url 'foo-1.0' - bottle { sha1 TEST_SHA1 => :some_nonexistent_thing } - end - - assert_spec_unset :bottle - assert_spec_selected :stable - end end diff --git a/Library/Homebrew/test/test_software_spec.rb b/Library/Homebrew/test/test_software_spec.rb index bd226c5f9..c35294320 100644 --- a/Library/Homebrew/test/test_software_spec.rb +++ b/Library/Homebrew/test/test_software_spec.rb @@ -98,9 +98,9 @@ class HeadSoftwareSpecTests < Test::Unit::TestCase end end -class BottleTests < Test::Unit::TestCase +class BottleSpecificationTests < Test::Unit::TestCase def setup - @spec = Bottle.new + @spec = BottleSpecification.new end def test_checksum_setters |
