Hi, Attached are two patches: - The first one add an option --tree-level to the current output of repoquery. - The second one add an option --tree-format to be able to switch from asci to dot (it relies on the first patch).
I tested it against --tree-requires as --tree-whatrequires fails (#611046). Regards, Pierre
From 450fe7fcfe6c66c3131262f139bf5ea8520962bf Mon Sep 17 00:00:00 2001 From: pingou <pin...@pingoured.fr> Date: Sun, 19 Dec 2010 15:47:12 +0100 Subject: [PATCH 1/2] Add a --tree-level option to set the deep of the tree shown --- repoquery.py | 34 +++++++++++++++++++++++----------- 1 files changed, 23 insertions(+), 11 deletions(-) diff --git a/repoquery.py b/repoquery.py index c14f296..04a8db6 100755 --- a/repoquery.py +++ b/repoquery.py @@ -317,6 +317,11 @@ class pkgQuery: req = kw.get('req', 'cmd line') level = kw.get('level', 0) all_reqs = kw.get('all_reqs', {}) + + if not isinstance(kw['tree_level'], int) and kw['tree_level'].lower() != 'all': + try: kw['tree_level'] = int(kw['tree_level']) + except ValueError, er: kw['tree_level'] = 'all' + __req2pkgs = {} def req2pkgs(ignore, req): req = str(req) @@ -359,16 +364,20 @@ class pkgQuery: 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)) + if (not isinstance(kw['tree_level'], int) and kw['tree_level'].lower() == 'all') or \ + (isinstance(kw['tree_level'], int) and int(kw['tree_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_level = kw['tree_level']) + def fmt_tree_requires(self, **kw): return self._fmt_tree_prov('requires', **kw) def fmt_tree_conflicts(self, **kw): @@ -837,7 +846,8 @@ class YumBaseQuery(yum.YumBase): print to_unicode(pkg) for oper in self.pkgops: try: - out = pkg.doQuery(oper) + out = pkg.doQuery(oper, + tree_level = self.options.tree_level) if out: print to_unicode(out) except queryError, e: @@ -1037,6 +1047,8 @@ 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-level", dest="tree_level", default = "all", + help="Indicates the level of the tree, can be all or an int") parser.add_option("--search", action="store_true", dest="search", default=False, help="Use yum's search to return pkgs") -- 1.7.2.3
From 0f47ba99df4fb86258b0c6f99b5842fd608d6b27 Mon Sep 17 00:00:00 2001 From: pingou <pin...@pingoured.fr> Date: Sun, 19 Dec 2010 15:57:05 +0100 Subject: [PATCH 2/2] Add a --tree-format option to output the tree as asci (default) or dot --- repoquery.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 77 insertions(+), 19 deletions(-) diff --git a/repoquery.py b/repoquery.py index 04a8db6..b5abc86 100755 --- a/repoquery.py +++ b/repoquery.py @@ -75,6 +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): @@ -126,6 +135,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: @@ -321,6 +354,8 @@ class pkgQuery: if not isinstance(kw['tree_level'], int) and kw['tree_level'].lower() != 'all': try: kw['tree_level'] = int(kw['tree_level']) except ValueError, er: kw['tree_level'] = 'all' + + if not 'tree_format' in kw.keys(): kw['tree_format'] = 'asci' __req2pkgs = {} def req2pkgs(ignore, req): @@ -360,23 +395,43 @@ class pkgQuery: __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 - if (not isinstance(kw['tree_level'], int) and kw['tree_level'].lower() == 'all') or \ - (isinstance(kw['tree_level'], int) and int(kw['tree_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_level = kw['tree_level']) + if kw['tree_format'].lower() == 'asci': + 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 (not isinstance(kw['tree_level'], int) and kw['tree_level'].lower() == 'all') or \ + (isinstance(kw['tree_level'], int) and int(kw['tree_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_level = kw['tree_level']) + + 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 (not isinstance(kw['tree_level'], int) and kw['tree_level'].lower() == 'all') or \ + (isinstance(kw['tree_level'], int) and int(kw['tree_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_level = kw['tree_level'], + tree_format = kw['tree_format'], + dot = dot) def fmt_tree_requires(self, **kw): return self._fmt_tree_prov('requires', **kw) @@ -847,7 +902,8 @@ class YumBaseQuery(yum.YumBase): for oper in self.pkgops: try: out = pkg.doQuery(oper, - tree_level = self.options.tree_level) + tree_level = self.options.tree_level, + tree_format = self.options.tree_format) if out: print to_unicode(out) except queryError, e: @@ -1048,7 +1104,9 @@ def main(args): dest="tree_what_requires", help="list recursive what requires, in tree form") parser.add_option("--tree-level", dest="tree_level", default = "all", - help="Indicates the level of the tree, can be all or an int") + help="indicates the level of the tree, can be all or an int") + parser.add_option("--tree-format", dest="tree_format", default = "asci", + help="indicates the desired output for the tree (asci or dot, default to asci)") 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