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:
parent
0f6cd9d7a5
commit
f7f72093a8
@ -109,13 +109,20 @@ class Keg
|
|||||||
end
|
end
|
||||||
|
|
||||||
keg_names = kegs.map(&:name)
|
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|
|
remaining_formulae.each do |dependent|
|
||||||
required = dependent.missing_dependencies(hide: keg_names)
|
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]
|
return required_kegs, [dependent.to_s]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -317,12 +317,16 @@ end
|
|||||||
|
|
||||||
class InstalledDependantsTests < LinkTests
|
class InstalledDependantsTests < LinkTests
|
||||||
def stub_formula_name(name)
|
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
|
end
|
||||||
|
|
||||||
def setup_test_keg(name, version)
|
def setup_test_keg(name, version)
|
||||||
stub_formula_name(name)
|
f = stub_formula_name(name)
|
||||||
keg = super
|
keg = super
|
||||||
|
Tab.create(f, DevelopmentTools.default_compiler, :libcxx).write
|
||||||
Formula.clear_cache
|
Formula.clear_cache
|
||||||
keg
|
keg
|
||||||
end
|
end
|
||||||
@ -345,6 +349,17 @@ class InstalledDependantsTests < LinkTests
|
|||||||
end
|
end
|
||||||
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
|
def test_no_dependencies_anywhere
|
||||||
dependencies nil
|
dependencies nil
|
||||||
assert_empty @keg.installed_dependents
|
assert_empty @keg.installed_dependents
|
||||||
|
Loading…
x
Reference in New Issue
Block a user