summaryrefslogtreecommitdiff
path: root/src/tools/deptree2dot
blob: 07ba17af2ef18a1f084bf191682f26554ec4e77f (plain)
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
#!/usr/bin/perl -w
# -*- cperl -*-
# Copyright © 2012 Diego Elio Pettenò <flameeyes@flameeyes.eu>
# Released under the 2-clause BSD license.
#
#Example usage:
#deptree2dot > deptree.dot
#deptree2dot | dot -Tpng -o deptree.png

my $deptree = defined($ARGV[0]) ? $ARGV[0] : "/run/openrc/deptree";

open DEPTREE, $deptree or exit 1;

print "digraph deptree {\n";

my @deptree;

while(my $line = readline(DEPTREE)) {
  $line =~ /^depinfo_([0-9]+)_([a-z]+)(?:_[0-9]+)?='(.*)'\n$/;
  my $index = $1;
  my $prop = $2;
  my $value = $3; $value =~ s/[-\.:~]/_/g;

  if ( $prop eq "service" ) {
    $deptree[$index] = $value;
    printf "%s [shape=box];\n", $value;
  } else {
    my $service = $deptree[$index];

    if ( $prop eq "ineed" ) {
      printf "%s -> %s;\n", $service, $value;
    } elsif ( $prop eq "iuse" ) {
      printf "%s -> %s [color=blue];\n", $service, $value;
    } elsif ( $prop eq "ibefore" ) {
      printf "%s -> %s [style=dotted];\n", $service, $value;
    } elsif ( $prop eq "iafter" ) {
      printf "%s -> %s [style=dotted color=purple];\n", $value, $service;
    } elsif ( $prop eq "iprovide" ) {
      printf "%s -> %s [color=red];\n", $value, $service;
    }
  }
}

print "}\n";