jhbuild r2566 - in trunk: . jhbuild tests
- From: fpeters svn gnome org
- To: svn-commits-list gnome org
- Subject: jhbuild r2566 - in trunk: . jhbuild tests
- Date: Mon, 8 Dec 2008 13:36:42 +0000 (UTC)
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]