Visualise macports dependencies

Sun, 15. Aug 2010

Categories: en sysadmin Tags: Graphviz MacPorts OS X Ruby

to clean up your installed macports and remove cruft you need to uninstall them in the correct order โ€“ according to their dependencies.

A graphical visualisation might help doing so:

port-deps

port-deps

Call

$ ./port-deps2dot.rb | dot -Tpdf -o port-deps.pdf ; open port-deps.pdf

with the ruby script port-deps2dot.rb (github gist) as follows:

#!/usr/bin/ruby -w

# visualize macports dependencies.
# pipe the result through graphviz, e.g.
# $ ./port-deps2dot.rb | dot -Tpdf -o port-deps.pdf ; open port-deps.pdf

def scan_deps
  pat = /^([^:]+):(.+)$/
  name = ''
  deps = []
  IO.popen('port info --name --pretty --depends installed') do |f|
    f.each_line do |l|
      case l
        when /^--$/
          yield name, deps
          name = ''
          deps = []
        when /^([^:]+):(.+)$/
          if 'name' == "#$1"
            name = "#$2".strip
          else
            deps.concat("#$2".split(/\s*,\s*/))
          end
        else
          raise "Fall-through for '#{l}'"
      end
    end
  end
end

all = {}

scan_deps do |name,deps|
  d = all[name]
  all[name] = d = [] if d.nil?
  deps.collect! {|i| i.strip}
  d.concat deps
  d.sort!
  d.uniq!
end

head = <<END_OF_STRING
#!/usr/bin/dot -Tpdf -o port-deps.pdf
/*
  See http://www.graphviz.org/Documentation.php
*/
digraph "port deps" {
  rankdir=LR;
    label="port deps";
    node [style=filled,fillcolor=lightblue,shape=ellipse];
    top_level [shape=point];
END_OF_STRING

puts head

all.keys.sort.each do |name|
  deps = all[name]
  if deps.count > 0
    deps.each {|d| puts "\t\"#{name}\" -> \"#{d}\";" }
  else
    puts "\t\"#{name}\";"
  end
end

foot = <<END_OF_STRING
}
END_OF_STRING

puts foot