don't use new name rack if old name rack is a dir

Everything that used HOMEBREW_CELLAR/canonical_name
could point to something that doesn't exist because
loader_for tries to load new name formula if no old
name found. However there can be software installed
from path with the same name that renamed formulae
had and we still need to link/unlink/uninstall etc
that software. The solution is Formulary#to_rack
method that returns rack for given name.
- Add Formulary#to_rack
- Update ARGV.kegs
- Update cmd/switch
This commit is contained in:
Vlad Shablinsky 2015-08-09 14:56:01 +03:00 committed by Mike McQuaid
parent 2cc6b90329
commit 6a0dcc8324
3 changed files with 25 additions and 8 deletions

View File

@ -12,8 +12,7 @@ module Homebrew
name = ARGV.shift name = ARGV.shift
version = ARGV.shift version = ARGV.shift
canonical_name = Formulary.canonical_name(name) rack = Formulary.to_rack(name)
rack = HOMEBREW_CELLAR.join(canonical_name)
unless rack.directory? unless rack.directory?
onoe "#{name} not found in the Cellar." onoe "#{name} not found in the Cellar."

View File

@ -47,14 +47,14 @@ module HomebrewArgvExtension
require "keg" require "keg"
require "formula" require "formula"
@kegs ||= downcased_unique_named.collect do |name| @kegs ||= downcased_unique_named.collect do |name|
canonical_name = Formulary.canonical_name(name) rack = Formulary.to_rack(name)
rack = HOMEBREW_CELLAR/canonical_name
dirs = rack.directory? ? rack.subdirs : [] dirs = rack.directory? ? rack.subdirs : []
raise NoSuchKegError.new(canonical_name) if dirs.empty? raise NoSuchKegError.new(rack.basename) if dirs.empty?
linked_keg_ref = HOMEBREW_LIBRARY.join("LinkedKegs", canonical_name) linked_keg_ref = HOMEBREW_LIBRARY.join("LinkedKegs", rack.basename)
opt_prefix = HOMEBREW_PREFIX.join("opt", canonical_name) opt_prefix = HOMEBREW_PREFIX.join("opt", rack.basename)
begin begin
if opt_prefix.symlink? && opt_prefix.directory? if opt_prefix.symlink? && opt_prefix.directory?
@ -66,7 +66,7 @@ module HomebrewArgvExtension
elsif (prefix = (name.include?("/") ? Formulary.factory(name) : Formulary.from_rack(rack)).prefix).directory? elsif (prefix = (name.include?("/") ? Formulary.factory(name) : Formulary.from_rack(rack)).prefix).directory?
Keg.new(prefix) Keg.new(prefix)
else else
raise MultipleVersionsInstalledError.new(canonical_name) raise MultipleVersionsInstalledError.new(rack.basename)
end end
rescue FormulaUnavailableError rescue FormulaUnavailableError
raise <<-EOS.undent raise <<-EOS.undent

View File

@ -195,6 +195,24 @@ class Formulary
end end
end end
def self.to_rack(ref)
name = canonical_name(ref)
rack = HOMEBREW_CELLAR/name
# Handle the case when ref is an old name and the installation
# hasn't been migrated or when it's a package installed from
# path but same name formula was renamed.
unless rack.directory?
if ref =~ HOMEBREW_TAP_FORMULA_REGEX
rack = HOMEBREW_CELLAR/$3
elsif !ref.include?("/")
rack = HOMEBREW_CELLAR/ref
end
end
rack
end
def self.canonical_name(ref) def self.canonical_name(ref)
loader_for(ref).name loader_for(ref).name
rescue TapFormulaAmbiguityError rescue TapFormulaAmbiguityError