2016-08-18 22:11:42 +03:00
|
|
|
require "hbc/topological_hash"
|
|
|
|
|
2016-09-24 13:52:43 +02:00
|
|
|
module Hbc
|
|
|
|
class CaskDependencies
|
|
|
|
attr_reader :cask, :graph, :sorted
|
2016-08-18 22:11:42 +03:00
|
|
|
|
2016-09-24 13:52:43 +02:00
|
|
|
def initialize(cask)
|
|
|
|
@cask = cask
|
|
|
|
@graph = graph_dependencies
|
|
|
|
@sorted = sort
|
|
|
|
end
|
2016-08-18 22:11:42 +03:00
|
|
|
|
2016-09-24 13:52:43 +02:00
|
|
|
def graph_dependencies
|
|
|
|
deps_in = ->(csk) { csk.depends_on ? csk.depends_on.cask || [] : [] }
|
2016-10-23 14:44:14 +02:00
|
|
|
walk = lambda do |acc, deps|
|
2016-09-24 13:52:43 +02:00
|
|
|
deps.each do |dep|
|
|
|
|
next if acc.key?(dep)
|
2017-03-13 01:09:36 +01:00
|
|
|
succs = deps_in.call CaskLoader.load(dep)
|
2016-09-24 13:52:43 +02:00
|
|
|
acc[dep] = succs
|
|
|
|
walk.call(acc, succs)
|
|
|
|
end
|
|
|
|
acc
|
2016-10-23 14:44:14 +02:00
|
|
|
end
|
2016-08-18 22:11:42 +03:00
|
|
|
|
2016-09-24 13:52:43 +02:00
|
|
|
graphed = walk.call({}, @cask.depends_on.cask)
|
|
|
|
TopologicalHash[graphed]
|
|
|
|
end
|
2016-08-18 22:11:42 +03:00
|
|
|
|
2016-09-24 13:52:43 +02:00
|
|
|
def sort
|
|
|
|
@graph.tsort
|
|
|
|
rescue TSort::Cyclic
|
|
|
|
raise CaskCyclicCaskDependencyError, @cask.token
|
|
|
|
end
|
2016-08-18 22:11:42 +03:00
|
|
|
end
|
|
|
|
end
|