From patchwork Tue Jun 2 18:07:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [stable] py3: always flush ui streams on Python 3 From: Manuel Jacob X-Patchwork-Id: 46458 Message-Id: To: mercurial-devel@mercurial-scm.org Date: Tue, 02 Jun 2020 20:07:33 +0200 # HG changeset patch # User Manuel Jacob # Date 1591120869 -7200 # Tue Jun 02 20:01:09 2020 +0200 # Branch stable # Node ID ebbc45544673c33ea3beb887ed4d5230b015102a # Parent 91e509a12dbc4cd6cf2dcb9dae3ed383932132ac py3: always flush ui streams on Python 3 On Python 2, we rely on that stdout and stderr are line buffered. Python 3’s io module doesn’t offer line buffered binary streams. diff --git a/mercurial/ui.py b/mercurial/ui.py --- a/mercurial/ui.py +++ b/mercurial/ui.py @@ -1198,9 +1198,14 @@ class ui(object): label = opts.get('label', b'') msg = self.label(msg, label) dest.write(msg) + # On Python 2, stdout and stderr are usually line buffered, but # stderr may be buffered under win32 when redirected to files, # including stdout. - if dest is self._ferr and not getattr(self._ferr, 'closed', False): + # On Python 3, we use the underlying binary buffer, which does not + # support line buffering. + if (pycompat.ispy3 or dest is self._ferr) and not getattr( + self._ferr, 'closed', False + ): dest.flush() except IOError as err: if dest is self._ferr and err.errno in (