jhbuild r2566 - in trunk: . jhbuild tests



Author: fpeters
Date: Mon Dec  8 13:36:42 2008
New Revision: 2566
URL: http://svn.gnome.org/viewvc/jhbuild?rev=2566&view=rev

Log:
* jhbuild/moduleset.py, tests/tests.py: do not assume after/suggests
modules have a relationship of after/suggests with their dependencies.
nautilus after tracker, nautilus-cd-burner depends on nautilus, tracker
depends on nautilus-cd-burner, the <after> would be evaluated first and
would transform the dependency of nautilus-cd-burner into an <after>,
ignoring it as it would cycle, causing nautilus-cd-burner to be built
before nautilus.  (closes: #563597)



Modified:
   trunk/ChangeLog
   trunk/jhbuild/moduleset.py
   trunk/tests/tests.py

Modified: trunk/jhbuild/moduleset.py
==============================================================================
--- trunk/jhbuild/moduleset.py	(original)
+++ trunk/jhbuild/moduleset.py	Mon Dec  8 13:36:42 2008
@@ -102,12 +102,12 @@
 
         # 2nd: order them, raise an exception on hard dependency cycle, ignore
         # them for soft dependencies
-        ordered = []
-        state = {}
+        self._ordered = []
+        self._state = {}
 
         for modname in skip:
             # mark skipped modules as already processed
-            state[self.modules.get(modname)] = 'processed'
+            self._state[self.modules.get(modname)] = 'processed'
 
         if tags:
             for modname in self.modules:
@@ -116,29 +116,34 @@
                         break
                 else:
                     # no tag matched, mark module as processed
-                    state[self.modules[modname]] = 'processed'
+                    self._state[self.modules[modname]] = 'processed'
 
         def order(modules, module, mode = 'dependencies'):
-            if state.get(module, 'clean') == 'processed':
+            if self._state.get(module, 'clean') == 'processed':
                 # already seen
                 return
-            if state.get(module, 'clean') == 'in-progress':
+            if self._state.get(module, 'clean') == 'in-progress':
                 # dependency circle, abort when processing hard dependencies
-                if mode == 'dependencies' and not ignore_cycles:
+                if not ignore_cycles:
                     raise DependencyCycleError()
                 else:
-                    state[module] = 'in-progress'
+                    self._state[module] = 'in-progress'
                     return
-            state[module] = 'in-progress'
+            self._state[module] = 'in-progress'
             for modname in module.dependencies:
                 depmod = self.modules[modname]
-                order([self.modules[x] for x in depmod.dependencies], depmod, mode)
+                order([self.modules[x] for x in depmod.dependencies], depmod, 'dependencies')
             if not ignore_suggests:
                 for modname in module.suggests:
                     depmod = self.modules.get(modname)
                     if not depmod:
                         continue
-                    order([self.modules[x] for x in depmod.dependencies], depmod, 'suggests')
+                    save_state, save_ordered = self._state.copy(), self._ordered[:]
+                    try:
+                        order([self.modules[x] for x in depmod.dependencies], depmod, 'suggests')
+                    except DependencyCycleError:
+                        self._state, self._ordered = save_state, save_ordered
+
             extra_afters = []
             for modname in module.after:
                 depmod = self.modules.get(modname)
@@ -158,22 +163,35 @@
                     # full list of hard dependencies, getting it into
                     # extra_afters, so they are also evaluated.
                     # <http://bugzilla.gnome.org/show_bug.cgi?id=546640>
-                    dep_modules = self.get_module_list(seed=[depmod.name])
-                    for m in dep_modules:
+                    t_ms = ModuleSet(self.config)
+                    t_ms.modules = self.modules.copy()
+                    dep_modules = t_ms.get_module_list(seed=[depmod.name])
+                    for m in dep_modules[:-1]:
                         if m in all_modules:
                             extra_afters.append(m)
                     continue
-                order([self.modules[x] for x in depmod.dependencies], depmod, 'after')
+                save_state, save_ordered = self._state.copy(), self._ordered[:]
+                try:
+                    order([self.modules[x] for x in depmod.dependencies], depmod, 'after')
+                except DependencyCycleError:
+                    self._state, self._ordered = save_state, save_ordered
             for depmod in extra_afters:
-                order([self.modules[x] for x in depmod.dependencies], depmod, 'after')
-            state[module] = 'processed'
-            ordered.append(module)
+                save_state, save_ordered = self._state.copy(), self._ordered[:]
+                try:
+                    order([self.modules[x] for x in depmod.dependencies], depmod, 'after')
+                except DependencyCycleError:
+                    self._state, self._ordered = save_state, save_ordered
+            self._state[module] = 'processed'
+            self._ordered.append(module)
 
         for i, module in enumerate(all_modules):
             order([], module)
             if i+1 == len(asked_modules): 
                 break
 
+        ordered = self._ordered[:]
+        del self._ordered
+        del self._state
         return ordered
     
     def get_full_module_list(self, skip=[], ignore_cycles=False):

Modified: trunk/tests/tests.py
==============================================================================
--- trunk/tests/tests.py	(original)
+++ trunk/tests/tests.py	Mon Dec  8 13:36:42 2008
@@ -166,10 +166,22 @@
         # see http://bugzilla.gnome.org/show_bug.cgi?id=546640
         self.moduleset.modules['foo'] # gtk-doc
         self.moduleset.modules['bar'].dependencies = ['foo'] # meta-bootstrap
+        self.moduleset.modules['bar'].type = 'meta'
         self.moduleset.modules['baz'].after = ['bar'] # cairo
         self.moduleset.modules['qux'].dependencies = ['baz'] # meta-stuff
         self.assertEqual(self.get_module_list(['qux', 'foo']), ['foo', 'baz', 'qux'])
 
+    def test_dependency_chain_recursive_after_dependencies(self):
+        '''A chain dependency with an <after> module depending on an inversed relation'''
+        # see http://bugzilla.gnome.org/show_bug.cgi?id=546640
+        self.moduleset.modules['foo'] # nautilus
+        self.moduleset.modules['bar'] # nautilus-cd-burner
+        self.moduleset.modules['baz'] # tracker
+        self.moduleset.modules['foo'].after = ['baz']
+        self.moduleset.modules['bar'].dependencies = ['foo']
+        self.moduleset.modules['baz'].dependencies = ['bar']
+        self.assertEqual(self.get_module_list(['foo', 'bar']), ['foo', 'bar'])
+
 
 class BuildTestCase(unittest.TestCase):
     def setUp(self):



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]