From: Fabian Groffen Date: Tue, 5 Jan 2010 19:26:14 +0000 (-0000) Subject: Merged from trunk -r15166:15169 X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=c5d33cc13801726cf5d23e04a01303b2036d3864;p=portage.git Merged from trunk -r15166:15169 | 15167 | Rearrange _selinux ImportError handling so the workaround | | zmedico | for bug #298310 isn't necessary. | | 15168 | Handle AttributeError inside atomic_ofstream.__del__. Thanks | | zmedico | to Cardoe for reporting. | | 15169 | In python-2.x, convert PortageException.value attribute from | | zmedico | unicode to str in order to avoid empty output with string | | | format operator. | svn path=/main/branches/prefix/; revision=15171 --- diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index aa499cba3..a2bb7fb29 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -289,23 +289,19 @@ import shutil as _shutil shutil = _unicode_module_wrapper(_shutil, encoding=_encodings['fs']) # Imports below this point rely on the above unicode wrapper definitions. -_selinux = None -selinux = None -_selinux_merge = None try: import portage._selinux - # Make sure the _selinux attribute is correctly reinitialized after - # reload(portage) is called. See bug #298310. - _selinux = sys.modules['portage._selinux'] selinux = _unicode_module_wrapper(_selinux, encoding=_encodings['fs']) _selinux_merge = _unicode_module_wrapper(_selinux, encoding=_encodings['merge']) -except OSError as e: - sys.stderr.write("!!! SELinux not loaded: %s\n" % str(e)) +except (ImportError, OSError) as e: + if isinstance(e, OSError): + sys.stderr.write("!!! SELinux not loaded: %s\n" % str(e)) del e -except ImportError: - pass + _selinux = None + selinux = None + _selinux_merge = None from portage.manifest import Manifest diff --git a/pym/portage/exception.py b/pym/portage/exception.py index 85efc2767..900dab7df 100644 --- a/pym/portage/exception.py +++ b/pym/portage/exception.py @@ -3,6 +3,7 @@ # $Id$ import sys +from portage import _unicode_encode from portage.localization import _ if sys.hexversion >= 0x3000000: @@ -12,6 +13,10 @@ class PortageException(Exception): """General superclass for portage exceptions""" def __init__(self,value): self.value = value[:] + if sys.hexversion < 0x3000000 and isinstance(self.value, unicode): + # Workaround for string formatting operator and unicode value + # attribute triggering empty output in formatted string. + self.value = _unicode_encode(self.value) def __str__(self): if isinstance(self.value, basestring): return self.value diff --git a/pym/portage/util.py b/pym/portage/util.py index a507edbc8..e8a33f3ca 100644 --- a/pym/portage/util.py +++ b/pym/portage/util.py @@ -1010,9 +1010,13 @@ class atomic_ofstream(ObjectProxy): def __del__(self): """If the user does not explicitely call close(), it is assumed that an error has occurred, so we abort().""" - f = object.__getattribute__(self, '_file') - if not f.closed: - self.abort() + try: + f = object.__getattribute__(self, '_file') + except AttributeError: + pass + else: + if not f.closed: + self.abort() # ensure destructor from the base class is called base_destructor = getattr(ObjectProxy, '__del__', None) if base_destructor is not None: