From 6f186a2bad13cce8298d49c14490bd1648a35adb 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 --- 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 aaff47962d85c..a34946f929447 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.39.5