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

Reply via email to