diff mercurial/hook.py @ 15512:8b011ededfb2 stable

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.
author Thomas De Schampheleire <thomas.de.schampheleire@gmail.com>
date Wed, 16 Nov 2011 08:34:36 +0100
parents f6a737357195
children 30c34fde40cc
line wrap: on
line diff
--- 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: