changeset 22245:234e4c24b980

platform: implement readpipe() Reading all available data from a pipe has a platform-dependent implementation. This patch establishes platform.readpipe() by copying the inline implementation in sshpeer.readerr(). The implementations for POSIX and Windows are currently identical. The POSIX implementation will be changed in a subsequent patch.
author Gregory Szorc <gregory.szorc@gmail.com>
date Fri, 15 Aug 2014 20:02:18 -0700
parents 172036d60b22
children 331cbf088c4c
files mercurial/posix.py mercurial/sshpeer.py mercurial/util.py mercurial/windows.py
diffstat 4 files changed, 31 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/posix.py	Fri Aug 15 19:18:21 2014 -0700
+++ b/mercurial/posix.py	Fri Aug 15 20:02:18 2014 -0700
@@ -567,3 +567,16 @@
 def statisexec(st):
     '''check whether a stat result is an executable file'''
     return st and (st.st_mode & 0100 != 0)
+
+def readpipe(pipe):
+    """Read all available data from a pipe."""
+    chunks = []
+    while True:
+        size = os.fstat(pipe.fileno()).st_size
+        if not size:
+            break
+
+        s = pipe.read(size)
+        if not s:
+            break
+        chunks.append(s)
--- a/mercurial/sshpeer.py	Fri Aug 15 19:18:21 2014 -0700
+++ b/mercurial/sshpeer.py	Fri Aug 15 20:02:18 2014 -0700
@@ -103,13 +103,8 @@
         return self._caps
 
     def readerr(self):
-        while True:
-            size = util.fstat(self.pipee).st_size
-            if size == 0:
-                break
-            s = self.pipee.read(size)
-            if not s:
-                break
+        s = util.readpipe(self.pipee)
+        if s:
             for l in s.splitlines():
                 self.ui.status(_("remote: "), l, '\n')
 
--- a/mercurial/util.py	Fri Aug 15 19:18:21 2014 -0700
+++ b/mercurial/util.py	Fri Aug 15 20:02:18 2014 -0700
@@ -53,6 +53,7 @@
 popen = platform.popen
 posixfile = platform.posixfile
 quotecommand = platform.quotecommand
+readpipe = platform.readpipe
 rename = platform.rename
 samedevice = platform.samedevice
 samefile = platform.samefile
--- a/mercurial/windows.py	Fri Aug 15 19:18:21 2014 -0700
+++ b/mercurial/windows.py	Fri Aug 15 20:02:18 2014 -0700
@@ -336,3 +336,18 @@
 def statisexec(st):
     '''check whether a stat result is an executable file'''
     return False
+
+def readpipe(pipe):
+    """Read all available data from a pipe."""
+    chunks = []
+    while True:
+        size = os.fstat(pipe.fileno()).st_size
+        if not size:
+            break
+
+        s = pipe.read(size)
+        if not s:
+            break
+        chunks.append(s)
+
+    return ''.join(chunks)