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

Reply via email to