Merge pull request #1815 from MikeMcQuaid/dependency_to_formula

requirement: get formula from satisfy.
This commit is contained in:
Mike McQuaid 2017-01-17 10:09:05 +00:00 committed by GitHub
commit eece7706d1
4 changed files with 34 additions and 17 deletions

View File

@ -48,7 +48,7 @@ class Build
Requirement.prune Requirement.prune
elsif req.build? && dependent != formula elsif req.build? && dependent != formula
Requirement.prune Requirement.prune
elsif req.satisfied? && req.default_formula? && (dep = req.to_dependency).installed? elsif req.satisfied? && (dep = req.to_dependency) && dep.installed?
deps << dep deps << dep
Requirement.prune Requirement.prune
end end

View File

@ -1519,10 +1519,15 @@ class Formula
# Returns a list of Dependency objects that are required at runtime. # Returns a list of Dependency objects that are required at runtime.
# @private # @private
def runtime_dependencies def runtime_dependencies
recursive_dependencies do |_dependent, dependency| runtime_dependencies = recursive_dependencies do |_, dependency|
Dependency.prune if dependency.build? Dependency.prune if dependency.build?
Dependency.prune if !dependency.required? && build.without?(dependency) Dependency.prune if !dependency.required? && build.without?(dependency)
end end
runtime_requirement_deps = recursive_requirements do |_, requirement|
Requirement.prune if requirement.build?
Requirement.prune if !requirement.required? && build.without?(requirement)
end.map(&:to_dependency).compact
runtime_dependencies + runtime_requirement_deps
end end
# Returns a list of formulae depended on by this formula that aren't # Returns a list of formulae depended on by this formula that aren't

View File

@ -370,8 +370,8 @@ class FormulaInstaller
raise UnsatisfiedRequirements, fatals raise UnsatisfiedRequirements, fatals
end end
def install_requirement_default_formula?(req, dependent, build) def install_requirement_formula?(req, dependent, build)
return false unless req.default_formula? return false unless req.to_dependency
return true unless req.satisfied? return true unless req.satisfied?
return false if req.run? return false if req.run?
install_bottle_for?(dependent, build) || build_bottle? install_bottle_for?(dependent, build) || build_bottle?
@ -390,7 +390,7 @@ class FormulaInstaller
Requirement.prune Requirement.prune
elsif req.build? && install_bottle_for?(dependent, build) elsif req.build? && install_bottle_for?(dependent, build)
Requirement.prune Requirement.prune
elsif install_requirement_default_formula?(req, dependent, build) elsif install_requirement_formula?(req, dependent, build)
dep = req.to_dependency dep = req.to_dependency
deps.unshift(dep) deps.unshift(dep)
formulae.unshift(dep.to_formula) formulae.unshift(dep.to_formula)

View File

@ -15,6 +15,7 @@ class Requirement
@default_formula = self.class.default_formula @default_formula = self.class.default_formula
@cask ||= self.class.cask @cask ||= self.class.cask
@download ||= self.class.download @download ||= self.class.download
@formula = nil
tags.each do |tag| tags.each do |tag|
next unless tag.is_a? Hash next unless tag.is_a? Hash
@cask ||= tag[:cask] @cask ||= tag[:cask]
@ -56,7 +57,14 @@ class Requirement
def satisfied? def satisfied?
result = self.class.satisfy.yielder { |p| instance_eval(&p) } result = self.class.satisfy.yielder { |p| instance_eval(&p) }
@satisfied_result = result @satisfied_result = result
result ? true : false return false unless result
if parent = satisfied_result_parent
parent.to_s =~ %r{(#{Regexp.escape(HOMEBREW_CELLAR)}|#{Regexp.escape(HOMEBREW_PREFIX)}/opt)/([\w+-.@]+)}
@formula = $2
end
true
end end
# Overriding #fatal? is deprecated. # Overriding #fatal? is deprecated.
@ -69,6 +77,11 @@ class Requirement
self.class.default_formula || false self.class.default_formula || false
end end
def satisfied_result_parent
return unless @satisfied_result.is_a?(Pathname)
@satisfied_result.resolved_path.parent
end
# Overriding #modify_build_environment is deprecated. # Overriding #modify_build_environment is deprecated.
# Pass a block to the env DSL method instead. # Pass a block to the env DSL method instead.
# Note: #satisfied? should be called before invoking this method # Note: #satisfied? should be called before invoking this method
@ -81,11 +94,8 @@ class Requirement
# satisfy { which("executable") } # satisfy { which("executable") }
# work, even under superenv where "executable" wouldn't normally be on the # work, even under superenv where "executable" wouldn't normally be on the
# PATH. # PATH.
# This is undocumented magic and it should be removed, but we need to add parent = satisfied_result_parent
# a way to declare path-based requirements that work with superenv first. return unless parent
return unless @satisfied_result.is_a?(Pathname)
parent = @satisfied_result.parent
return if ENV["PATH"].split(File::PATH_SEPARATOR).include?(parent.to_s) return if ENV["PATH"].split(File::PATH_SEPARATOR).include?(parent.to_s)
ENV.append_path("PATH", parent) ENV.append_path("PATH", parent)
end end
@ -111,13 +121,15 @@ class Requirement
"#<#{self.class.name}: #{name.inspect} #{tags.inspect}>" "#<#{self.class.name}: #{name.inspect} #{tags.inspect}>"
end end
def formula
@formula || self.class.default_formula
end
def to_dependency def to_dependency
f = self.class.default_formula if formula =~ HOMEBREW_TAP_FORMULA_REGEX
raise "No default formula defined for #{inspect}" if f.nil? TapDependency.new(formula, tags, method(:modify_build_environment), name)
if f =~ HOMEBREW_TAP_FORMULA_REGEX elsif formula
TapDependency.new(f, tags, method(:modify_build_environment), name) Dependency.new(formula, tags, method(:modify_build_environment), name)
else
Dependency.new(f, tags, method(:modify_build_environment), name)
end end
end end