#!/usr/bin/env perl use warnings; use strict; use Graph::Directed; use GraphViz; sub add_package($$@) { my ($graph, $subject, @deps) = @_; foreach $_ (@deps) { $graph->add_edge($subject, $_); } $graph->set_vertex_attribute($subject, 'broken', 1); } sub draw_graph($$) { my ($graph, $picture) = @_; foreach $_ ($graph->vertices) { if ($graph->has_vertex_attribute($_, 'broken')) { $picture->add_node($_, color=>'red'); } else { $picture->add_node($_); } } foreach $_ ($graph->edges) { $picture->add_edge($$_[0], $$_[1]); } } # Build dependency graph my $graph = Graph::Directed->new(); while (<>) { chomp; my $subject = $_; my @dependencies; @_ = split /\n/, `repoquery --requires "$subject"`; @_ = grep /^perl\(/, @_; @_ = map { #m/\(([^)]+)/; s/.*\(([^)]+).*/perl-$1/; s/::/-/g; $_; } @_; @dependencies = @_; add_package($graph, $subject, @dependencies); } #print "Rich graphs is $graph\n"; # Minimize graph foreach $_ (grep {$graph->is_sink_vertex($_)} ($graph->vertices)) { if (!$graph->has_vertex_attribute($_, 'broken')) { $graph->delete_vertex($_); } } # Draw graph my $picture = GraphViz->new(directed => 1, layout => 'dot'); draw_graph($graph, $picture); print $picture->as_svg;