class Autoproj::Ops::PackageSetHierarchy

PackageSetHierachy be used to build the hierarchy of package set imports, as directed acyclic graph (DAG) so that they can be (topologically) sorted according to their dependencies

Attributes

dag[R]

Public Class Methods

new(package_sets, root_pkg_set) click to toggle source
# File lib/autoproj/ops/configuration.rb, line 18
def initialize(package_sets, root_pkg_set)
    @dag = RGL::DirectedAdjacencyGraph.new

    package_sets.each do |p|
        p.imports.each do |dep|
            @dag.add_edge dep, p
        end
    end

    @dag.add_vertex root_pkg_set
    import_order = root_pkg_set.imports.to_a
    import_order.each_with_index do |p, index|
        if index + 1 < import_order.size
            @dag.add_edge p, import_order[index + 1]
            @dag.add_edge p, root_pkg_set
        end
    end
end

Public Instance Methods

flatten() click to toggle source

Flatten the hierarchy, a establish a sorting

# File lib/autoproj/ops/configuration.rb, line 56
def flatten
    @dag.topsort_iterator.to_a
end
to_png(path) click to toggle source

Write the hierarchy to an image (png) file

# File lib/autoproj/ops/configuration.rb, line 61
def to_png(path)
    @dag.write_to_graphic_file("png", path.gsub(".png", ""))
end
verify_acyclic() click to toggle source
# File lib/autoproj/ops/configuration.rb, line 37
def verify_acyclic
    return if @dag.acyclic?

    Autoproj.fatal "The package sets form (a) cycle(s)"
    @dag.cycles.each_with_index do |cycle, index|
        Autoproj.fatal "== Cycle #{index}"
        (cycle + cycle[0, 1]).each_cons(2) do |a, b|
            if b.imports.include?(a)
                Autoproj.fatal "  #{b.name} depends on #{a.name} in its source.yml"
            else
                Autoproj.fatal "  #{b.name} is after #{a.name} in the package_sets section of the manifest"
            end
        end
    end

    raise ConfigError.new "cycles in package set dependencies"
end