Add support in ConsoleStyleFile.write() for unicode encoding when writing to
authorZac Medico <zmedico@gentoo.org>
Sun, 20 Sep 2009 22:23:58 +0000 (22:23 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 20 Sep 2009 22:23:58 +0000 (22:23 -0000)
stdout/stderr in python-2.x.

svn path=/main/trunk/; revision=14303

pym/portage/output.py

index c21dc07ba778d0d59840bf43e63af307fc62db44..570de78e98438301d763bcf1916f6a51a50f9499 100644 (file)
@@ -362,14 +362,24 @@ class ConsoleStyleFile(object):
                s = _unicode_decode(s)
                global havecolor
                if havecolor and self._styles:
+                       styled_s = []
                        for style in self._styles:
-                               self._file.write(style_to_ansi_code(style))
-                       self._file.write(s)
-                       self._file.write(codes["reset"])
+                               styled_s.append(style_to_ansi_code(style))
+                       styled_s.append(s)
+                       styled_s.append(codes["reset"])
+                       self._write(self._file, "".join(styled_s))
                else:
-                       self._file.write(s)
+                       self._write(self._file, s)
                if self.write_listener:
-                       self.write_listener.write(s)
+                       self._write(self.write_listener, s)
+
+       def _write(self, f, s):
+               if sys.hexversion < 0x3000000 and \
+                       isinstance(s, unicode) and \
+                       f in (sys.stdout, sys.stderr):
+                       # avoid potential UnicodeEncodeError
+                       s = s.encode(_encodings['stdio'], 'backslashreplace')
+               f.write(s)
 
        def writelines(self, lines):
                for s in lines: