generate dot file and render it using graphviz
[APKPM.git] / scripts / gearman2dot.pl
index 76f6ad3..96cd8d2 100755 (executable)
@@ -7,9 +7,30 @@ use File::Find;
 use File::Slurp;
 use Data::Dump qw(dump);
 
+my $dot;
+sub dot {
+       $dot .= join("\n",@_) . "\n";
+       warn "DOT ",@_,$/;
+}
+
 sub print_job {
-       return unless @_;
-       print "JOB ",dump(@_),$/;
+       my ( $name, $job ) = @_;
+       warn "JOB $name ",dump($job),$/;
+
+       return unless exists $job->{task};
+
+       $name = $job->{name};
+
+       foreach my $taskset ( keys %{ $job->{task} } ) {
+               dot "subgraph ${name}_$taskset {";
+               my @t = @{ $job->{task}->{$taskset} };
+               my $wait = $t[$#t] eq 'wait' && pop @t;
+               foreach my $f ( @t ) {
+                       dot qq|"$name" -> "$f"|;
+                       dot qq|"$f" -> "${name}_wait"| if $wait;
+               }
+               dot "} //subgraph";
+       }
 }
 
 find(sub {
@@ -30,7 +51,14 @@ find(sub {
                        }
                } elsif ( m/\$self->(do\w*)\(\s*'(\w+)'/ ) {
                        push @{ $job->{$1} }, $2;
+                       dot qq|"$job->{name}" -> "$2" [ label="$1" ]|;
                }
        }
        print_job $name => $job;
 }, 'lib');
+
+print $dot;
+
+open(my $d, '|-', 'dot -Tpng -o public/gearman.png');
+print $d "digraph {\n$dot\n}\n";
+close($d);