diff options
| author | Alyssa Ross | 2016-09-03 21:10:44 +0100 | 
|---|---|---|
| committer | Alyssa Ross | 2016-09-03 21:16:43 +0100 | 
| commit | 0ef3e1e0dcbcd5aa55408fe81d23613e1c2c5e79 (patch) | |
| tree | 15c68c1d02e144cb86c32bc870cf75cc6547d8e0 /Library | |
| parent | 9fd97dd3cf26b6644a9f808945869b2af44db26e (diff) | |
| download | brew-0ef3e1e0dcbcd5aa55408fe81d23613e1c2c5e79.tar.bz2 | |
Preserve alias when installing formulae
Part of #567
Diffstat (limited to 'Library')
| -rw-r--r-- | Library/Homebrew/formula.rb | 23 | ||||
| -rw-r--r-- | Library/Homebrew/formula_installer.rb | 2 | ||||
| -rw-r--r-- | Library/Homebrew/formulary.rb | 6 | ||||
| -rw-r--r-- | Library/Homebrew/tab.rb | 3 | ||||
| -rw-r--r-- | Library/Homebrew/test/fixtures/receipt.json | 1 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_formula.rb | 19 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_formulary.rb | 4 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_tab.rb | 3 | ||||
| -rw-r--r-- | Library/Homebrew/test/testball.rb | 2 | ||||
| -rw-r--r-- | Library/Homebrew/test/testball_bottle.rb | 2 | 
10 files changed, 58 insertions, 7 deletions
diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 9e7bd21ca..479798829 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -58,6 +58,11 @@ class Formula    # e.g. `this-formula`    attr_reader :name +  # The name specified when installing this {Formula}. +  # Could be the name of the {Formula}, or an alias. +  # e.g. `another-name-for-this-formula` +  attr_reader :install_name +    # The fully-qualified name of this {Formula}.    # For core formula it's the same as {#name}.    # e.g. `homebrew/tap-name/this-formula` @@ -143,9 +148,10 @@ class Formula    attr_accessor :build    # @private -  def initialize(name, path, spec) +  def initialize(name, path, spec, install_name: name)      @name = name      @path = path +    @install_name = install_name      @revision = self.class.revision || 0      @version_scheme = self.class.version_scheme || 0 @@ -502,6 +508,21 @@ class Formula      installed_prefixes.map { |dir| Keg.new(dir) }    end +  # Formula reference to use to get an identical installation of the formula. +  # +  # Usually, the formula's path is a good canonical identifier for the formula. +  # Just using whatever was passed to `brew install` isn't a good idea, because +  # if it was e.g. a URL, it could end up being downloaded twice. +  # +  # However, if the formula was installed with an alias (i.e. `install_name` is +  # different from `name`), that should be used instead so that information is +  # preserved. Aliases are looked up in repositories that have already been +  # tapped, so we don't have to worry about doing extra HTTP requests, or other +  # expensive operations, when looking them up again. +  def install_ref +    install_name == name ? path : install_name +  end +    # The directory where the formula's binaries should be installed.    # This is symlinked into `HOMEBREW_PREFIX` after installation or with    # `brew link` for formulae that are not keg-only. diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index cf595cf71..b9b72812e 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -589,7 +589,7 @@ class FormulaInstaller        -I #{HOMEBREW_LOAD_PATH}        --        #{HOMEBREW_LIBRARY_PATH}/build.rb -      #{formula.path} +      #{formula.install_ref}      ].concat(build_argv)      Sandbox.print_sandbox_message if Sandbox.formula?(formula) diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index 261a54fef..095d5f883 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -68,15 +68,18 @@ class Formulary      attr_reader :name      # The formula's ruby file's path or filename      attr_reader :path +    # The name used to install the formula +    attr_reader :install_name      def initialize(name, path)        @name = name        @path = path.resolved_path +      @install_name = name      end      # Gets the formula instance.      def get_formula(spec) -      klass.new(name, path, spec) +      klass.new(name, path, spec, install_name: install_name)      end      def klass @@ -118,6 +121,7 @@ class Formulary        path = alias_path.resolved_path        name = path.basename(".rb").to_s        super name, path +      @install_name = alias_path.basename.to_s      end    end diff --git a/Library/Homebrew/tab.rb b/Library/Homebrew/tab.rb index cf398fcbf..0b26116c5 100644 --- a/Library/Homebrew/tab.rb +++ b/Library/Homebrew/tab.rb @@ -27,6 +27,7 @@ class Tab < OpenStruct        "time" => Time.now.to_i,        "source_modified_time" => formula.source_modified_time.to_i,        "HEAD" => HOMEBREW_REPOSITORY.git_head, +      "install_name" => formula.install_name,        "compiler" => compiler,        "stdlib" => stdlib,        "source" => { @@ -161,6 +162,7 @@ class Tab < OpenStruct        "time" => nil,        "source_modified_time" => 0,        "HEAD" => nil, +      "install_name" => nil,        "stdlib" => nil,        "compiler" => DevelopmentTools.default_compiler,        "source" => { @@ -292,6 +294,7 @@ class Tab < OpenStruct        "time" => time,        "source_modified_time" => source_modified_time.to_i,        "HEAD" => self.HEAD, +      "install_name" => install_name,        "stdlib" => (stdlib.to_s if stdlib),        "compiler" => (compiler.to_s if compiler),        "source" => source diff --git a/Library/Homebrew/test/fixtures/receipt.json b/Library/Homebrew/test/fixtures/receipt.json index 4a829788e..cf93f932d 100644 --- a/Library/Homebrew/test/fixtures/receipt.json +++ b/Library/Homebrew/test/fixtures/receipt.json @@ -11,6 +11,7 @@    "poured_from_bottle": true,    "time": 1403827774,    "HEAD": "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", +  "install_name": "test-formula",    "stdlib": "libcxx",    "compiler": "clang",    "source": { diff --git a/Library/Homebrew/test/test_formula.rb b/Library/Homebrew/test/test_formula.rb index 7ebb17884..1ea1ff185 100644 --- a/Library/Homebrew/test/test_formula.rb +++ b/Library/Homebrew/test/test_formula.rb @@ -8,13 +8,30 @@ class FormulaTests < Homebrew::TestCase      name = "formula_name"      path = Formulary.core_path(name)      spec = :stable +    install_name = "formula_alias" -    f = klass.new(name, path, spec) +    f = klass.new(name, path, spec, install_name: install_name)      assert_equal name, f.name      assert_equal path, f.path +    assert_equal install_name, f.install_name      assert_raises(ArgumentError) { klass.new }    end +  def test_install_ref_with_alias +    name = "formula_name" +    path = Formulary.core_path(name) +    spec = :stable +    install_name = "formula_alias" + +    f = Testball.new(name, path, spec, install_name: install_name) +    assert_equal f.install_name, f.install_ref +  end + +  def test_install_ref_with_non_alias +    f = Testball.new +    assert_equal f.path, f.install_ref +  end +    def test_prefix      f = Testball.new      assert_equal HOMEBREW_CELLAR/f.name/"0.1", f.prefix diff --git a/Library/Homebrew/test/test_formulary.rb b/Library/Homebrew/test/test_formulary.rb index abc034e14..0d34132ec 100644 --- a/Library/Homebrew/test/test_formulary.rb +++ b/Library/Homebrew/test/test_formulary.rb @@ -86,7 +86,9 @@ class FormularyFactoryTest < Homebrew::TestCase      alias_dir = CoreTap.instance.alias_dir      alias_dir.mkpath      FileUtils.ln_s @path, alias_dir/"foo" -    assert_kind_of Formula, Formulary.factory("foo") +    result = Formulary.factory("foo") +    assert_kind_of Formula, result +    assert_equal "foo", result.install_name    ensure      alias_dir.rmtree    end diff --git a/Library/Homebrew/test/test_tab.rb b/Library/Homebrew/test/test_tab.rb index 8a261a46a..dd61fd57b 100644 --- a/Library/Homebrew/test/test_tab.rb +++ b/Library/Homebrew/test/test_tab.rb @@ -43,6 +43,7 @@ class TabTests < Homebrew::TestCase      assert_nil tab.stable_version      assert_nil tab.devel_version      assert_nil tab.head_version +    assert_nil tab.install_name      assert_equal DevelopmentTools.default_compiler, tab.cxxstdlib.compiler      assert_nil tab.cxxstdlib.type    end @@ -116,6 +117,7 @@ class TabTests < Homebrew::TestCase      assert_equal "2.14", tab.stable_version.to_s      assert_equal "2.15", tab.devel_version.to_s      assert_equal "HEAD-0000000", tab.head_version.to_s +    assert_equal "test-formula", tab.install_name    end    def test_to_json @@ -133,6 +135,7 @@ class TabTests < Homebrew::TestCase      assert_equal @tab.stable_version, tab.stable_version      assert_equal @tab.devel_version, tab.devel_version      assert_equal @tab.head_version, tab.head_version +    assert_equal @tab.install_name, tab.install_name    end    def test_remap_deprecated_options diff --git a/Library/Homebrew/test/testball.rb b/Library/Homebrew/test/testball.rb index c1b09111b..c13c73adb 100644 --- a/Library/Homebrew/test/testball.rb +++ b/Library/Homebrew/test/testball.rb @@ -1,5 +1,5 @@  class Testball < Formula -  def initialize(name = "testball", path = Pathname.new(__FILE__).expand_path, spec = :stable) +  def initialize(name = "testball", path = Pathname.new(__FILE__).expand_path, spec = :stable, install_name: name)      self.class.instance_eval do        stable.url "file://#{File.expand_path("..", __FILE__)}/tarballs/testball-0.1.tbz"        stable.sha256 TESTBALL_SHA256 diff --git a/Library/Homebrew/test/testball_bottle.rb b/Library/Homebrew/test/testball_bottle.rb index 5aa582fa8..584478afd 100644 --- a/Library/Homebrew/test/testball_bottle.rb +++ b/Library/Homebrew/test/testball_bottle.rb @@ -1,5 +1,5 @@  class TestballBottle < Formula -  def initialize(name = "testball_bottle", path = Pathname.new(__FILE__).expand_path, spec = :stable) +  def initialize(name = "testball_bottle", path = Pathname.new(__FILE__).expand_path, spec = :stable, install_name: name)      self.class.instance_eval do        stable.url "file://#{File.expand_path("..", __FILE__)}/tarballs/testball-0.1.tbz"        stable.sha256 TESTBALL_SHA256  | 
