summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorholger krekel <holger@merlinux.eu>2013-10-14 12:04:28 +0200
committerholger krekel <holger@merlinux.eu>2013-10-14 12:04:28 +0200
commitf914825d783da586e20ad77e1b7347b97a4510ea (patch)
treee167c5d12d9c07bc45ea9b7251e0e2c674eef9da
parent7328cbbd408cd94c704ba6a932051ecce5751ba3 (diff)
downloadtox-f914825d783da586e20ad77e1b7347b97a4510ea.tar.gz
fix parsing/escaping bugs on windows32
-rwxr-xr-xCHANGELOG2
-rw-r--r--tests/test_config.py22
-rw-r--r--tox/_config.py21
3 files changed, 43 insertions, 2 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 8e4b71c..6661295 100755
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,8 @@
- fix issue128: enable full substitution in install_command,
thanks for the PR to Ronald Evers
+- fix windows parsing/escaping
+
1.6.1
-----
diff --git a/tests/test_config.py b/tests/test_config.py
index e117ca0..3776788 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -243,6 +243,16 @@ class TestIniParser:
assert x == [["cmd1", "with space", "grr"],
["cmd2", "grr"]]
+ def test_argvlist_windows_escaping(self, tmpdir, newconfig):
+ config = newconfig("""
+ [section]
+ comm = py.test {posargs}
+ """)
+ reader = IniReader(config._cfg)
+ reader.addsubstitutions([r"hello\this"])
+ argv = reader.getargv("section", "comm")
+ assert argv == ["py.test", "hello\\this"]
+
def test_argvlist_multiline(self, tmpdir, newconfig):
config = newconfig("""
[section]
@@ -1077,3 +1087,15 @@ class TestCommandParser:
p = CommandParser(cmd)
parsed = list(p.words())
assert parsed == ['nosetests', ' ', '-v', ' ', '-a', ' ', '!deferred', ' ', '--with-doctest', ' ', '[]']
+
+def test_argv_unquote_single_args():
+ argv = ["hello", '"hello2"', "'hello3'"]
+ newargv = unquote_single_args(argv)
+ assert newargv == ["hello", "hello2", "hello3"]
+
+def test_argv_roundrobin():
+ argv = ["hello", "this\\that"]
+ assert string2argv(argv2string(argv)) == argv
+ argv = ["hello world"]
+ assert string2argv(argv2string(argv)) == argv
+
diff --git a/tox/_config.py b/tox/_config.py
index d692b6f..e707789 100644
--- a/tox/_config.py
+++ b/tox/_config.py
@@ -14,6 +14,7 @@ import py
import tox
+iswin32 = sys.platform == "win32"
defaultenvs = {'jython': 'jython', 'pypy': 'pypy'}
for _name in "py,py24,py25,py26,py27,py30,py31,py32,py33,py34".split(","):
@@ -487,7 +488,7 @@ class IniReader:
command = self.getdefault(
section, name, default=default, replace=replace)
- return shlex.split(command.strip())
+ return string2argv(command.strip())
def getbool(self, section, name, default=None):
s = self.getdefault(section, name, default)
@@ -533,7 +534,7 @@ class IniReader:
posargs = self._subs.get('_posargs', None)
if posargs:
- return " ".join(posargs)
+ return argv2string(posargs)
value = value_func()
if value:
@@ -704,3 +705,19 @@ def getcontextname():
if 'HUDSON_URL' in os.environ:
return 'jenkins'
return None
+
+
+def unquote_single_args(argv):
+ newargv = []
+ for arg in argv:
+ if len(arg) >=2 and arg[0] == arg[-1]:
+ if arg[0] in ("'", '"'):
+ arg = arg[1:-1]
+ newargv.append(arg)
+ return newargv
+
+def string2argv(cmd):
+ return unquote_single_args(shlex.split(cmd, posix=False))
+
+def argv2string(argv):
+ return subprocess.list2cmdline(argv)