diff options
Diffstat (limited to 'Library/Homebrew/dependency.rb')
| -rw-r--r-- | Library/Homebrew/dependency.rb | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/Library/Homebrew/dependency.rb b/Library/Homebrew/dependency.rb new file mode 100644 index 000000000..91b939c4f --- /dev/null +++ b/Library/Homebrew/dependency.rb @@ -0,0 +1,74 @@ +require 'dependable' + +# A dependency on another Homebrew formula. +class Dependency + include Dependable + + attr_reader :name, :tags + + def initialize(name, *tags) + @name = name + @tags = tags.flatten.compact + end + + def to_s + name + end + + def ==(other) + name == other.name + end + + def eql?(other) + other.is_a?(self.class) && hash == other.hash + end + + def hash + name.hash + end + + def to_formula + f = Formula.factory(name) + # Add this dependency's options to the formula's build args + f.build.args = f.build.args.concat(options) + f + end + + def installed? + to_formula.installed? + end + + def requested? + ARGV.formulae.include?(to_formula) rescue false + end + + def universal! + tags << 'universal' if to_formula.build.has_option? 'universal' + 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 |
