On Mon, 2010-12-20 at 18:54 +0100, Pierre-Yves wrote: > On Mon, 2010-12-20 at 09:57 -0500, James Antill wrote: > > I think "tree_level" means "the > > maximum level of the tree that we will show? If so you might want to > > change the option to --tree-level-max or something. > > Taking your remarks into account, there is a cleaned patch. I will > generate the second patch for --tree-format if you agree with this > one.
As you were saying on irc that one patch is enough, there it is. Pierre
From a5ca309bd857696d83eb171b9769841546d6bd37 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon <pin...@pingoured.fr> Date: Mon, 20 Dec 2010 18:52:33 +0100 Subject: [PATCH] Add tree max level and tree format option Add a --tree-max-level option to specify the maximum level of the tree shown Add the --tree-format[dot|ascii] option --- repoquery.py | 106 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 88 insertions(+), 18 deletions(-) diff --git a/repoquery.py b/repoquery.py index c14f296..eeb4371 100755 --- a/repoquery.py +++ b/repoquery.py @@ -75,7 +75,15 @@ querytags = [ 'name', 'version', 'release', 'epoch', 'arch', 'summary', 'relativepath', 'hdrstart', 'hdrend', 'id', ] - +default_header = """ +size="20.69,25.52"; +ratio="fill"; +rankdir="TB"; +orientation=port; +node[style="filled"]; +outputorder="edgesfirst"; +ranksep="1"; +""" def sec2isodate(timestr): return time.strftime("%F %T", time.gmtime(int(timestr))) @@ -126,6 +134,30 @@ class queryError(exceptions.Exception): return '%s' % to_unicode(self.value) +class DotPlot(object): + def __init__(self): + self.maxdeps = 0 + + print 'digraph packages {', + print '%s' % default_header + + def addPackage(self, pkg, deps): + if len(deps) > self.maxdeps: + self.maxdeps=len(deps) + + # color calculations lifted from rpmgraph + h=0.5+(0.6/23*len(deps)) + s=h+0.1 + b=1.0 + + print '"%s" [color="%s %s %s"];' % (pkg, h, s, b) + print '"%s" -> {' % pkg + for req in deps: + print '"%s"' % req + print '} [color="%s %s %s"];\n' % (h, s, b) + + def __del__(self): + print "}" # abstract class class pkgQuery: @@ -317,6 +349,16 @@ class pkgQuery: req = kw.get('req', 'cmd line') level = kw.get('level', 0) all_reqs = kw.get('all_reqs', {}) + + if str(kw['tree_max_level']).lower() != 'all': + try: + kw['tree_max_level'] = int(kw['tree_max_level']) + except ValueError, er: + kw['tree_max_level'] = 'all' + + if not 'tree_format' in kw.keys(): + kw['tree_format'] = 'ascii' + __req2pkgs = {} def req2pkgs(ignore, req): req = str(req) @@ -353,22 +395,44 @@ class pkgQuery: return [] __req2pkgs[req] = providers - return providers - - self._tree_print_req(pkg, req, level) - tups = getattr(pkg, prco_type) - rpkgs, loc_reqs = self._tree_maybe_add_pkgs(all_reqs, tups, req2pkgs) - nlevel = level + 1 - for rpkg in sorted(rpkgs): - if pkg.verEQ(rpkg): - continue - if rpkgs[rpkg] is None: - req = self._tree_pkg2val(loc_reqs, rpkg) - self._tree_print_req(rpkg, req, nlevel) - continue - self._fmt_tree_prov(prco_type, - pkg=rpkg, level=nlevel, all_reqs=all_reqs, - req=self._tree_pkg2val(loc_reqs, rpkg)) + return providers + + if kw['tree_format'].lower() == 'ascii': + self._tree_print_req(pkg, req, level) + tups = getattr(pkg, prco_type) + rpkgs, loc_reqs = self._tree_maybe_add_pkgs(all_reqs, tups, req2pkgs) + nlevel = level + 1 + if str(kw['tree_max_level']).lower() == 'all' or int(kw['tree_max_level']) > int(nlevel -1): + for rpkg in sorted(rpkgs): + if pkg.verEQ(rpkg): + continue + if rpkgs[rpkg] is None: + req = self._tree_pkg2val(loc_reqs, rpkg) + self._tree_print_req(rpkg, req, nlevel) + continue + self._fmt_tree_prov(prco_type, + pkg=rpkg, level=nlevel, all_reqs=all_reqs, + req=self._tree_pkg2val(loc_reqs, rpkg), + tree_max_level = kw['tree_max_level'], + tree_format = kw['tree_format']) + elif kw['tree_format'].lower() == 'dot': + if not 'dot' in kw.keys(): + dot = DotPlot() + else: + dot = kw['dot'] + tups = getattr(pkg, prco_type) + rpkgs, loc_reqs = self._tree_maybe_add_pkgs(all_reqs, tups, req2pkgs) + dot.addPackage(pkg, rpkgs) + nlevel = level + 1 + if str(kw['tree_max_level']).lower() == 'all' or int(kw['tree_max_level']) > int(nlevel): + for rpkg in sorted(rpkgs): + self._fmt_tree_prov(prco_type, + pkg=rpkg, level=nlevel, all_reqs=all_reqs, + req=self._tree_pkg2val(loc_reqs, rpkg), + tree_max_level = kw['tree_max_level'], + tree_format = kw['tree_format'], + dot = dot) + def fmt_tree_requires(self, **kw): return self._fmt_tree_prov('requires', **kw) def fmt_tree_conflicts(self, **kw): @@ -837,7 +901,9 @@ class YumBaseQuery(yum.YumBase): print to_unicode(pkg) for oper in self.pkgops: try: - out = pkg.doQuery(oper) + out = pkg.doQuery(oper, + tree_max_level = self.options.tree_max_level, + tree_format = self.options.tree_format) if out: print to_unicode(out) except queryError, e: @@ -1037,6 +1103,10 @@ def main(args): parser.add_option("--tree-whatrequires", action="store_true", dest="tree_what_requires", help="list recursive what requires, in tree form") + parser.add_option("--tree-max-level", dest="tree_max_level", default = "all", + help="indicates the maximal level of the tree, can be all or an int") + parser.add_option("--tree-format", dest="tree_format", default = "ascii", + help="indicates the desired output for the tree (ascii or dot, default to ascii)") parser.add_option("--search", action="store_true", dest="search", default=False, help="Use yum's search to return pkgs") -- 1.7.2.3
_______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel