[ooo-build-commit] .: bin/check-deps.py

Kohei Yoshida kohei at kemper.freedesktop.org
Fri Jul 9 13:43:57 PDT 2010


 bin/check-deps.py |   68 ++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 54 insertions(+), 14 deletions(-)

New commits:
commit f3fa77b9b218d171007d827ae645d91f457b2049
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Fri Jul 9 16:42:38 2010 -0400

    [check-deps.py] Remove duplicate dependency pairs & paint selected modules.
    
    * bin/check-deps.py:

diff --git a/bin/check-deps.py b/bin/check-deps.py
index 2f51e6a..ff4b426 100755
--- a/bin/check-deps.py
+++ b/bin/check-deps.py
@@ -32,6 +32,18 @@ class Module(object):
         self.deps  = {} # dependents
         self.precs = {} # precedents
 
+# Store all unique dependency set, with no duplicates.
+class DependSet(object):
+
+    def __init__ (self):
+        self.modules = {}
+
+    def insert_depend (self, prec, dep):
+        if not self.modules.has_key(prec):
+            self.modules[prec] = {}
+        if dep != None:
+            self.modules[prec][dep] = True
+
 class DepsCheker(object):
 
     def __init__ (self):
@@ -117,7 +129,7 @@ class DepsCheker(object):
             self.__parse_build_lst(build_lst)
             
     def print_dot_all (self):
-
+        self.dep_set = DependSet() # reset
         s = "digraph modules {\n"
 
         if len(self.selected) == 0:
@@ -125,7 +137,7 @@ class DepsCheker(object):
             for mod in mods:
                 deps = self.modules[mod].deps.keys()
                 for dep in deps:
-                    s += self.__print_dot_dep_line(mod, dep)
+                    self.dep_set.insert_depend(mod, dep)
         else:
             # determine involved modules.
             self.__processed_mods = {}
@@ -134,16 +146,18 @@ class DepsCheker(object):
                     raise ParseError()
 
                 if len(self.modules[selected].deps) > 0:
-                    s += self.__trace_deps(self.modules[selected])
-                else:
-                    s += "    " + selected + ";\n"
+                    self.__trace_deps(self.modules[selected])
 
+        s += self.__print_dot_depset()
+        s += self.__print_dot_selected()
         s += self.__print_dot_missing_modules()
         s += "}\n"
         return s
 
     def print_dot_single (self, mods):
+        self.dep_set = DependSet() # reset
         s = "digraph modules {\n"
+
         for mod in mods:
 
             if not self.modules.has_key(mod):
@@ -153,14 +167,16 @@ class DepsCheker(object):
 
             if len(obj.precs) == 0 and len(obj.deps) == 0:
                 # No dependencies.  Just print the module.
-                s += "    " + mod + ";\n"
+                self.dep_set.insert_depend(mod, None)
                 continue
 
             for prec in obj.precs.keys():
-                s += self.__print_dot_dep_line(prec, obj.name)
+                self.dep_set.insert_depend(prec, obj.name)
             for dep in obj.deps.keys():
-                s += self.__print_dot_dep_line(obj.name, dep)
+                self.dep_set.insert_depend(obj.name, dep)
 
+        s += self.__print_dot_depset()
+        s += self.__print_dot_selected()
         s += self.__print_dot_missing_modules()
         s += "}\n"
         return s
@@ -189,36 +205,60 @@ class DepsCheker(object):
             sys.stderr.write("    " + mod + "\n")
 
     def __trace_deps (self, obj):
-        s = ""
         if self.__processed_mods.has_key(obj.name):
-            return s
+            return
 
         self.__processed_mods[obj.name] = True
 
         for dep_name in obj.deps.keys():
             if not self.modules.has_key(dep_name):
                 raise ParseError()
-            s += self.__print_dot_dep_line(obj.name, dep_name)
-            s += self.__trace_deps(self.modules[dep_name])
+            self.dep_set.insert_depend(obj.name, dep_name)
+            self.__trace_deps(self.modules[dep_name])
 
+    def __print_dot_depset (self):
+        s = ''
+        mods = self.dep_set.modules.keys()
+        for mod in mods:
+            deps = self.dep_set.modules[mod].keys()
+            if len(deps) == 0:
+                # this module has no dependency.
+                s += self.__print_dot_dep_line(mod, None)
+            else:
+                for dep in deps:
+                    s += self.__print_dot_dep_line(mod, dep)
+        return s
+
+    def __print_dot_selected (self):
+        s = ''
+        for mod in self.selected:
+            if not self.modules_used.has_key(mod):
+                continue
+            s += "    %s [color=lightblue,style=filled];\n"%mod
         return s
 
+
     def __print_dot_missing_modules (self):
         self.__calc_missing_modules()
         s = ''
         for mod in self.modules_missing.keys():
             if not self.modules_used.has_key(mod):
                 continue
-
             s += "    %s [color=red,style=filled];\n"%mod
 
         return s
 
 
     def __print_dot_dep_line (self, prec, dep):
+        if prec == None:
+            raise ParseError()
+
         self.modules_used[prec] = True
+        if dep == None:
+            # this module has no dependency.  I still need to mention the module name.
+            return "    %s;\n"%prec
         self.modules_used[dep] = True
-        return "    " + prec + " -> " + dep + ";\n"
+        return "    %s -> %s;\n"%(prec, dep)
 
 def exec_exists (cmd):
     retcode = subprocess.call("which %s >/dev/null 2>/dev/null"%cmd, shell=True)


More information about the ooo-build-commit mailing list