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

Reply via email to