hook: ensure stderr is flushed when an exception is raised, for test stability
authorMatt Harbison <matt_harbison@yahoo.com>
Sat, 10 Mar 2018 22:02:58 -0500
changeset 36849 9c636ec1ef37
parent 36848 ef68493d652b
child 36850 ff541b8cdee0
hook: ensure stderr is flushed when an exception is raised, for test stability Windows has had issues with output order in test-ssh-proto-unbundle.t[1] since it was created a few weeks ago. Each of the problems occurred when an exception was thrown out of the hook. Now the only thing blocking D2720 is the fact that the "abort: ..." lines on stderr are totally AWOL. I have no idea where there are. [1] https://buildbot.mercurial-scm.org/builders/Win7%20x86_64%20hg%20tests/builds/541/steps/run-tests.py%20%28python%202.7.13%29/logs/stdio
mercurial/hook.py
--- a/mercurial/hook.py	Sat Mar 10 10:27:56 2018 -0800
+++ b/mercurial/hook.py	Sat Mar 10 22:02:58 2018 -0500
@@ -265,12 +265,12 @@
                 raised = False
 
             res[hname] = r, raised
+    finally:
+        # The stderr is fully buffered on Windows when connected to a pipe.
+        # A forcible flush is required to make small stderr data in the
+        # remote side available to the client immediately.
+        util.stderr.flush()
 
-            # The stderr is fully buffered on Windows when connected to a pipe.
-            # A forcible flush is required to make small stderr data in the
-            # remote side available to the client immediately.
-            util.stderr.flush()
-    finally:
         if _redirect and oldstdout >= 0:
             util.stdout.flush()  # write hook output to stderr fd
             os.dup2(oldstdout, stdoutno)