diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 97f847f01..f86ac4c6c 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -4,6 +4,7 @@ Alexander Schepanovski Alexandre Conrad Allan Feldman Andrii Soldatenko +Andrzej Klajnert Anthon van der Neuth Anthony Sottile Anudit Nagar diff --git a/docs/changelog/1423.bugfix.rst b/docs/changelog/1423.bugfix.rst new file mode 100644 index 000000000..155591e5a --- /dev/null +++ b/docs/changelog/1423.bugfix.rst @@ -0,0 +1 @@ +Respect attempts to change `PATH` via `setenv`. - by :user:`aklajnert` diff --git a/src/tox/venv.py b/src/tox/venv.py index dc16bedc3..75d7a94e5 100644 --- a/src/tox/venv.py +++ b/src/tox/venv.py @@ -557,7 +557,8 @@ def _pcall( # construct environment variables env.pop("VIRTUALENV_PYTHON", None) bin_dir = str(self.envconfig.envbindir) - env["PATH"] = os.pathsep.join([bin_dir, os.environ["PATH"]]) + path = self.envconfig.setenv.get("PATH") or os.environ["PATH"] + env["PATH"] = os.pathsep.join([bin_dir, path]) reporter.verbosity2("setting PATH={}".format(env["PATH"])) # get command diff --git a/tests/unit/test_venv.py b/tests/unit/test_venv.py index bbf6644ed..b605f601c 100644 --- a/tests/unit/test_venv.py +++ b/tests/unit/test_venv.py @@ -1096,3 +1096,26 @@ def test_create_download(mocksession, newconfig, download): else: assert "--no-download" in map(str, args) mocksession._clearmocks() + + +def test_path_change(tmpdir, mocksession, newconfig, monkeypatch): + config = newconfig( + [], + """\ + [testenv:python] + setenv = + PATH = {env:PATH}{:}{toxinidir}/bin + """, + ) + pkg = tmpdir.ensure("package.tar.gz") + mocksession._clearmocks() + mocksession.new_config(config) + venv = mocksession.getvenv("python") + installpkg(venv, pkg) + venv.test() + + pcalls = mocksession._pcalls + for x in pcalls: + path = x.env["PATH"] + assert os.environ["PATH"] in path + assert path.endswith(str(venv.envconfig.config.toxinidir) + "/bin")