keg: don't rely on #to_formula

It doesn't always work.
For example, a keg could have been installed with a formula from a
URL, which Homebrew now does not know how to access.

Fixes #1496.
This commit is contained in:
Alyssa Ross 2016-11-13 23:17:40 +00:00
parent 0f6cd9d7a5
commit f7f72093a8
2 changed files with 28 additions and 6 deletions

View File

@ -109,13 +109,20 @@ class Keg
end
keg_names = kegs.map(&:name)
kegs_by_name = kegs.group_by(&:to_formula)
kegs_by_source = kegs.group_by { |k| [k.name, Tab.for_keg(k).tap] }
remaining_formulae.each do |dependent|
required = dependent.missing_dependencies(hide: keg_names)
required.select! { |f| kegs_by_name.key?(f) }
next unless required.any?
required_kegs = required.map { |f| kegs_by_name[f].sort_by(&:version).last }
required_kegs = required.map do |f|
f_kegs = kegs_by_source[[f.name, f.tap]]
next unless f_kegs
f_kegs.sort_by(&:version).last
end
next unless required_kegs.any?
return required_kegs, [dependent.to_s]
end

View File

@ -317,12 +317,16 @@ end
class InstalledDependantsTests < LinkTests
def stub_formula_name(name)
stub_formula_loader formula(name) { url "foo-1.0" }
f = formula(name) { url "foo-1.0" }
stub_formula_loader f
stub_formula_loader f, "homebrew/core/#{f}"
f
end
def setup_test_keg(name, version)
stub_formula_name(name)
f = stub_formula_name(name)
keg = super
Tab.create(f, DevelopmentTools.default_compiler, :libcxx).write
Formula.clear_cache
keg
end
@ -345,6 +349,17 @@ class InstalledDependantsTests < LinkTests
end
end
# Test with a keg whose formula isn't known.
# This can happen if e.g. a formula is installed
# from a file path or URL.
def test_unknown_formula
Formulary.unstub(:loader_for)
dependencies []
alter_tab { |t| t.source["path"] = nil }
assert_empty @keg.installed_dependents
assert_nil Keg.find_some_installed_dependents([@keg])
end
def test_no_dependencies_anywhere
dependencies nil
assert_empty @keg.installed_dependents