diff --git a/docs/changelog/1982.bugfix.rst b/docs/changelog/1982.bugfix.rst index c0843f8b7..09f05b8d3 100644 --- a/docs/changelog/1982.bugfix.rst +++ b/docs/changelog/1982.bugfix.rst @@ -1 +1 @@ -Bump embeded setuptools from ``50.3.0`` to ``50.3.1`` - by :user:`gaborbernat`. +Bump embedded setuptools from ``50.3.0`` to ``50.3.1`` - by :user:`gaborbernat`. diff --git a/docs/changelog/1983.bugfix.rst b/docs/changelog/1983.bugfix.rst new file mode 100644 index 000000000..32a973f9b --- /dev/null +++ b/docs/changelog/1983.bugfix.rst @@ -0,0 +1 @@ +After importing virtualenv passing cwd to a subprocess calls breaks with ``invalid directory`` - by :user:`gaborbernat`. diff --git a/src/virtualenv/util/subprocess/_win_subprocess.py b/src/virtualenv/util/subprocess/_win_subprocess.py index 33c77e312..ba33d204e 100644 --- a/src/virtualenv/util/subprocess/_win_subprocess.py +++ b/src/virtualenv/util/subprocess/_win_subprocess.py @@ -107,13 +107,19 @@ def CreateProcess( wenv = (c_wchar * len(env))() wenv.value = env + wcwd = None + if cwd is not None: + cwd = unicode(cwd) + unicode("\0") + wcwd = (c_wchar * len(cwd))() + wcwd.value = cwd + pi = PROCESS_INFORMATION() creation_flags |= CREATE_UNICODE_ENVIRONMENT if CreateProcessW( executable, args, None, None, inherit_handles, creation_flags, - wenv, cwd, byref(si), byref(pi), + wenv, wcwd, byref(si), byref(pi), ): return ( DUMMY_HANDLE(pi.hProcess), DUMMY_HANDLE(pi.hThread), diff --git a/tests/unit/test_util.py b/tests/unit/test_util.py index 351d52862..79b3860c1 100644 --- a/tests/unit/test_util.py +++ b/tests/unit/test_util.py @@ -1,5 +1,11 @@ from __future__ import absolute_import, unicode_literals +import subprocess +import sys + +import pytest + +from virtualenv.info import IS_WIN, PY2 from virtualenv.util.subprocess import run_cmd @@ -8,3 +14,8 @@ def test_run_fail(tmp_path): assert err assert not out assert code + + +@pytest.mark.skipif(not (PY2 and IS_WIN), reason="subprocess patch only applied on Windows python2") +def test_windows_py2_cwd_works(tmp_path): + subprocess.check_call([sys.executable, "-c", "print(1)"], cwd=str(tmp_path))