diff options
| author | Alyssa Ross | 2016-11-13 23:17:40 +0000 |
|---|---|---|
| committer | Alyssa Ross | 2016-11-13 23:20:38 +0000 |
| commit | f7f72093a80aade07d9b1da7f1e64dadcb5bd62b (patch) | |
| tree | 2870799578e88151d9d0b40cd7946d3d78fbaf81 | |
| parent | 0f6cd9d7a51108497974cae52f177c9a8c57c0ed (diff) | |
| download | brew-f7f72093a80aade07d9b1da7f1e64dadcb5bd62b.tar.bz2 | |
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.
| -rw-r--r-- | Library/Homebrew/keg.rb | 15 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_keg.rb | 19 |
2 files changed, 28 insertions, 6 deletions
diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb index e2719582d..f1275e748 100644 --- a/Library/Homebrew/keg.rb +++ b/Library/Homebrew/keg.rb @@ -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 diff --git a/Library/Homebrew/test/test_keg.rb b/Library/Homebrew/test/test_keg.rb index 7450d9c0f..fdc739c9d 100644 --- a/Library/Homebrew/test/test_keg.rb +++ b/Library/Homebrew/test/test_keg.rb @@ -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 |
