diff options
author | Zac Medico <zmedico@gentoo.org> | 2010-10-29 16:29:37 -0700 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2010-10-29 20:40:32 -0700 |
commit | e4813a9b821f1f941fdc1bd3bb7f0ad57a4b88fc (patch) | |
tree | d35a4d82fe2a1cc75521d27fd0ddb86888b4c5aa | |
parent | ee53baefad8a0f9d1bdf3014d17730fc2d60002e (diff) | |
download | portage-e4813a9b821f1f941fdc1bd3bb7f0ad57a4b88fc.tar.gz portage-e4813a9b821f1f941fdc1bd3bb7f0ad57a4b88fc.tar.bz2 portage-e4813a9b821f1f941fdc1bd3bb7f0ad57a4b88fc.zip |
Fix LazyItemsDict.__deepcopy__() for python 2.7.
In python-2.7, changes in deepcopy() make LazyItemsDict.__deepcopy__()
fail in some cases. Thanks to Diego E. Pettenò <flameeyes@g.o> for
reporting.
-rw-r--r-- | pym/portage/tests/ebuild/test_config.py | 22 | ||||
-rw-r--r-- | pym/portage/util/__init__.py | 15 |
2 files changed, 28 insertions, 9 deletions
diff --git a/pym/portage/tests/ebuild/test_config.py b/pym/portage/tests/ebuild/test_config.py index 9e2d2eaaa..9b6b13bab 100644 --- a/pym/portage/tests/ebuild/test_config.py +++ b/pym/portage/tests/ebuild/test_config.py @@ -10,6 +10,28 @@ from portage.tests.resolver.ResolverPlayground import ResolverPlayground, Resolv class ConfigTestCase(TestCase): + def testClone(self): + """ + Test the clone via constructor. + """ + + ebuilds = { + "dev-libs/A-1": { }, + } + + playground = ResolverPlayground(ebuilds=ebuilds) + try: + settings = config(clone=playground.settings) + result = playground.run(["=dev-libs/A-1"]) + pkg, existing_node = result.depgraph._select_package( + playground.root, "=dev-libs/A-1") + settings.setcpv(pkg) + + # clone after setcpv tests deepcopy of LazyItemsDict + settings2 = config(clone=settings) + finally: + playground.cleanup() + def testFeaturesMutation(self): """ Test whether mutation of config.features updates the FEATURES diff --git a/pym/portage/util/__init__.py b/pym/portage/util/__init__.py index 0b0e0435e..d766690b3 100644 --- a/pym/portage/util/__init__.py +++ b/pym/portage/util/__init__.py @@ -1314,15 +1314,12 @@ class LazyItemsDict(UserDict): k_copy = deepcopy(k, memo) if k in self.lazy_items: lazy_item = self.lazy_items[k] - try: - result.lazy_items[k_copy] = deepcopy(lazy_item, memo) - except TypeError: - if not lazy_item.singleton: - raise - UserDict.__setitem__(result, - k_copy, deepcopy(self[k], memo)) - else: - UserDict.__setitem__(result, k_copy, None) + if not lazy_item.singleton: + raise TypeError("LazyItemsDict deepcopy is " + \ + "unsafe with lazy items that " + \ + "are not singletons: %s" % (lazy_item,)) + UserDict.__setitem__(result, + k_copy, deepcopy(self[k], memo)) else: UserDict.__setitem__(result, k_copy, deepcopy(self[k], memo)) return result |