public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] portage r12684 - main/trunk/pym/portage
@ 2009-02-22  9:56 Zac Medico (zmedico)
  0 siblings, 0 replies; only message in thread
From: Zac Medico (zmedico) @ 2009-02-22  9:56 UTC (permalink / raw
  To: gentoo-commits

Author: zmedico
Date: 2009-02-22 09:56:27 +0000 (Sun, 22 Feb 2009)
New Revision: 12684

Modified:
   main/trunk/pym/portage/__init__.py
Log:
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.


Modified: main/trunk/pym/portage/__init__.py
===================================================================
--- main/trunk/pym/portage/__init__.py	2009-02-22 06:00:34 UTC (rev 12683)
+++ main/trunk/pym/portage/__init__.py	2009-02-22 09:56:27 UTC (rev 12684)
@@ -7464,6 +7464,62 @@
 
 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 @@
 		"flushmtimedb"):
 		globals()[k] = _LegacyGlobalProxy(k)
 
+	_ensure_default_encoding()
+
 # Clear the cache
 dircache={}
 




^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-02-22  9:56 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-22  9:56 [gentoo-commits] portage r12684 - main/trunk/pym/portage Zac Medico (zmedico)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox