[Checkins] SVN: GenericSetup/trunk/ Fixed a sorting error (see README.txt).

Lennart Regebro regebro at gmail.com
Tue May 2 08:33:04 EDT 2006


Log message for revision 67831:
  Fixed a sorting error (see README.txt).
  

Changed:
  U   GenericSetup/trunk/CHANGES.txt
  U   GenericSetup/trunk/registry.py
  U   GenericSetup/trunk/tests/test_registry.py

-=-
Modified: GenericSetup/trunk/CHANGES.txt
===================================================================
--- GenericSetup/trunk/CHANGES.txt	2006-05-02 10:56:10 UTC (rev 67830)
+++ GenericSetup/trunk/CHANGES.txt	2006-05-02 12:33:03 UTC (rev 67831)
@@ -1,6 +1,12 @@
 GenericSetup Product Changelog
 
   GenericSetup 1.1 (2006/04/16)
+    - The dependency sorting was highly reliant on steps being added in the
+      right order to work. If import step A depends on import step B which 
+      depends on step C, and step C gets processed early, and they were 
+      processed in the order A, C, B, then the dependency order would be 
+      incorrect. This is now fixed by keeping tack of steps with unresolved
+      dependencies, and trying again after inserting everything else.
 
     - ZCatalog handler: Implemented the 'remove' directive for indexes.
       This allows to write extension profiles that remove or replace indexes.

Modified: GenericSetup/trunk/registry.py
===================================================================
--- GenericSetup/trunk/registry.py	2006-05-02 10:56:10 UTC (rev 67830)
+++ GenericSetup/trunk/registry.py	2006-05-02 12:33:03 UTC (rev 67831)
@@ -237,17 +237,37 @@
         graph = [ ( x[ 'id' ], x[ 'dependencies' ] )
                     for x in self._registered.values() ]
 
-        for node, edges in graph:
+        unresolved = []
 
-            after = -1
+        while 1:
+            for node, edges in graph:
+    
+                after = -1
+                resolved = 0
+    
+                for edge in edges:
+    
+                    if edge in result:
+                        resolved += 1
+                        after = max( after, result.index( edge ) )
+                
+                if len(edges) > resolved:
+                    unresolved.append((node, edges))
+                else:
+                    result.insert( after + 1, node )
 
-            for edge in edges:
-
-                if edge in result:
-                    after = max( after, result.index( edge ) )
-
-            result.insert( after + 1, node )
-
+            if not unresolved:
+                break
+            if len(unresolved) == len(graph):
+                # Nothing was resolved in this loop. There must be circular or
+                # missing dependencies. Just add them to the end. We can't
+                # raise an error, because checkComplete relies on this method.
+                for node, edges in unresolved:
+                    result.append(node)
+                break
+            graph = unresolved
+            unresolved = []
+        
         return result
 
     security.declarePrivate( '_exportTemplate' )

Modified: GenericSetup/trunk/tests/test_registry.py
===================================================================
--- GenericSetup/trunk/tests/test_registry.py	2006-05-02 10:56:10 UTC (rev 67830)
+++ GenericSetup/trunk/tests/test_registry.py	2006-05-02 12:33:03 UTC (rev 67831)
@@ -152,11 +152,6 @@
         steps = registry.listSteps()
         self.assertEqual( len( steps ), 1 )
         self.failUnless( 'one' in steps )
-
-        sorted = registry.sortSteps()
-        self.assertEqual( len( sorted ), 1 )
-        self.assertEqual( sorted[ 0 ], 'one' )
-
         self.assertEqual( registry.getStep( 'one' ), ONE_FUNC )
 
         info = registry.getStepMetadata( 'one' )
@@ -274,14 +269,14 @@
         registry.registerStep( id='one'
                              , version='1'
                              , handler=ONE_FUNC
-                             , dependencies=( 'two', )
+                             , dependencies=( 'three', )
                              , title='One small step'
                              )
 
         registry.registerStep( id='two'
                              , version='2'
                              , handler=TWO_FUNC
-                             , dependencies=( 'three', )
+                             , dependencies=( 'one', )
                              , title='Texas two step'
                              )
 
@@ -291,15 +286,16 @@
                              , dependencies=()
                              , title='Gimme three steps'
                              )
-
+       
         steps = registry.sortSteps()
         self.assertEqual( len( steps ), 3 )
         one = steps.index( 'one' )
         two = steps.index( 'two' )
         three = steps.index( 'three' )
 
-        self.failUnless( 0 <= three < two < one )
+        self.failUnless( 0 <= three < one < two )
 
+
     def test_sortStep_complex( self ):
 
         registry = self._makeOne()



More information about the Checkins mailing list