Dependency.expand_dependencies
Move Formula.expand_dependencies into the Dependency class, and extend
it to allow arbitrary filters to be applied when enumerating deps.
When supplied with a block, expand_dependencies will yield a [dependent,
dependency] pair for each dependency, allowing callers to filter out
dependencies that may not be applicable or useful in a given situation.
Deps can be skipped by simple calling Dependency.prune in the block,
e.g.:
Dependency.expand_dependencies do |f, dep|
Dependency.prune if dep.to_formula.installed?
end
The return value of the method is the filtered list.
If no block is supplied, a default filter that omits optional or
recommended deps based on what the dependent formula has requested is
applied.
Formula#recursive_dependencies is now implemented on top of this,
allowing FormulaInstaller to exact detailed control over what deps are
installed. `brew missing` and `brew upgrade` can learn to use this to
apply the installed options set when expanding dependencies.
Move Formula.expand_deps and Formula#recursive_deps into compat, because
these methods do not respect the new optional and recommended tags and
thus should no longer be used.
This commit is contained in:
parent
d0161091d8
commit
55681ca201
@ -99,6 +99,21 @@ class Formula
|
||||
val.nil? ? @bottle_sha1 : @bottle_sha1 = val
|
||||
end
|
||||
end
|
||||
|
||||
# These methods return lists of Formula objects.
|
||||
# They are eprecated in favor of Dependency::expand_dependencies
|
||||
# and Formula#recursive_dependencies, which return lists of
|
||||
# Dependency objects instead.
|
||||
def self.expand_deps f
|
||||
f.deps.map do |dep|
|
||||
f_dep = Formula.factory dep.to_s
|
||||
expand_deps(f_dep) << f_dep
|
||||
end
|
||||
end
|
||||
|
||||
def recursive_deps
|
||||
Formula.expand_deps(self).flatten.uniq
|
||||
end
|
||||
end
|
||||
|
||||
class UnidentifiedFormula < Formula
|
||||
|
||||
@ -177,6 +177,32 @@ class Dependency
|
||||
def requested?
|
||||
ARGV.formulae.include?(to_formula) rescue false
|
||||
end
|
||||
|
||||
# Expand the dependencies of f recursively, optionally yielding
|
||||
# [f, dep] to allow callers to apply arbitrary filters to the list.
|
||||
# The default filter, which is used when a block is not supplied,
|
||||
# omits optionals and recommendeds based on what the dependent has
|
||||
# asked for.
|
||||
def self.expand(dependent, &block)
|
||||
dependent.deps.map do |dep|
|
||||
prune = catch(:prune) do
|
||||
if block_given?
|
||||
yield dependent, dep
|
||||
elsif dep.optional? || dep.recommended?
|
||||
Dependency.prune unless dependent.build.with?(dep.name)
|
||||
end
|
||||
end
|
||||
|
||||
next if prune
|
||||
|
||||
expand(dep.to_formula, &block) << dep
|
||||
end.flatten.compact.uniq
|
||||
end
|
||||
|
||||
# Used to prune dependencies when calling expand_dependencies with a block.
|
||||
def self.prune
|
||||
throw(:prune, true)
|
||||
end
|
||||
end
|
||||
|
||||
# A base class for non-formula requirements needed by formulae.
|
||||
|
||||
@ -457,32 +457,10 @@ class Formula
|
||||
requirements.select { |r| r.is_a? ConflictRequirement }
|
||||
end
|
||||
|
||||
# for Formula objects
|
||||
def self.expand_deps f
|
||||
f.deps.map do |dep|
|
||||
f_dep = Formula.factory dep.to_s
|
||||
expand_deps(f_dep) << f_dep
|
||||
end
|
||||
end
|
||||
|
||||
# for Dependency objects
|
||||
def self.expand_dependencies f
|
||||
f.deps.map do |dep|
|
||||
f_dep = Formula.factory dep.to_s
|
||||
expand_dependencies(f_dep) << dep
|
||||
end
|
||||
end
|
||||
|
||||
# deps are in an installable order
|
||||
# which means if a depends on b then b will be ordered before a in this list
|
||||
def recursive_deps
|
||||
Formula.expand_deps(self).flatten.uniq
|
||||
end
|
||||
|
||||
# Like recursive_deps, but returns a list of Dependency objects instead
|
||||
# of Formula objects.
|
||||
def recursive_dependencies
|
||||
Formula.expand_dependencies(self).flatten.uniq
|
||||
# Returns a list of Dependency objects in an installable order, which
|
||||
# means if a depends on b then b will be ordered before a in this list
|
||||
def recursive_dependencies(&block)
|
||||
Dependency.expand(self, &block)
|
||||
end
|
||||
|
||||
# The full set of Requirements for this formula's dependency tree.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user