improve TapLoader and TapFormulaUnavailableError

* Restore the ability to load formula by `user/homebrew-repo/foo`.
* Only suggest to install tap when tap isn't installed.

Closes Homebrew/homebrew#41705.

Signed-off-by: Xu Cheng <xucheng@me.com>
This commit is contained in:
Xu Cheng 2015-07-14 21:33:29 +08:00
parent 86d04e94e9
commit 140f8e3df7
2 changed files with 13 additions and 14 deletions

View File

@ -51,17 +51,17 @@ class FormulaUnavailableError < RuntimeError
end
class TapFormulaUnavailableError < FormulaUnavailableError
attr_reader :user, :repo, :shortname
attr_reader :tap
def initialize name
super
@user, @repo, @shortname = name.split("/", 3)
def initialize tap, name
@tap = tap
super "#{tap}/#{name}"
end
def to_s; <<-EOS.undent
No available formula for #{shortname} #{dependent_s}
Please tap it and then try again: brew tap #{user}/#{repo}
EOS
def to_s
s = super
s += "\nPlease tap it and then try again: brew tap #{tap}" unless tap.installed?
s
end
end

View File

@ -131,14 +131,13 @@ class Formulary
# Loads tapped formulae.
class TapLoader < FormulaLoader
attr_reader :tapped_name
attr_reader :tap
def initialize tapped_name
@tapped_name = tapped_name
user, repo, name = tapped_name.split("/", 3).map(&:downcase)
tap = Tap.new user, repo
path = tap.formula_files.detect { |file| file.basename(".rb").to_s == name }
path ||= tap.path/"#{name}.rb"
@tap = Tap.new user, repo.sub(/^homebrew-/, "")
path = @tap.formula_files.detect { |file| file.basename(".rb").to_s == name }
path ||= @tap.path/"#{name}.rb"
super name, path
end
@ -146,7 +145,7 @@ class Formulary
def get_formula(spec)
super
rescue FormulaUnavailableError => e
raise TapFormulaUnavailableError, tapped_name, e.backtrace
raise TapFormulaUnavailableError.new(tap, name), "", e.backtrace
end
end