aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorMike McQuaid2016-12-29 14:28:59 +0000
committerGitHub2016-12-29 14:28:59 +0000
commit577bf628e875e300dbaaf1212a4f4202ba00b1a9 (patch)
tree814a8d50c93aa45ef6b6bf25be0b9800ac38fc1a /Library
parent05f35d763b444077806241c3496259502ed4dbd0 (diff)
parent3a27d8121970dab95f2d28db81189ddf9619c0f5 (diff)
downloadbrew-577bf628e875e300dbaaf1212a4f4202ba00b1a9.tar.bz2
Merge pull request #1737 from alyssais/tap_dependents
keg: installed dependencies of unknown formulae
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/keg.rb17
-rw-r--r--Library/Homebrew/test/keg_test.rb22
2 files changed, 30 insertions, 9 deletions
diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb
index 1de4ce1f0..756b27288 100644
--- a/Library/Homebrew/keg.rb
+++ b/Library/Homebrew/keg.rb
@@ -139,6 +139,10 @@ class Keg
raise NotAKegError, "#{path} is not inside a keg"
end
+ def self.all
+ Formula.racks.flat_map(&:subdirs).map { |d| new(d) }
+ end
+
attr_reader :path, :name, :linked_keg_record, :opt_record
protected :path
@@ -353,14 +357,21 @@ class Keg
end
def installed_dependents
- Formula.installed.flat_map(&:installed_kegs).select do |keg|
+ tap = Tab.for_keg(self).source["tap"]
+ Keg.all.select do |keg|
tab = Tab.for_keg(keg)
next if tab.runtime_dependencies.nil? # no dependency information saved.
tab.runtime_dependencies.any? do |dep|
# Resolve formula rather than directly comparing names
# in case of conflicts between formulae from different taps.
- dep_formula = Formulary.factory(dep["full_name"])
- dep_formula == to_formula && dep["version"] == version.to_s
+ begin
+ dep_formula = Formulary.factory(dep["full_name"])
+ next false unless dep_formula == to_formula
+ rescue FormulaUnavailableError
+ next false unless "#{tap}/#{name}" == dep["full_name"]
+ end
+
+ dep["version"] == version.to_s
end
end
end
diff --git a/Library/Homebrew/test/keg_test.rb b/Library/Homebrew/test/keg_test.rb
index 2c91027e5..4fe7c6a3c 100644
--- a/Library/Homebrew/test/keg_test.rb
+++ b/Library/Homebrew/test/keg_test.rb
@@ -2,7 +2,7 @@ require "testing_env"
require "keg"
require "stringio"
-class LinkTests < Homebrew::TestCase
+class LinkTestCase < Homebrew::TestCase
include FileUtils
def setup_test_keg(name, version)
@@ -44,6 +44,13 @@ class LinkTests < Homebrew::TestCase
rmtree HOMEBREW_PREFIX/"bin"
rmtree HOMEBREW_PREFIX/"lib"
end
+end
+
+class LinkTests < LinkTestCase
+ def test_all
+ Formula.clear_racks_cache
+ assert_equal [@keg], Keg.all
+ end
def test_empty_installation
%w[.DS_Store INSTALL_RECEIPT.json LICENSE.txt].each do |file|
@@ -315,7 +322,7 @@ class LinkTests < Homebrew::TestCase
end
end
-class InstalledDependantsTests < LinkTests
+class InstalledDependantsTests < LinkTestCase
def stub_formula_name(name)
f = formula(name) { url "foo-1.0" }
stub_formula_loader f
@@ -353,10 +360,13 @@ class InstalledDependantsTests < LinkTests
# 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])
+ alter_tab(@keg) do |t|
+ t.source["tap"] = "some/tap"
+ t.source["path"] = nil
+ end
+ dependencies [{ "full_name" => "some/tap/foo", "version" => "1.0" }]
+ assert_equal [@dependent], @keg.installed_dependents
+ assert_equal [[@keg], ["bar 1.0"]], Keg.find_some_installed_dependents([@keg])
end
def test_no_dependencies_anywhere