On Wed, 2011-01-12 at 11:15 -0500, seth vidal wrote: > > --requires --level=# --output=ascii-tree|dot-tree
There is a patch which works for --requires --level=[#|all] --output=[text|ascii-tree|dot-tree] and --whatrequires --level=[#|all] --output=[text|ascii-tree|dot-tree] (the old --tree-requires and -tree-whatrequires are also still valid). I would appreciate before I try to fix the last two trees if someone could have a look at this patch and let me know if I am doing things correctly. Thanks in advance, Pierre
From 59c4e1f05a1f4656a3b8ae252b6244a7d974898d Mon Sep 17 00:00:00 2001 From: pingou <[email protected]> Date: Sat, 15 Jan 2011 13:50:23 +0100 Subject: [PATCH] Update arguments - Remove --show-dupes from --help (while the argument still works) - Remove --tree-* from --help (while the argument still works) - Implement the --output[text|ascii-tree|dot-tree] (default to 'text') argument - Implement the --level[all|any int] (default to 'all') argument The combination of --requires --output=ascii-tree --level=all reproduce the behavior of --tree-requires same goes for --whatrequires vs --tree-whatrequires. --- repoquery.py | 224 +++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 184 insertions(+), 40 deletions(-) diff --git a/repoquery.py b/repoquery.py index c14f296..7a815b6 100755 --- a/repoquery.py +++ b/repoquery.py @@ -29,6 +29,7 @@ import exceptions import urlparse from optparse import OptionParser +from optparse import SUPPRESS_HELP import logging import yum @@ -75,7 +76,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 +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: @@ -230,7 +263,15 @@ class pkgQuery: return self._translated_qf[self.qf] % self def fmt_requires(self, **kw): - return "\n".join(self.prco('requires')) + if self.yb.options.output == "ascii-tree": + self.fmt_tree_requires(output = self.yb.options.output, + tree_level = self.yb.options.tree_level) + elif self.yb.options.output == "dot-tree": + self.fmt_tree_requires(output = self.yb.options.output, + tree_level = self.yb.options.tree_level, + dot = self.yb.options.dot) + else: + return "\n".join(self.prco('requires')) def fmt_provides(self, **kw): return "\n".join(self.prco('provides')) @@ -317,6 +358,16 @@ class pkgQuery: req = kw.get('req', 'cmd line') level = kw.get('level', 0) all_reqs = kw.get('all_reqs', {}) + + if str(kw['tree_level']).lower() != 'all': + try: + kw['tree_level'] = int(kw['tree_level']) + except ValueError, er: + kw['tree_level'] = 'all' + + if not 'output' in kw.keys(): + kw['output'] = 'ascii-tree' + __req2pkgs = {} def req2pkgs(ignore, req): req = str(req) @@ -353,22 +404,46 @@ 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['output'].lower() == 'ascii-tree': + 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_level']).lower() == 'all' or \ + 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'], + output = kw['output']) + elif kw['output'].lower() == 'dot-tree': + 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_level']).lower() == 'all' or \ + 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'], + output = kw['output'], + dot = dot) + def fmt_tree_requires(self, **kw): return self._fmt_tree_prov('requires', **kw) def fmt_tree_conflicts(self, **kw): @@ -421,6 +496,15 @@ class pkgQuery: level = kw.get('level', 0) all_reqs = kw.get('all_reqs', {}) + if str(kw['tree_level']).lower() != 'all': + try: + kw['tree_level'] = int(kw['tree_level']) + except ValueError, er: + kw['tree_level'] = 'all' + + if not 'output' in kw.keys(): + kw['output'] = 'ascii-tree' + __prov2pkgs = {} def prov2pkgs(prov, ignore): if str(prov) in __prov2pkgs: @@ -453,25 +537,66 @@ class pkgQuery: __prov2pkgs[str(prov)] = arequirers + irequirers return arequirers + irequirers - self._tree_print_req(pkg, req, level) filetupes = [] for n in pkg.filelist + pkg.dirlist + pkg.ghostlist: filetupes.append((n, None, (None, None, None))) - - tups = pkg.provides + filetupes - rpkgs, loc_reqs = self._tree_maybe_add_pkgs(all_reqs, tups, prov2pkgs) - nlevel = level + 1 - for rpkg in sorted(rpkgs): - if pkg.verEQ(rpkg): # Remove deps. on self. - continue - if rpkgs[rpkg] is None: - req = self._tree_pkg2val(loc_reqs, rpkg) - self._tree_print_req(rpkg, req, nlevel) - continue - self.fmt_tree_what_requires(pkg=rpkg, + + if kw['output'].lower() == 'ascii-tree': + self._tree_print_req(pkg, req, level) + tups = pkg.provides + filetupes + rpkgs, loc_reqs = self._tree_maybe_add_pkgs(all_reqs, tups, prov2pkgs) + nlevel = level + 1 + if str(kw['tree_level']).lower() == 'all' or \ + int(kw['tree_level']) > int(nlevel -1): + for rpkg in sorted(rpkgs): + if pkg.verEQ(rpkg): # Remove deps. on self. + continue + if rpkgs[rpkg] is None: + req = self._tree_pkg2val(loc_reqs, rpkg) + self._tree_print_req(rpkg, req, nlevel) + continue + self.fmt_tree_what_requires(pkg=rpkg, level=nlevel, all_reqs=all_reqs, - req=self._tree_pkg2val(loc_reqs, rpkg)) - + req=self._tree_pkg2val(loc_reqs, rpkg), + tree_level = kw['tree_level'], + output = kw['output']) + + elif kw['output'].lower() == 'dot-tree': + if not 'dot' in kw.keys(): + dot = DotPlot() + else: + dot = kw['dot'] + tups = pkg.provides + filetupes + rpkgs, loc_reqs = self._tree_maybe_add_pkgs(all_reqs, tups, prov2pkgs) + dot.addPackage(pkg, rpkgs) + nlevel = level + 1 + if str(kw['tree_level']).lower() == 'all' or \ + int(kw['tree_level']) > int(nlevel -1): + for rpkg in sorted(rpkgs): + if pkg.verEQ(rpkg): # Remove deps. on self. + continue + if rpkgs[rpkg] is None: + req = self._tree_pkg2val(loc_reqs, rpkg) + continue + self.fmt_tree_what_requires(pkg=rpkg, + level=nlevel, all_reqs=all_reqs, + req=self._tree_pkg2val(loc_reqs, rpkg), + tree_level = kw['tree_level'], + output = kw['output'], + dot = dot) + #tups = getattr(pkg, prco_type) + #rpkgs, loc_reqs = self._tree_maybe_add_pkgs(all_reqs, tups, req2pkgs) + # + #nlevel = level + 1 + #if str(kw['tree_level']).lower() == 'all' or \ + #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'], + #output = kw['output'], + #) class repoPkgQuery(pkgQuery): """ @@ -837,7 +962,10 @@ 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, + output = self.options.output, + dot = self.options.dot) if out: print to_unicode(out) except queryError, e: @@ -881,7 +1009,9 @@ class YumBaseQuery(yum.YumBase): require_recursive(pkg.name) - require_recursive(name) + + if self.options.output == 'text': + require_recursive(name) return self.queryPkgFactory(sorted(pkgs.values())) def fmt_whatobsoletes(self, name, **kw): @@ -1002,7 +1132,7 @@ def main(args): dest="show_dupes", help="show all versions of packages") parser.add_option("--show-dupes", action="store_true", - help="show all versions of packages") + help=SUPPRESS_HELP) parser.add_option("--repoid", action="append", help="specify repoids to query, can be specified multiple times (default is all enabled)") parser.add_option("--enablerepo", action="append", dest="enablerepos", @@ -1027,16 +1157,20 @@ def main(args): help="config file location") parser.add_option("--tree-requires", action="store_true", dest="tree_requires", - help="list recursive requirements, in tree form") + help=SUPPRESS_HELP) parser.add_option("--tree-conflicts", action="store_true", dest="tree_conflicts", - help="list recursive conflicts, in tree form") + help=SUPPRESS_HELP) parser.add_option("--tree-obsoletes", action="store_true", dest="tree_obsoletes", - help="list recursive obsoletes, in tree form") + help=SUPPRESS_HELP) parser.add_option("--tree-whatrequires", action="store_true", dest="tree_what_requires", - help="list recursive what requires, in tree form") + help=SUPPRESS_HELP) + parser.add_option("--level", dest="tree_level", default="all", + help="levels to display (can be any number of 'all', default to 'all')") + parser.add_option("--output", dest="output", default="text", + help="output format to use (can be text|ascii-tree|dot-tree, default to 'text')") parser.add_option("--search", action="store_true", dest="search", default=False, help="Use yum's search to return pkgs") @@ -1088,17 +1222,27 @@ def main(args): if opts.source: pkgops.append("source") if opts.tree_requires: + opts.output = "ascii-tree" pkgops.append("tree_requires") if opts.tree_conflicts: + opts.output = "ascii-tree" pkgops.append("tree_conflicts") if opts.tree_obsoletes: + opts.output = "ascii-tree" pkgops.append("tree_obsoletes") if opts.tree_what_requires: + opts.output = "ascii-tree" pkgops.append("tree_what_requires") + if opts.output == "dot-tree": + opts.dot = DotPlot() + else: + opts.dot = None if opts.srpm: needsource = 1 if opts.whatrequires: sackops.append("whatrequires") + if opts.output != 'text': + pkgops.append("tree_what_requires") if opts.whatprovides: sackops.append("whatprovides") if opts.whatobsoletes: -- 1.7.3.4
_______________________________________________ Yum-devel mailing list [email protected] http://lists.baseurl.org/mailman/listinfo/yum-devel
