From 10fda9e9b910f9161a8f174e13cf0f31edfbde80 Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Thu, 19 Jun 2014 21:35:47 -0500 Subject: [PATCH] Decouple spec selection from ARGV --- Library/Homebrew/build.rb | 3 +- Library/Homebrew/extend/ARGV.rb | 15 ++++-- Library/Homebrew/formula.rb | 15 ++---- Library/Homebrew/formula_installer.rb | 7 ++- Library/Homebrew/test/test_formula.rb | 12 ++--- .../test/test_formula_spec_selection.rb | 53 ++++++++++--------- 6 files changed, 55 insertions(+), 50 deletions(-) diff --git a/Library/Homebrew/build.rb b/Library/Homebrew/build.rb index 5a320f3b87..03a0189d9b 100644 --- a/Library/Homebrew/build.rb +++ b/Library/Homebrew/build.rb @@ -40,7 +40,8 @@ def main # can be inconvenient for the user. But we need to be safe. system "/usr/bin/sudo", "-k" - Build.new(Formula.factory($0)).install + formula = Formulary.factory($0, ARGV.spec) + Build.new(formula).install rescue Exception => e unless error_pipe.nil? e.continuation = nil if ARGV.debug? diff --git a/Library/Homebrew/extend/ARGV.rb b/Library/Homebrew/extend/ARGV.rb index 25c2f882af..bb6a56fe93 100644 --- a/Library/Homebrew/extend/ARGV.rb +++ b/Library/Homebrew/extend/ARGV.rb @@ -8,9 +8,8 @@ module HomebrewArgvExtension end def formulae - require 'formula' - @formulae ||= downcased_unique_named.map{ |name| Formula.factory name } - return @formulae + require "formula" + @formulae ||= downcased_unique_named.map { |name| Formulary.factory(name, spec) } end def kegs @@ -179,6 +178,16 @@ module HomebrewArgvExtension value 'env' end + def spec + if include?("--HEAD") + :head + elsif include?("--devel") + :devel + else + :stable + end + end + private def downcased_unique_named diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 93170ef64f..d84d64a131 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -36,7 +36,7 @@ class Formula set_spec :devel set_spec :head - @active_spec = determine_active_spec + @active_spec = determine_active_spec(spec) validate_attributes :url, :name, :version @build = determine_build_options @pkg_version = PkgVersion.new(version, revision) @@ -52,16 +52,9 @@ class Formula end end - def determine_active_spec - case - when head && ARGV.build_head? then head # --HEAD - when devel && ARGV.build_devel? then devel # --devel - when stable then stable - when devel then devel - when head then head # head-only - else - raise FormulaSpecificationError, "formulae require at least a URL" - end + def determine_active_spec(requested) + spec = send(requested) || stable || devel || head + spec or raise FormulaSpecificationError, "formulae require at least a URL" end def validate_attributes(*attrs) diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index e96ac69e9f..b536329938 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -471,8 +471,11 @@ class FormulaInstaller args << "--debug" if debug? args << "--cc=#{ARGV.cc}" if ARGV.cc args << "--env=#{ARGV.env}" if ARGV.env - args << "--HEAD" if ARGV.build_head? - args << "--devel" if ARGV.build_devel? + + case f.active_spec + when f.head then args << "--HEAD" + when f.devel then args << "--devel" + end f.build.each do |opt, _| name = opt.name[/\A(.+)=\z$/, 1] diff --git a/Library/Homebrew/test/test_formula.rb b/Library/Homebrew/test/test_formula.rb index c4a9c1587c..95bf7e0219 100644 --- a/Library/Homebrew/test/test_formula.rb +++ b/Library/Homebrew/test/test_formula.rb @@ -92,9 +92,7 @@ class FormulaTests < Homebrew::TestCase end def test_installed_prefix_head_active_spec - ARGV.stubs(:build_head? => true) - - f = formula do + f = formula("test", Pathname.new(__FILE__).expand_path, :head) do head 'foo' devel do url 'foo' @@ -106,9 +104,7 @@ class FormulaTests < Homebrew::TestCase end def test_installed_prefix_devel_active_spec - ARGV.stubs(:build_devel? => true) - - f = formula do + f = formula("test", Pathname.new(__FILE__).expand_path, :devel) do head 'foo' devel do url 'foo' @@ -244,9 +240,7 @@ class FormulaTests < Homebrew::TestCase end def test_head_ignores_revisions - ARGV.stubs(:build_head?).returns(true) - - f = formula do + f = formula("test", Pathname.new(__FILE__).expand_path, :head) do url 'foo-1.0.bar' revision 1 head 'foo' diff --git a/Library/Homebrew/test/test_formula_spec_selection.rb b/Library/Homebrew/test/test_formula_spec_selection.rb index 19cdadffdd..aeb55fc1a9 100644 --- a/Library/Homebrew/test/test_formula_spec_selection.rb +++ b/Library/Homebrew/test/test_formula_spec_selection.rb @@ -10,30 +10,6 @@ class FormulaSpecSelectionTests < Homebrew::TestCase assert_nil @_f.send(spec) end - def test_selects_head_when_requested - ARGV.stubs(:build_head?).returns(true) - - formula do - url 'foo-1.0' - devel { url 'foo-1.1a' } - head 'foo' - end - - assert_spec_selected :head - end - - def test_selects_devel_when_requested - ARGV.stubs(:build_devel?).returns(true) - - formula do - url 'foo-1.0' - devel { url 'foo-1.1a' } - head 'foo' - end - - assert_spec_selected :devel - end - def test_selects_stable_by_default formula do url 'foo-1.0' @@ -98,6 +74,26 @@ class FormulaSpecSelectionTests < Homebrew::TestCase assert_spec_selected :devel end + def test_selects_head_when_requested + formula("test", Pathname.new(__FILE__).expand_path, :head) do + url 'foo-1.0' + devel { url 'foo-1.1a' } + head 'foo' + end + + assert_spec_selected :head + end + + def test_selects_devel_when_requested + formula("test", Pathname.new(__FILE__).expand_path, :devel) do + url 'foo-1.0' + devel { url 'foo-1.1a' } + head 'foo' + end + + assert_spec_selected :devel + end + def test_incomplete_devel_not_set formula do url 'foo-1.0' @@ -108,4 +104,13 @@ class FormulaSpecSelectionTests < Homebrew::TestCase assert_spec_unset :devel assert_spec_selected :stable end + + def test_does_not_raise_for_missing_spec + formula("test", Pathname.new(__FILE__).expand_path, :devel) do + url 'foo-1.0' + head 'foo' + end + + assert_spec_selected :stable + end end