Fix LazyItemsDict.__deepcopy__() for python 2.7.
authorZac Medico <zmedico@gentoo.org>
Fri, 29 Oct 2010 23:29:37 +0000 (16:29 -0700)
committerZac Medico <zmedico@gentoo.org>
Fri, 29 Oct 2010 23:29:37 +0000 (16:29 -0700)
In python-2.7, changes in deepcopy() make LazyItemsDict.__deepcopy__()
fail in some cases. Thanks to Diego E. Pettenò <flameeyes@g.o> for
reporting.

pym/portage/tests/ebuild/test_config.py
pym/portage/util/__init__.py

index 5af8da5fbd2e7196af84d6920dac9f3eab15a348..764031707cf8aec245c19bc89833e7ee63ce53d9 100644 (file)
@@ -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
index 0c2dc3382a7b7c1efa3e7f2de5be2e7a64e591a3..a0f578eb4a8bd23c795c3bfc3bef52ea8634a561 100644 (file)
@@ -1341,15 +1341,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