profiling: flush stdout before writing profile to stderr
authorKyle Lippincott <spectral@google.com>
Mon, 27 Jan 2020 18:16:05 -0800
changeset 44192 d6d4170882cd
parent 44191 732098027b34
child 44193 3c265cef6edc
profiling: flush stdout before writing profile to stderr On py3, stdout and stderr appear to be buffered and this causes my command's output to be intermixed with the profiling output. Differential Revision: https://phab.mercurial-scm.org/D8024
mercurial/profiling.py
--- a/mercurial/profiling.py	Tue Jan 28 10:40:19 2020 -0800
+++ b/mercurial/profiling.py	Mon Jan 27 18:16:05 2020 -0800
@@ -186,6 +186,7 @@
         self._output = None
         self._fp = None
         self._fpdoclose = True
+        self._flushfp = None
         self._profiler = None
         self._enabled = enabled
         self._entered = False
@@ -246,6 +247,8 @@
             else:
                 self._fpdoclose = False
                 self._fp = self._ui.ferr
+                # Ensure we've flushed fout before writing to ferr.
+                self._flushfp = self._ui.fout
 
             if proffn is not None:
                 pass
@@ -265,6 +268,7 @@
     def __exit__(self, exception_type, exception_value, traceback):
         propagate = None
         if self._profiler is not None:
+            self._uiflush()
             propagate = self._profiler.__exit__(
                 exception_type, exception_value, traceback
             )
@@ -280,3 +284,7 @@
     def _closefp(self):
         if self._fpdoclose and self._fp is not None:
             self._fp.close()
+
+    def _uiflush(self):
+        if self._flushfp:
+            self._flushfp.flush()