Skip to content

Commit

Permalink
When provisioning ignore other env configurations
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.

Explicitly instantiate the env config for the provision environment without a
base so that any directives set in `testenv` will not leak through into the
provision environment.

Fix #2862
  • Loading branch information
masenf committed Jan 16, 2023
1 parent 8426cd9 commit cb7051a
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 7 deletions.
4 changes: 4 additions & 0 deletions docs/changelog/2862.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
The provision environment (``.tox``) will never inherit from ``testenv``.
During provisioning, other test environments are not processed, allowing the
use of keys and values that may be registered by later tox version or
provisioned plugins - by :user:`masenf`.
5 changes: 4 additions & 1 deletion src/tox/config/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ def get_env(
item: str,
package: bool = False,
loaders: Sequence[Loader[Any]] | None = None,
base: list[str] | None = None,
) -> EnvConfigSet:
"""
Return the configuration for a given tox environment (will create if not exist yet).
Expand All @@ -157,9 +158,11 @@ def get_env(
:return: the tox environments config
"""
section, base_test, base_pkg = self._src.get_tox_env_section(item)
if base is None:
base = base_pkg if package else base_test
conf_set = self.get_section_config(
section,
base=base_pkg if package else base_test,
base=base,
of_type=EnvConfigSet,
for_env=item,
loaders=loaders,
Expand Down
28 changes: 22 additions & 6 deletions src/tox/session/env_select.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,13 +241,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
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)
if provision_on and name != provision_tox_env:
# for provision run, don't consider any environment other than provision env
return None
if name == provision_tox_env:
# explicitly load the provision env without any base to avoid inheritance
env_conf = self._state.conf.get_env(name, package=False, base=[])
if provision_loader is not None:
env_conf.loaders.insert(0, provision_loader)
else:
env_conf = self._state.conf.get_env(name, package=False)
runner_key_desc = "the tox execute used to evaluate this environment"
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 cb7051a

Please sign in to comment.