aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cask/lib/hbc/cask_dependencies.rb
blob: 6cbfd05af264f6450fe4fa8072b79dc4ad3c8d14 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
require "hbc/topological_hash"

class Hbc::CaskDependencies
  attr_reader :cask, :graph, :sorted

  def initialize(cask)
    @cask = cask
    @graph = graph_dependencies
    @sorted = sort
  end

  def graph_dependencies
    deps_in = ->(csk) { csk.depends_on ? csk.depends_on.cask || [] : [] }
    walk = lambda { |acc, deps|
      deps.each do |dep|
        next if acc.key?(dep)
        succs = deps_in.call Hbc.load(dep)
        acc[dep] = succs
        walk.call(acc, succs)
      end
      acc
    }

    graphed = walk.call({}, @cask.depends_on.cask)
    Hbc::TopologicalHash[graphed]
  end

  def sort
    @graph.tsort
  rescue TSort::Cyclic
    raise Hbc::CaskCyclicCaskDependencyError, @cask.token
  end
end