hook: flush stdout before redirecting to stderr stable
authorThomas De Schampheleire <thomas.de.schampheleire@gmail.com>
Wed, 16 Nov 2011 08:34:36 +0100
branchstable
changeset 15512 8b011ededfb2
parent 15511 6cae68a361ed
child 15513 646759147717
child 15531 0810ccc51f0a
child 15535 17d0c0331468
hook: flush stdout before redirecting to stderr When hook output redirection is enabled (e.g. when cloning over ssh), hook output on stdout is redirected to stderr, to prevent the repository data on stdout from being corrupted. In certain cases, the redirection could cause part of the repository data to end up on stderr as well. In case of a clone, this causes: "abort: consistency error in delta!" This was seen with a clone over ssh, an outgoing hook present (any non-python type, e.g. 'pwd'), on certain repositories only, probably depending on the distribution of the sent data) This patch updates the hook redirection code to flush stdout before redirecting, removing the problem.
mercurial/hook.py
--- a/mercurial/hook.py	Wed Nov 16 12:53:10 2011 +0100
+++ b/mercurial/hook.py	Wed Nov 16 08:34:36 2011 +0100
@@ -139,6 +139,7 @@
             stderrno = sys.__stderr__.fileno()
             # temporarily redirect stdout to stderr, if possible
             if stdoutno >= 0 and stderrno >= 0:
+                sys.__stdout__.flush()
                 oldstdout = os.dup(stdoutno)
                 os.dup2(stderrno, stdoutno)
         except AttributeError: