From d1615c0da2fd785c34719175888170164105ef63 Mon Sep 17 00:00:00 2001 From: Alfredo Deza Date: Mon, 9 Sep 2019 13:45:08 -0400 Subject: [PATCH] ceph-volume terminal remove unicode stream handler This caused problems in environments where stderr was redirected, since stderr sets the encoding to None. Getting it back again allows everything to work correctly, and keeps all the current unit tests passing Signed-off-by: Alfredo Deza (cherry picked from commit fe66e01f6a4b19bb15695537713a629a951b28ce) --- src/ceph-volume/ceph_volume/terminal.py | 43 +++++++++---------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/src/ceph-volume/ceph_volume/terminal.py b/src/ceph-volume/ceph_volume/terminal.py index aaff47962d85..a34946f92944 100644 --- a/src/ceph-volume/ceph_volume/terminal.py +++ b/src/ceph-volume/ceph_volume/terminal.py @@ -1,8 +1,10 @@ -import codecs import logging import sys +terminal_logger = logging.getLogger('terminal') + + class colorize(str): """ Pretty simple to use:: @@ -80,34 +82,13 @@ yellow_arrow = yellow('--> ') class _Write(object): def __init__(self, _writer=None, prefix='', suffix='', flush=False): - # we can't set sys.stderr as the default for _writer. Otherwise + # we can't set sys.stderr as the default for _writer. otherwise # pytest's capturing gets confused - if not _writer: - _writer = sys.stderr - self._writer = _Write._unicode_output_stream(_writer) - sys.stderr = self._writer + self._writer = _writer or sys.stderr self.suffix = suffix self.prefix = prefix self.flush = flush - @staticmethod - def _unicode_output_stream(stream): - # wrapper for given stream, so it can write unicode without throwing - # exception - # sys.stderr.encoding is None if !isatty - encoding = stream.encoding or '' - if encoding.upper() in ('UTF-8', 'UTF8'): - # already using unicode encoding, nothing to do - return stream - encoding = encoding or 'UTF-8' - if sys.version_info >= (3, 0): - # try to use whatever writer class the stream was - return stream.__class__(stream.buffer, encoding, 'replace', - stream.newlines, stream.line_buffering) - else: - # in python2, stderr is but a "file" - return codecs.getwriter(encoding)(stream, 'replace') - def bold(self, string): self.write(bold(string)) @@ -117,9 +98,17 @@ class _Write(object): self.write(string) def write(self, line): - self._writer.write(self.prefix + line + self.suffix) - if self.flush: - self._writer.flush() + entry = self.prefix + line + self.suffix + + try: + self._writer.write(entry) + if self.flush: + self._writer.flush() + except (UnicodeDecodeError, UnicodeEncodeError): + try: + terminal_logger.info(entry.strip('\n')) + except (AttributeError, TypeError): + terminal_logger.info(entry) def stdout(msg): -- 2.47.3