-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathport_tree.rb
executable file
·80 lines (75 loc) · 2.38 KB
/
port_tree.rb
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
#!/usr/bin/env ruby
#
# port_tree.rb: Class (and command line tool) for producing dot language directed graphs of port dependencies.
#
# ====================================================================
# Copyright (c) 2008 Tony Doan <[email protected]>. All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at http://github.com/tdoan/port_upgrade/tree/master/COPYING.
# If newer versions of this license are posted there, you may use a
# newer version instead, at your option.
# ====================================================================
#
require 'rubygems'
require 'bz2'
require 'find'
require 'erb'
require File.dirname(__FILE__) + "/lib/port_upgrade.rb"
require 'sqlite3'
class NodeOptions
def initialize(port,args={})
case port
when Ports::Port
name = port.name
$stderr.puts "Got a Ports::Port"
else
port = Ports::Port.new(port)
name = port.name
end
@options = {}
@options['label'] = "\"#{name}\""
@options['color'] = 'red'
@options = @options.merge(args)
if port.versions.size > 1
@options['shape'] = 'record'
@options['color'] = 'purple'
@options['label'] = "\"#{name}|{#{port.versions.join("|")}}\""
end
end
def []=(key,value)
@options[key] = value
end
def to_s
@options.keys.collect do |key|
"#{key}=#{@options[key]}"
end.join(" ")
end
end
def to_dot(ports,deps)
template = ERB.new(File.read("port_tree.erb"))
tree_data = deps.collect{|o| [o[0].dot_clean,o[1].dot_clean]}.collect{|p| p[1]==""? p[0]:p.join("->")}.sort{|x,y| x <=> y}.join("\n")
#ports = @ports
deps = deps.collect{|o| o[1]}.uniq
leaves = (ports - deps).sort
onodes = (ports - leaves).sort
tree_data += "\n"
leaves.each{|p| tree_data += "#{p.dot_clean}[#{NodeOptions.new(@pdb[p],"color"=>"green").to_s}]\n" }# "#{p.dot_clean}[label=\"#{p}\" color=green]\n"}
onodes.each{|p| tree_data += "#{p.dot_clean}[#{NodeOptions.new(@pdb[p]).to_s}]\n" }
template.result(binding)
end
if __FILE__ == $PROGRAM_NAME
@pdb = Ports::PortsDB.new(ARGV[0])
db = @pdb.db
deps = nil
db.query("select port,dep from deps") do |r|
deps = r.to_a
end
ports = nil
db.query("select distinct port from ports") do |r|
ports = r.to_a.flatten
end
db.close
puts to_dot(ports,deps)
end