mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00

Until we figure out how to allow --tree to show optional dependencies in a way that fits on a normal screen, this helps to explain the discrepancy between `brew deps` and `brew deps --tree`. Closes Homebrew/homebrew#41841. Closes Homebrew/homebrew#41947.
90 lines
2.7 KiB
Ruby
90 lines
2.7 KiB
Ruby
# encoding: UTF-8
|
|
require 'formula'
|
|
require 'ostruct'
|
|
|
|
module Homebrew
|
|
def deps
|
|
mode = OpenStruct.new(
|
|
:installed? => ARGV.include?('--installed'),
|
|
:tree? => ARGV.include?('--tree'),
|
|
:all? => ARGV.include?('--all'),
|
|
:topo_order? => ARGV.include?('-n'),
|
|
:union? => ARGV.include?('--union')
|
|
)
|
|
|
|
if mode.installed? && mode.tree?
|
|
puts_deps_tree Formula.installed
|
|
elsif mode.all?
|
|
puts_deps Formula
|
|
elsif mode.tree?
|
|
raise FormulaUnspecifiedError if ARGV.named.empty?
|
|
puts_deps_tree ARGV.formulae
|
|
elsif ARGV.named.empty?
|
|
raise FormulaUnspecifiedError unless mode.installed?
|
|
puts_deps Formula.installed
|
|
else
|
|
all_deps = deps_for_formulae(ARGV.formulae, !ARGV.one?, &(mode.union? ? :| : :&))
|
|
all_deps = all_deps.select(&:installed?) if mode.installed?
|
|
all_deps = all_deps.sort_by(&:name) unless mode.topo_order?
|
|
puts all_deps
|
|
end
|
|
end
|
|
|
|
def deps_for_formula(f, recursive=false)
|
|
ignores = []
|
|
ignores << "build?" if ARGV.include? "--skip-build"
|
|
ignores << "optional?" if ARGV.include? "--skip-optional"
|
|
|
|
if recursive
|
|
deps = f.recursive_dependencies do |dependent, dep|
|
|
Dependency.prune if ignores.any? { |ignore| dep.send(ignore) } && !dependent.build.with?(dep)
|
|
end
|
|
reqs = f.recursive_requirements do |dependent, req|
|
|
Requirement.prune if ignores.any? { |ignore| req.send(ignore) } && !dependent.build.with?(req)
|
|
end
|
|
else
|
|
deps = f.deps.reject do |dep|
|
|
ignores.any? { |ignore| dep.send(ignore) }
|
|
end
|
|
reqs = f.requirements.reject do |req|
|
|
ignores.any? { |ignore| req.send(ignore) }
|
|
end
|
|
end
|
|
|
|
deps + reqs.select(&:default_formula?).map(&:to_dependency)
|
|
end
|
|
|
|
def deps_for_formulae(formulae, recursive=false, &block)
|
|
formulae.map {|f| deps_for_formula(f, recursive) }.inject(&block)
|
|
end
|
|
|
|
def puts_deps(formulae)
|
|
formulae.each { |f| puts "#{f.full_name}: #{deps_for_formula(f).sort_by(&:name) * " "}" }
|
|
end
|
|
|
|
def puts_deps_tree(formulae)
|
|
formulae.each do |f|
|
|
puts "#{f.full_name} (required dependencies)"
|
|
recursive_deps_tree(f, "")
|
|
puts
|
|
end
|
|
end
|
|
|
|
def recursive_deps_tree f, prefix
|
|
reqs = f.requirements.select(&:default_formula?)
|
|
max = reqs.length - 1
|
|
reqs.each_with_index do |req, i|
|
|
chr = i == max ? "└──" : "├──"
|
|
puts prefix + "#{chr} :#{req.to_dependency.name}"
|
|
end
|
|
deps = f.deps.default
|
|
max = deps.length - 1
|
|
deps.each_with_index do |dep, i|
|
|
chr = i == max ? "└──" : "├──"
|
|
prefix_ext = i == max ? " " : "| "
|
|
puts prefix + "#{chr} #{dep.name}"
|
|
recursive_deps_tree(Formulary.factory(dep.name), prefix + prefix_ext)
|
|
end
|
|
end
|
|
end
|