Merged from trunk -r14455:14463
authorFabian Groffen <grobian@gentoo.org>
Tue, 29 Sep 2009 20:29:30 +0000 (20:29 -0000)
committerFabian Groffen <grobian@gentoo.org>
Tue, 29 Sep 2009 20:29:30 +0000 (20:29 -0000)
   | 14458   | Bug #286780 - Fix email.MIME* imports to use email.mime.*    |
   | zmedico | (works with python 2.6 and python 3). Thanks to Hanno        |
   |         | Meyer-Thurow <h.mth@web.de> for this patch.                  |

   | 14459   | Don't call self.scan() in tbz2.__init__ since all methods    |
   | zmedico | call it anyway.                                              |

   | 14460   | Make tbz2.get_data() return an empty dict on failure.        |
   | zmedico |                                                              |

   | 14461   | Handle encoding/decoding of unicode when using the xpak api. |
   | zmedico | Use tbz2.get_data() instead of tbz2.getfile() when reading   |
   |         | multiple values, in order to avoid multiple tbz2.scan() and  |
   |         | searchindex() calls.                                         |

   | 14462   | Add back _PackageMetadataWrapper__setitem__, removed in      |
   | zmedico | r14280, since removing it seems to cause problems. Thanks to |
   |         | Jeremy Olexa <darkside@gentoo.org> for reporting, and Marat  |
   |         | Radchenko <marat@slonopotamus.org> for bisecting to find the |
   |         | revision.                                                    |

   | 14463   | Revert the rest of r14280 since it seems that dict bypasses  |
   | zmedico | __getitem__ and/or __setitem__ too often.                    |

svn path=/main/branches/prefix/; revision=14464

pym/_emerge/Binpkg.py
pym/_emerge/Package.py
pym/portage/__init__.py
pym/portage/dbapi/bintree.py
pym/portage/mail.py
pym/portage/xpak.py

index e9e5565266daadf6e0861996fcb09b5b4059154a..6da292caedcdf4a88172264595607d58a76b0089 100644 (file)
@@ -222,7 +222,8 @@ class Binpkg(CompositeTask):
                check_missing_metadata = ("CATEGORY", "PF")
                missing_metadata = set()
                for k in check_missing_metadata:
-                       v = pkg_xpak.getfile(k)
+                       v = pkg_xpak.getfile(_unicode_encode(k,
+                               encoding=_encodings['repo.content']))
                        if not v:
                                missing_metadata.add(k)
 
index a7a8bfba8a2b4f21b232e1935ab525a18c50c08c..472b1d37501ccc571762d551571b8039a04a1960 100644 (file)
@@ -6,6 +6,7 @@ import re
 import sys
 from itertools import chain
 import portage
+from portage.cache.mappings import slot_dict_class
 from portage.dep import paren_reduce, use_reduce, \
        paren_normalize, paren_enclose
 from _emerge.Task import Task
