Add special handling for updates of Package.metadata['USE'], so that
authorZac Medico <zmedico@gentoo.org>
Tue, 1 Jun 2010 18:48:54 +0000 (11:48 -0700)
committerZac Medico <zmedico@gentoo.org>
Tue, 1 Jun 2010 18:48:54 +0000 (11:48 -0700)
internal state is consistent.

pym/_emerge/Package.py

index 9df7b644c1f2e46af7955fcd10eee9fdd5973b63..bba55ca8efabe10fe8ece3ac9f8c37cf394792ba 100644 (file)
@@ -292,7 +292,7 @@ class _PackageMetadataWrapper(_PackageMetadataWrapperBase):
 
        __slots__ = ("_pkg",)
        _wrapped_keys = frozenset(
-               ["COUNTER", "INHERITED", "IUSE", "SLOT", "_mtime_"])
+               ["COUNTER", "INHERITED", "IUSE", "SLOT", "USE", "_mtime_"])
        _use_conditional_keys = frozenset(
                ['LICENSE', 'PROPERTIES', 'PROVIDE', 'RESTRICT',])
 
@@ -301,7 +301,7 @@ class _PackageMetadataWrapper(_PackageMetadataWrapperBase):
                self._pkg = pkg
                if not pkg.built:
                        # USE is lazy, but we want it to show up in self.keys().
-                       self['USE'] = ''
+                       _PackageMetadataWrapperBase.__setitem__(self, 'USE', '')
 
                self.update(metadata)
 
@@ -326,7 +326,7 @@ class _PackageMetadataWrapper(_PackageMetadataWrapperBase):
                                        'porttree'].dbapi.doebuild_settings
                                pkgsettings.setcpv(self._pkg)
                                v = pkgsettings["PORTAGE_USE"]
-                               self['USE'] = v
+                               _PackageMetadataWrapperBase.__setitem__(self, 'USE', v)
 
                return v
 
@@ -366,6 +366,18 @@ class _PackageMetadataWrapper(_PackageMetadataWrapperBase):
                                v = 0
                self._pkg.counter = v
 
+       def _set_use(self, k, v):
+               # Force regeneration of _use attribute
+               self._pkg._use = None
+               # Use raw metadata to restore USE conditional values
+               # to unevaluated state
+               raw_metadata = self._pkg._raw_metadata
+               for x in self._use_conditional_keys:
+                       try:
+                               self[x] = raw_metadata[x]
+                       except KeyError:
+                               pass
+
        def _set__mtime_(self, k, v):
                if isinstance(v, basestring):
                        try: