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
version = ARGV.shift
canonical_name = Formulary.canonical_name(name)
rack = HOMEBREW_CELLAR.join(canonical_name)
rack = Formulary.to_rack(name)
unless rack.directory?
onoe "#{name} not found in the Cellar."

View File

@ -47,14 +47,14 @@ module HomebrewArgvExtension
require "keg"
require "formula"
@kegs ||= downcased_unique_named.collect do |name|
canonical_name = Formulary.canonical_name(name)
rack = HOMEBREW_CELLAR/canonical_name
rack = Formulary.to_rack(name)
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)
opt_prefix = HOMEBREW_PREFIX.join("opt", canonical_name)
linked_keg_ref = HOMEBREW_LIBRARY.join("LinkedKegs", rack.basename)
opt_prefix = HOMEBREW_PREFIX.join("opt", rack.basename)
begin
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?
Keg.new(prefix)
else
raise MultipleVersionsInstalledError.new(canonical_name)
raise MultipleVersionsInstalledError.new(rack.basename)
end
rescue FormulaUnavailableError
raise <<-EOS.undent

View File

@ -195,6 +195,24 @@ class Formulary
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)
loader_for(ref).name
rescue TapFormulaAmbiguityError