aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cask/lib/hbc/cask_dependencies.rb
blob: fe5d1b74392d530300b2d0e08b08186bb2fd7b86 (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
34
35
require "hbc/topological_hash"

module Hbc
  class 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 do |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
      end

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

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