Skip to content

Commit

Permalink
provision environment always uses VirtualEnvRunner
Browse files Browse the repository at this point in the history
when running provision, ignore other environments, since their configuration
might not be valid until running in the provisioned environment.
  • Loading branch information
masenf committed Jan 16, 2023
1 parent 4977974 commit 3dad658
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 5 deletions.
3 changes: 3 additions & 0 deletions docs/changelog/2862.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Always use ``VirtualEnvRunner`` to evaluate the provision environment triggered by
``minversion`` or ``requires`` mismatch. During provisioning, all other test
environments are ignored. - by :user:`masenf`
27 changes: 22 additions & 5 deletions src/tox/session/env_select.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from ..report import HandledError
from ..tox_env.errors import Skip
from ..tox_env.package import PackageToxEnv
from ..tox_env.python.virtual_env.runner import VirtualEnvRunner

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

def _build_run_env(self, name: str) -> RunToxEnv | None:
if self._provision is not None and self._provision[0] is False and name == self._provision[1]:
provision_on = provision_tox_env = provision_loader = None
if self._provision is not None:
provision_on, provision_tox_env, provision_loader = self._provision
if not provision_on and name == provision_tox_env:
# not a provision run, so don't include provision env (.tox) as a run env
return None
if provision_on and name != provision_tox_env:
# for provision run, don't consider any environment other than provision env
return None
env_conf = self._state.conf.get_env(name, package=False)
if self._provision is not None and self._provision[1] == name:
env_conf.loaders.insert(0, self._provision[2])
desc = "the tox execute used to evaluate this environment"
env_conf.add_config(keys="runner", desc=desc, of_type=str, default=self._state.conf.options.default_runner)
runner_key_desc = "the tox execute used to evaluate this environment"
if name == provision_tox_env:
if provision_loader is not None:
env_conf.loaders.insert(0, provision_loader)
# provision environment always runs with VirtualEnvRunner
env_conf.add_constant(keys="runner", desc=runner_key_desc, value=VirtualEnvRunner.id())
else:
env_conf.add_config(
keys="runner",
desc=runner_key_desc,
of_type=str,
default=self._state.conf.options.default_runner,
)
runner = REGISTER.runner(cast(str, env_conf["runner"]))
journal = self._journal.get_env_journal(name)
args = ToxEnvCreateArgs(env_conf, self._state.conf.core, self._state.conf.options, journal, self._log_handler)
Expand Down

0 comments on commit 3dad658

Please sign in to comment.