From 607513a3b19d51af6cf850726f2ec5522c0e4808 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Tue, 29 Sep 2009 20:29:30 +0000 Subject: [PATCH] Merged from trunk -r14455:14463 | 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 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 for reporting, and Marat | | | Radchenko 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 | 3 +- pym/_emerge/Package.py | 79 +++++++++++++++++++++--------------- pym/portage/__init__.py | 5 ++- pym/portage/dbapi/bintree.py | 30 ++++++++++---- pym/portage/mail.py | 6 +-- pym/portage/xpak.py | 3 +- 6 files changed, 79 insertions(+), 47 deletions(-) diff --git a/pym/_emerge/Binpkg.py b/pym/_emerge/Binpkg.py index e9e556526..6da292cae 100644 --- a/pym/_emerge/Binpkg.py +++ b/pym/_emerge/Binpkg.py @@ -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) diff --git a/pym/_emerge/Package.py b/pym/_emerge/Package.py index a7a8bfba8..472b1d375 100644 --- a/pym/_emerge/Package.py +++ b/pym/_emerge/Package.py @@ -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() diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 7983d2f6f..f57c1c85e 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -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") diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py index fc0dd730a..1f317f563 100644 --- a/pym/portage/dbapi/bintree.py +++ b/pym/portage/dbapi/bintree.py @@ -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 diff --git a/pym/portage/mail.py b/pym/portage/mail.py index 85192d097..040cd1136 100644 --- a/pym/portage/mail.py +++ b/pym/portage/mail.py @@ -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 diff --git a/pym/portage/xpak.py b/pym/portage/xpak.py index b753f2490..262f14c85 100644 --- a/pym/portage/xpak.py +++ b/pym/portage/xpak.py @@ -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 = {} -- 2.26.2