Skip to content

Commit 3dad658

Browse files
committed
provision environment always uses VirtualEnvRunner
when running provision, ignore other environments, since their configuration might not be valid until running in the provisioned environment.
1 parent 4977974 commit 3dad658

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

docs/changelog/2862.bugfix.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Always use ``VirtualEnvRunner`` to evaluate the provision environment triggered by
2+
``minversion`` or ``requires`` mismatch. During provisioning, all other test
3+
environments are ignored. - by :user:`masenf`

src/tox/session/env_select.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from ..report import HandledError
1919
from ..tox_env.errors import Skip
2020
from ..tox_env.package import PackageToxEnv
21+
from ..tox_env.python.virtual_env.runner import VirtualEnvRunner
2122

2223
if TYPE_CHECKING:
2324
from tox.session.state import State
@@ -241,13 +242,29 @@ def _finalize_config(self) -> None:
241242
self._state.conf.core.mark_finalized()
242243

243244
def _build_run_env(self, name: str) -> RunToxEnv | None:
244-
if self._provision is not None and self._provision[0] is False and name == self._provision[1]:
245+
provision_on = provision_tox_env = provision_loader = None
246+
if self._provision is not None:
247+
provision_on, provision_tox_env, provision_loader = self._provision
248+
if not provision_on and name == provision_tox_env:
249+
# not a provision run, so don't include provision env (.tox) as a run env
250+
return None
251+
if provision_on and name != provision_tox_env:
252+
# for provision run, don't consider any environment other than provision env
245253
return None
246254
env_conf = self._state.conf.get_env(name, package=False)
247-
if self._provision is not None and self._provision[1] == name:
248-
env_conf.loaders.insert(0, self._provision[2])
249-
desc = "the tox execute used to evaluate this environment"
250-
env_conf.add_config(keys="runner", desc=desc, of_type=str, default=self._state.conf.options.default_runner)
255+
runner_key_desc = "the tox execute used to evaluate this environment"
256+
if name == provision_tox_env:
257+
if provision_loader is not None:
258+
env_conf.loaders.insert(0, provision_loader)
259+
# provision environment always runs with VirtualEnvRunner
260+
env_conf.add_constant(keys="runner", desc=runner_key_desc, value=VirtualEnvRunner.id())
261+
else:
262+
env_conf.add_config(
263+
keys="runner",
264+
desc=runner_key_desc,
265+
of_type=str,
266+
default=self._state.conf.options.default_runner,
267+
)
251268
runner = REGISTER.runner(cast(str, env_conf["runner"]))
252269
journal = self._journal.get_env_journal(name)
253270
args = ToxEnvCreateArgs(env_conf, self._state.conf.core, self._state.conf.options, journal, self._log_handler)

0 commit comments

Comments
 (0)