changeset 23030:a0e0aa12b672

util.system: avoid buffering of subprocess output when it is piped util.system() copies subprocess' output through pipe if output file is not stdout. Because a file iterator has internal buffering, output won't be flushed until enough data is available. Therefore, it could easily miss important messages such as "waiting for lock".
author Yuya Nishihara <yuya@tcha.org>
date Sat, 30 Aug 2014 17:38:14 +0200
parents 149fc8a44184
children 3c0983cc279e
files mercurial/util.py
diffstat 1 files changed, 4 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/util.py	Fri Oct 17 09:57:05 2014 +0900
+++ b/mercurial/util.py	Sat Aug 30 17:38:14 2014 +0200
@@ -649,7 +649,10 @@
             proc = subprocess.Popen(cmd, shell=True, close_fds=closefds,
                                     env=env, cwd=cwd, stdout=subprocess.PIPE,
                                     stderr=subprocess.STDOUT)
-            for line in proc.stdout:
+            while True:
+                line = proc.stdout.readline()
+                if not line:
+                    break
                 out.write(line)
             proc.wait()
             rc = proc.returncode