summaryrefslogtreecommitdiff
path: root/generate_dots.pl
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--generate_dots.pl107
1 files changed, 107 insertions, 0 deletions
diff --git a/generate_dots.pl b/generate_dots.pl
new file mode 100644
index 0000000..c30f4d8
--- /dev/null
+++ b/generate_dots.pl
@@ -0,0 +1,107 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use DBI;
+use GraphViz;
+
+
+my @drivers = DBI->available_drivers();
+die "Error, please install DBI::SQLite" unless (grep { $_ eq "SQLite" } @drivers);
+
+print "Generating graphviz .dot files for each package..\n";
+my $dbh = DBI->connect("dbi:SQLite:dbname=cpants_all.db","","", { AutoCommit => 0, PrintError => 1 });
+
+print "Loading packages..\n";
+my $sth = $dbh->prepare("select id, dist from dist order by dist");
+$sth->execute;
+die "$DBI::errstr" if ($dbh->err());
+my $packages = {};
+while (my ($package_id, $package_name) = $sth->fetchrow) {
+ $packages->{ int($package_id) } = $package_name;
+}
+$sth->finish;
+print "done\n";
+
+print "Loading dependencies..\n";
+$sth = $dbh->prepare("select id, dist, in_dist from prereq order by dist");
+$sth->execute;
+die "$DBI::errstr\n" if ($dbh->err());
+my @dependencies = ();
+while (my ($dependency_id, $user_id, $used_id) = $sth->fetchrow) {
+ my $user = int( ($user_id)?$user_id:0 );
+ my $used = int( ($used_id)?$used_id:0 );
+ my @dep = ($user,$used);
+ push(@dependencies, \@dep) if ($user != 0 && $used != 0);
+
+}
+$sth->finish;
+$dbh->disconnect;
+print "done\n";
+
+sub addRoots {
+ my ($g, $package, $n, $e) = @_;
+ $n = {} unless defined $n;
+ $e = {} unless defined $e;
+ $n->{$package} = 1;
+ for (@dependencies) {
+ my ($user, $used) = @$_;
+ if ($user == $package && $used != $package) {
+ #print " - $package use ".$packages->{ $used }." (id: $used)\n";
+ $g->add_node($used, label => $packages->{ $used });
+
+ $g->add_edge($package, $used);
+
+ unless (exists($n->{$used})) {
+ ($g,$n, $e) = addRoots($g, $used, $n, $e);
+ }
+ }
+ }
+ ($g,$n, $e)
+}
+
+sub addLeaves {
+ my ($g, $package, $n, $e) = @_;
+ $n = {} unless defined $n;
+ $e = {} unless defined $e;
+ $n->{$package} = 1;
+ for (@dependencies) {
+ my ($user, $used) = @$_;
+ if ($used == $package && $user != $package) {
+ #print " - $package use ".$packages->{ $used }." (id: $used)\n";
+ $g->add_node($user, label => $packages->{ $user });
+
+ $g->add_edge($user, $package);
+
+ unless (exists($n->{$user})) {
+ ($g,$n, $e) = addLeaves($g, $user, $n, $e);
+ }
+ }
+ }
+ ($g,$n, $e)
+}
+
+print "Generating graphs..\n";
+use Data::Dumper;
+while(my ($package_id, $package_name) = each(%$packages)) {
+ if ($package_name eq "Moose") {
+ print " - loading $package_name dependencies..\n";
+ my $g = GraphViz->new( overlap => 'compress', ratio => 'compress' );
+ my $n = {};
+ my $e = {};
+
+ # core
+ $g->add_node($package_id, label => $packages->{$package_id}, color => 'red');
+
+ ($g,$n, $e) = addRoots($g, $package_id);
+
+ #($g, $n, $e) = addLeaves($g, $package_id);
+
+ print " - generating $package_name content..\n";
+ #$full_graph->as_png("graphs/$package_name/$package_name.png");
+ #$full_graph->as_dot("graphs/$package_name/$package_name.dot");
+ $g->as_png("graphs/$package_name.png");
+ }
+
+}
+
+