* implement graph command: new utility to write package relations graph to disk
This commit is contained in:
+33
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
@@ -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) + ')\" ]')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user