@@ -157,54 +158,30 @@ _all_metadata_keys = set(x for x in portage.auxdbkeys \
 _all_metadata_keys.update(Package.metadata_keys)
 _all_metadata_keys = frozenset(_all_metadata_keys)
 
-class _PackageMetadataWrapper(dict):
+_PackageMetadataWrapperBase = slot_dict_class(_all_metadata_keys)
+
+class _PackageMetadataWrapper(_PackageMetadataWrapperBase):
        """
        Detect metadata updates and synchronize Package attributes.
        """
 
        __slots__ = ("_pkg",)
+       _wrapped_keys = frozenset(
+               ["COUNTER", "INHERITED", "IUSE", "SLOT", "_mtime_"])
        _use_conditional_keys = frozenset(
                ['LICENSE', 'PROPERTIES', 'PROVIDE', 'RESTRICT',])
 
        def __init__(self, pkg, metadata):
+               _PackageMetadataWrapperBase.__init__(self)
                self._pkg = pkg
                if not pkg.built:
                        # USE is lazy, but we want it to show up in self.keys().
                        self['USE'] = ''
+
                self.update(metadata)
-               for k, v in self.items():
-                       if k == 'INHERITED':
-                               if isinstance(v, basestring):
-                                       v = frozenset(v.split())
-                               self._pkg.inherited = v
-                       elif k == 'SLOT':
-                               self._pkg.slot = v
-                       elif k == 'IUSE':
-                               self._pkg.iuse = self._pkg._iuse(
-                                       v.split(), self._pkg.root_config.iuse_implicit)
-                       elif k == 'COUNTER':
-                               if isinstance(v, basestring):
-                                       try:
-                                               v = long(v.strip())
-                                       except ValueError:
-                                               v = 0
-                                               self['COUNTER'] = str(v)
-                               self._pkg.counter = v
-                       elif k == '_mtime_':
-                               if isinstance(v, basestring):
-                                       try:
-                                               v = long(v.strip())
-                                       except ValueError:
-                                               v = 0
-                               self._pkg.mtime = v
-                       elif k in self._use_conditional_keys:
-                               try:
-                                       use_reduce(paren_reduce(v), matchall=1)
-                               except portage.exception.InvalidDependString as e:
-                                       self._pkg._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
 
        def __getitem__(self, k):
-               v = dict.__getitem__(self, k)
+               v = _PackageMetadataWrapperBase.__getitem__(self, k)
                if k in self._use_conditional_keys:
                        if self._pkg.root_config.settings.local_config and '?' in v:
                                try:
@@ -228,6 +205,44 @@ class _PackageMetadataWrapper(dict):
 
                return v
 
+       def __setitem__(self, k, v):
+               _PackageMetadataWrapperBase.__setitem__(self, k, v)
+               if k in self._wrapped_keys:
+                       getattr(self, "_set_" + k.lower())(k, v)
+               elif k in self._use_conditional_keys:
+                       try:
+                               use_reduce(paren_reduce(v), matchall=1)
+                       except portage.exception.InvalidDependString, e:
+                               self._pkg._invalid_metadata(k + ".syntax", "%s: %s" % (k, e))
+
+       def _set_inherited(self, k, v):
+               if isinstance(v, basestring):
+                       v = frozenset(v.split())
+               self._pkg.inherited = v
+
+       def _set_iuse(self, k, v):
+               self._pkg.iuse = self._pkg._iuse(
+                       v.split(), self._pkg.root_config.iuse_implicit)
+
+       def _set_slot(self, k, v):
+               self._pkg.slot = v
+
+       def _set_counter(self, k, v):
+               if isinstance(v, basestring):
+                       try:
+                               v = long(v.strip())
+                       except ValueError:
+                               v = 0
+               self._pkg.counter = v
+
+       def _set__mtime_(self, k, v):
+               if isinstance(v, basestring):
+                       try:
+                               v = long(v.strip())
+                       except ValueError:
+                               v = 0
+               self._pkg.mtime = v
+
        @property
        def properties(self):
                return self['PROPERTIES'].split()
index 7983d2f6f20d4667f2adaa70aff0a4261f684206..f57c1c85e6757f88e4255f7ce7feea0512eb60db 100644 (file)
@@ -8602,11 +8602,14 @@ def pkgmerge(mytbz2, myroot, mysettings, mydbapi=None,
 
                mypkg = os.path.basename(mytbz2)[:-5]
                xptbz2 = portage.xpak.tbz2(mytbz2)
-               mycat = xptbz2.getfile("CATEGORY")
+               mycat = xptbz2.getfile(_unicode_encode("CATEGORY",
+                       encoding=_encodings['repo.content']))
                if not mycat:
                        writemsg(_("!!! CATEGORY info missing from info chunk, aborting...\n"),
                                noiselevel=-1)
                        return 1
+               mycat = _unicode_decode(mycat,
+                       encoding=_encodings['repo.content'], errors='replace')
                mycat = mycat.strip()
 
                buildprefix = xptbz2.getfile("EPREFIX")
index fc0dd730ab2e97238cabb60fcc4e046148367cb9..1f317f563011f8f224aa279ac210607bd331b9ac 100644 (file)
@@ -80,9 +80,11 @@ class bindbapi(fakedbapi):
                        tbz2_path = self.bintree.getname(mycpv)
                        if not os.path.exists(tbz2_path):
                                raise KeyError(mycpv)
-                       tbz2 = portage.xpak.tbz2(tbz2_path)
+                       metadata_bytes = portage.xpak.tbz2(tbz2_path).get_data()
                        def getitem(k):
-                               v = tbz2.getfile(k)
+                               v = metadata_bytes.get(_unicode_encode(k,
+                                       encoding=_encodings['repo.content'],
+                                       errors='backslashreplace'))
                                if v is not None:
                                        v = _unicode_decode(v,
                                                encoding=_encodings['repo.content'], errors='replace')
@@ -380,8 +382,12 @@ class binarytree(object):
 
                if st is not None:
                        # For invalid packages, other_cat could be None.
-                       other_cat = portage.xpak.tbz2(dest_path).getfile("CATEGORY")
+                       other_cat = portage.xpak.tbz2(dest_path).getfile(
+                               _unicode_encode("CATEGORY",
+                               encoding=_encodings['repo.content']))
                        if other_cat:
+                               other_cat = _unicode_decode(other_cat,
+                                       encoding=_encodings['repo.content'], errors='replace')
                                other_cat = other_cat.strip()
                                other_cpv = other_cat + "/" + mypkg
                                self._move_from_all(other_cpv)
@@ -549,11 +555,19 @@ class binarytree(object):
                                                        noiselevel=-1)
                                                self.invalids.append(myfile[:-5])
                                                continue
-                                       mytbz2 = portage.xpak.tbz2(full_path)
-                                       # For invalid packages, mycat could be None.
-                                       mycat = mytbz2.getfile("CATEGORY")
-                                       mypf = mytbz2.getfile("PF")
-                                       slot = mytbz2.getfile("SLOT")
+                                       metadata_bytes = portage.xpak.tbz2(full_path).get_data()
+                                       mycat = _unicode_decode(metadata_bytes.get(
+                                               _unicode_encode("CATEGORY",
+                                               encoding=_encodings['repo.content']), ""),
+                                               encoding=_encodings['repo.content'], errors='replace')
+                                       mypf = _unicode_decode(metadata_bytes.get(
+                                               _unicode_encode("PF",
+                                               encoding=_encodings['repo.content']), ""),
+                                               encoding=_encodings['repo.content'], errors='replace')
+                                       slot = _unicode_decode(metadata_bytes.get(
+                                               _unicode_encode("SLOT",
+                                               encoding=_encodings['repo.content']), ""),
+                                               encoding=_encodings['repo.content'], errors='replace')
                                        mypkg = myfile[:-5]
                                        if not mycat or not mypf or not slot:
                                                #old-style or corrupt package
index 85192d0978573c2126e1f442101c5a2f5757876f..040cd1136955c09384c6bafbe165bc4a175417f2 100644 (file)
@@ -3,9 +3,9 @@
 # Distributed under the terms of the GNU General Public License v2
 # $Id$
 
-from email.MIMEText import MIMEText as TextMessage
-from email.MIMEMultipart import MIMEMultipart as MultipartMessage
-from email.MIMEBase import MIMEBase as BaseMessage
+from email.mime.text import MIMEText as TextMessage
+from email.mime.multipart import MIMEMultipart as MultipartMessage
+from email.mime.base import MIMEBase as BaseMessage
 from email.header import Header
 import smtplib
 import socket
index b753f2490c0e54b3951a699f3390d49cfbb80a50..262f14c854a0f17e4eacb43cb3cc15282b4db183 100644 (file)
@@ -272,7 +272,6 @@ class tbz2(object):
                self.datasize=None
                self.indexpos=None
                self.datapos=None
-               self.scan()
 
        def decompose(self,datadir,cleanup=1):
                """Alias for unpackinfo() --- Complement to recompose() but optionally
@@ -437,7 +436,7 @@ class tbz2(object):
        def get_data(self):
                """Returns all the files from the dataSegment as a map object."""
                if not self.scan():
-                       return 0
+                       return {}
                a = open(_unicode_encode(self.file,
                        encoding=_encodings['fs'], errors='strict'), 'rb')
                mydata = {}