[prev in list] [next in list] [prev in thread] [next in thread] 

List:       subversion-commits
Subject:    svn commit: r1870561 - /subversion/trunk/tools/server-side/svn-backup-dumps.py
From:       futatuki () apache ! org
Date:       2019-11-28 17:16:38
Message-ID: 20191128171638.F17DF17A02B () svn01-us-east ! apache ! org
[Download RAW message or body]

Author: futatuki
Date: Thu Nov 28 17:16:38 2019
New Revision: 1870561

URL: http://svn.apache.org/viewvc?rev=1870561&view=rev
Log:
Follow up to r1870204,r1870217,r1870266: Reduce work to communicate to child 

* tools/server-side/svn-backup-dumps.py (SvnBackup.exec_cmd_unix):
  - Use Popen.communicate if output is None.
  - Pass stdout of the parent to the child process as stderr directly if
   printerr is True, to avoid extra encode/decode on py3 and buffering. 

Suggested by: Jun Omae <jun66j5_{AT}_gmail.com>

Modified:
    subversion/trunk/tools/server-side/svn-backup-dumps.py

Modified: subversion/trunk/tools/server-side/svn-backup-dumps.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/server-side/svn-backup-dumps.py?rev=1870561&r1=1870560&r2=1870561&view=diff
 ==============================================================================
--- subversion/trunk/tools/server-side/svn-backup-dumps.py (original)
+++ subversion/trunk/tools/server-side/svn-backup-dumps.py Thu Nov 28 17:16:38 2019
@@ -377,39 +377,51 @@ class SvnBackup:
             return self.exec_cmd_unix(cmd, output, printerr)
 
     def exec_cmd_unix(self, cmd, output=None, printerr=False):
+        if printerr:
+            if sys.hexversion >= 0x3000000:
+                sys.stdout.flush()
+                errout = sys.stdout.buffer
+            else:
+                errout = sys.stdout
+        else:
+            errout = PIPE
         try:
-            proc = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=False)
+            proc = Popen(cmd, stdout=PIPE, stderr=errout, shell=False)
         except:
             return (256, "", "Popen failed (%s ...):\n  %s" % (cmd[0],
                     str(sys.exc_info()[1])))
-        stdout = proc.stdout
-        stderr = proc.stderr
-        self.set_nonblock(stdout)
-        self.set_nonblock(stderr)
-        readfds = [ stdout, stderr ]
-        selres = select.select(readfds, [], [])
-        bufout = b""
-        buferr = b""
-        while len(selres[0]) > 0:
-            for fd in selres[0]:
-                buf = fd.read(16384)
-                if len(buf) == 0:
-                    readfds.remove(fd)
-                elif fd == stdout:
-                    if output:
-                        output.write(buf)
-                    else:
-                        bufout += buf
-                else:
-                    if printerr:
-                        sys.stdout.write(buf.decode(sys.stdout.encoding,
-                                                    'backslashreplace'))
+        if output is None:
+            bufout, buferr = proc.communicate()
+            rc = proc.returncode
+            if buferr is None:
+                buferr = b""
+        else:
+            stdout = proc.stdout
+            self.set_nonblock(stdout)
+            readfds = [ stdout ]
+            if not printerr:
+                stderr = proc.stderr
+                self.set_nonblock(stderr)
+                readfds.append(stderr)
+            selres = select.select(readfds, [], [])
+            bufout = b""
+            buferr = b""
+            while len(selres[0]) > 0:
+                for fd in selres[0]:
+                    buf = fd.read(16384)
+                    if len(buf) == 0:
+                        readfds.remove(fd)
+                    elif fd == stdout:
+                        if output:
+                            output.write(buf)
+                        else:
+                            bufout += buf
                     else:
                         buferr += buf
-            if len(readfds) == 0:
-                break
-            selres = select.select(readfds, [], [])
-        rc = proc.wait()
+                if len(readfds) == 0:
+                    break
+                selres = select.select(readfds, [], [])
+            rc = proc.wait()
         if printerr:
             print("")
         return (rc, bufout, buferr)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic