summary refs log tree commit diff
path: root/generate_dots.pl
blob: c30f4d80c13d2f91da8808ac217b5029235ec592 (plain) (blame)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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");
	}

}