diff options
author | Zac Medico <zmedico@gentoo.org> | 2009-02-22 09:56:27 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2009-02-22 09:56:27 +0000 |
commit | b17b93c125991cd9846ce1bd8925b7190cf13de6 (patch) | |
tree | ecc53748397f34d763801e77d9bb8616dc29d76c | |
parent | 16ff4960ac3b3118a9b96e21dc11a64bb7c36e21 (diff) | |
download | portage-b17b93c125991cd9846ce1bd8925b7190cf13de6.tar.gz portage-b17b93c125991cd9846ce1bd8925b7190cf13de6.tar.bz2 portage-b17b93c125991cd9846ce1bd8925b7190cf13de6.zip |
The python that's inside stage 1 or 2 is built with a minimal
configuration which does not include the /usr/lib/pythonX.Y/encodings
directory. This results in error like the following:
LookupError: no codec search functions registered: can't find encoding
In order to solve this problem, detect it early and manually register
a search function for the ascii codec. Starting with python-3.0 this
problem is more noticeable because of stricter handling of encoding
and decoding between strings of characters and bytes.
svn path=/main/trunk/; revision=12684
-rw-r--r-- | pym/portage/__init__.py | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 56a8c4f21..c5d4342c2 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -7464,6 +7464,62 @@ def portageexit(): atexit_register(portageexit) +def _ensure_default_encoding(): + """ + The python that's inside stage 1 or 2 is built with a minimal + configuration which does not include the /usr/lib/pythonX.Y/encodings + directory. This results in error like the following: + + LookupError: no codec search functions registered: can't find encoding + + In order to solve this problem, detect it early and manually register + a search function for the ascii codec. Starting with python-3.0 this + problem is more noticeable because of stricter handling of encoding + and decoding between strings of characters and bytes. + """ + + import codecs + try: + codecs.lookup(sys.getdefaultencoding()) + except LookupError: + pass + else: + return + + class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.ascii_encode(input, self.errors)[0] + + class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.ascii_decode(input, self.errors)[0] + + class StreamWriter(codecs.StreamWriter): + encode = codecs.ascii_encode + + class StreamReader(codecs.StreamReader): + decode = codecs.ascii_decode + + # The sys.setdefaultencoding() function doesn't necessarily exist, + # so just setup the ascii codec to correspond to whatever name + # happens to be returned by sys.getdefaultencoding(). + encoding = sys.getdefaultencoding() + + def search_function(name): + if name != encoding: + return None + return codecs.CodecInfo( + name=encoding, + encode=codecs.ascii_encode, + decode=codecs.ascii_decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) + + codecs.register(search_function) + def _global_updates(trees, prev_mtimes): """ Perform new global updates if they exist in $PORTDIR/profiles/updates/. @@ -7854,6 +7910,8 @@ if True: "flushmtimedb"): globals()[k] = _LegacyGlobalProxy(k) + _ensure_default_encoding() + # Clear the cache dircache={} |