[PATCH] py3: teach run-tests.py to handle exe with spaces when --local isn't specified

Matt Harbison mharbison72 at gmail.com
Thu Dec 13 05:24:41 UTC 2018


# HG changeset patch
# User Matt Harbison <matt_harbison at yahoo.com>
# Date 1544678327 18000
#      Thu Dec 13 00:18:47 2018 -0500
# Node ID bf9c96ebceeab2cbad25b2aac07c43eb48fbc664
# Parent  008f3491dc5377e9e6f210e0a3f161323049db5d
py3: teach run-tests.py to handle exe with spaces when --local isn't specified

This was the reason that no amount of quoting worked in test-hghave.t.

`os.popen()` needed to be swapped out because while the added quoting around
line 3124 worked on py3, it failed on py2.  See 38d51371792b.  The problem with
`os.system()` was wrongly splitting the command on the space in 'Program Files',
regardless of quoting.  It looks like there are a few other instances of
`os.system()` in core code, so presumably those should be replaced?

diff --git a/tests/run-tests.py b/tests/run-tests.py
--- a/tests/run-tests.py
+++ b/tests/run-tests.py
@@ -3019,7 +3019,7 @@ class TestRunner(object):
             # least on Windows for now, deal with .pydistutils.cfg bugs
             # when they happen.
             nohome = b''
-        cmd = (b'%(exe)s setup.py %(pure)s clean --all'
+        cmd = (b'"%(exe)s" setup.py %(pure)s clean --all'
                b' build %(compiler)s --build-base="%(base)s"'
                b' install --force --prefix="%(prefix)s"'
                b' --install-lib="%(libdir)s"'
@@ -3042,7 +3042,7 @@ class TestRunner(object):
         makedirs(self._bindir)
 
         vlog("# Running", cmd)
-        if os.system(_strpath(cmd)) == 0:
+        if subprocess.call(_strpath(cmd), shell=True) == 0:
             if not self.options.verbose:
                 try:
                     os.remove(installerrs)
@@ -3121,15 +3121,15 @@ class TestRunner(object):
         if self._hgpath is not None:
             return self._hgpath
 
-        cmd = b'%s -c "import mercurial; print (mercurial.__path__[0])"'
+        cmd = b'"%s" -c "import mercurial; print (mercurial.__path__[0])"'
         cmd = cmd % PYTHON
         if PYTHON3:
             cmd = _strpath(cmd)
-        pipe = os.popen(cmd)
-        try:
-            self._hgpath = _bytespath(pipe.read().strip())
-        finally:
-            pipe.close()
+
+        p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+        out, err = p.communicate()
+
+        self._hgpath = out.strip()
 
         return self._hgpath
 


More information about the Mercurial-devel mailing list