From 3454d6a96199cc4f405a52d1525d0cc760a0ebf8 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Wed, 25 Apr 2018 11:44:29 +0100 Subject: [PATCH] runtime_deps: improve documentation and consistency. --- Library/Homebrew/formula.rb | 27 +++++++++++++++++++-------- Library/Homebrew/linkage_checker.rb | 4 +++- Library/Homebrew/test/formula_spec.rb | 9 ++++----- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 69c60a3d28..5a146d4bcc 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -1487,12 +1487,23 @@ class Formula Requirement.expand(self, &block) end + # Returns a Keg for the opt_prefix or installed_prefix if they exist. + # If not, return nil. + # @private + def opt_or_installed_prefix_keg + if optlinked? && opt_prefix.exist? + Keg.new(opt_prefix) + elsif installed_prefix.directory? + Keg.new(installed_prefix) + end + end + # Returns a list of Dependency objects that are required at runtime. # @private def runtime_dependencies(read_from_tab: true) if read_from_tab && installed_prefix.directory? && - (keg = Keg.new(installed_prefix)) && + (keg = opt_or_installed_prefix_keg) && (tab_deps = keg.runtime_dependencies) return tab_deps.map { |d| Dependency.new d["full_name"] }.compact end @@ -1500,6 +1511,8 @@ class Formula declared_runtime_dependencies | undeclared_runtime_dependencies end + # Returns a list of Dependency objects that are declared in the formula. + # @private def declared_runtime_dependencies recursive_dependencies do |_, dependency| Dependency.prune if dependency.build? @@ -1507,14 +1520,12 @@ class Formula end end + # Returns a list of Dependency objects that are not declared in the formula + # but the formula links to. + # @private def undeclared_runtime_dependencies - if optlinked? - keg = Keg.new(opt_prefix) - elsif prefix.directory? - keg = Keg.new(prefix) - else - return [] - end + keg = opt_or_installed_prefix_keg + return [] unless keg linkage_checker = LinkageChecker.new(keg, self) linkage_checker.undeclared_deps.map { |n| Dependency.new(n) } diff --git a/Library/Homebrew/linkage_checker.rb b/Library/Homebrew/linkage_checker.rb index 6984397435..85bb003a3f 100644 --- a/Library/Homebrew/linkage_checker.rb +++ b/Library/Homebrew/linkage_checker.rb @@ -2,6 +2,8 @@ require "keg" require "formula" class LinkageChecker + attr_reader :undeclared_deps + def initialize(keg, formula = nil) @keg = keg @formula = formula || resolve_formula(keg) @@ -142,7 +144,7 @@ class LinkageChecker missing_deps = @broken_deps.values.flatten.map { |d| dylib_to_dep(d) } unnecessary_deps -= missing_deps - + [indirect_deps, undeclared_deps, unnecessary_deps] end diff --git a/Library/Homebrew/test/formula_spec.rb b/Library/Homebrew/test/formula_spec.rb index bb0d1d2ba7..6ad102756e 100644 --- a/Library/Homebrew/test/formula_spec.rb +++ b/Library/Homebrew/test/formula_spec.rb @@ -708,19 +708,18 @@ describe Formula do expect(f3.runtime_dependencies.map(&:name)).to eq(["foo/bar/f1", "baz/qux/f2"]) end - it "includes non-declared direct dependencies" do + it "includes non-declared direct dependencies", :focus do formula = Class.new(Testball).new dependency = formula("dependency") { url "f-1.0" } formula.brew { formula.install } - keg = Keg.for(formula.prefix) + keg = Keg.for(formula.installed_prefix) keg.link linkage_checker = double("linkage checker", undeclared_deps: [dependency.name]) - allow(LinkageChecker).to receive(:new).with(keg, any_args) - .and_return(linkage_checker) + allow(LinkageChecker).to receive(:new).and_return(linkage_checker) - expect(formula.runtime_dependencies).to include an_object_having_attributes(name: dependency.name) + expect(formula.runtime_dependencies.map(&:name)).to eq [dependency.name] end end