* implement graph command: new utility to write package relations graph to disk

This commit is contained in:
Eray Özkural
2005-09-21 12:30:01 +00:00
parent c93590eb08
commit fd4138ff5e
4 changed files with 64 additions and 3 deletions
+33
View File
@@ -228,6 +228,39 @@ def install_pkg_names(A):
return True # everything went OK :)
def package_graph(A):
"""Construct a package relations graph, containing
all dependencies of packages A"""
ctx.ui.debug('A = %s' % str(A))
# try to construct a pisi graph of packages to
# install / reinstall
G_f = pgraph.PGraph(packagedb) # construct G_f
# find the "install closure" graph of G_f by package
# set A using packagedb
for x in A:
G_f.add_package(x)
B = A
#state = {}
while len(B) > 0:
Bp = set()
for x in B:
pkg = packagedb.get_package(x)
print pkg
for dep in pkg.runtimeDeps:
# we don't deal with already *satisfied* dependencies
if not dep.package in G_f.vertices():
Bp.add(str(dep.package))
G_f.add_dep(x, dep)
# if not dependency.installed_satisfies_dep(dep):
# if not dep.package in G_f.vertices():
# Bp.add(str(dep.package))
# G_f.add_dep(x, dep)
B = Bp
return G_f
def upgrade(A):
upgrade_pkg_names(A)
+24
View File
@@ -208,6 +208,30 @@ class Clean(Command):
pisi.util.clean_locks()
self.finalize()
class Graph(Command):
"""Graph package relations.
Usage: graph <package1> <package2> ...
Write a graph of package relations, tracking dependency and
conflicts relations starting from given packages.
"""
__metaclass__ = autocommand
def __init__(self):
super(Graph, self).__init__()
name = ("graph", None)
def run(self):
self.init()
if self.args:
g = pisi.api.package_graph(self.args)
g.write_graphviz(file('pgraph.dot', 'w'))
self.finalize()
def buildno_opts(self):
self.parser.add_option("", "--ignore-build-no", action="store_true",
default=False,
+6 -2
View File
@@ -132,16 +132,20 @@ class Digraph(object):
list.reverse()
return list
def id_str(self, u):
s = str(u)
return s.replace('-', '_')
def write_graphviz(self, f):
f.write('digraph G {\n')
for u in self.vertices():
f.write(u)
f.write(self.id_str(u))
self.write_graphviz_vlabel(f, u)
f.write(';\n')
f.write('\n')
for u in self.vertices():
for v in self.adj(u):
f.write(u + ' -- ' + v)
f.write( self.id_str(u) + ' -> ' + self.id_str(v))
self.write_graphviz_elabel(f, u, v)
f.write(';\n')
f.write('\n')
+1 -1
View File
@@ -75,5 +75,5 @@ class PGraph(Digraph):
def write_graphviz_vlabel(self, f, u):
(v, r) = self.vertex_data(u)
f.write('[ ' + str(u) + '(' + str(v) + ',' + str(r) + ') ]')
f.write('[ label = \"' + str(u) + '(' + str(v) + ',' + str(r) + ')\" ]')