Skip to content

Commit cb7051a

Browse files
committed
When provisioning ignore other env configurations
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
1 parent 8426cd9 commit cb7051a

File tree

3 files changed

+30
-7
lines changed

3 files changed

+30
-7
lines changed

docs/changelog/2862.bugfix.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
The provision environment (``.tox``) will never inherit from ``testenv``.
2+
During provisioning, other test environments are not processed, allowing the
3+
use of keys and values that may be registered by later tox version or
4+
provisioned plugins - by :user:`masenf`.

src/tox/config/main.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ def get_env(
147147
item: str,
148148
package: bool = False,
149149
loaders: Sequence[Loader[Any]] | None = None,
150+
base: list[str] | None = None,
150151
) -> EnvConfigSet:
151152
"""
152153
Return the configuration for a given tox environment (will create if not exist yet).
@@ -157,9 +158,11 @@ def get_env(
157158
:return: the tox environments config
158159
"""
159160
section, base_test, base_pkg = self._src.get_tox_env_section(item)
161+
if base is None:
162+
base = base_pkg if package else base_test
160163
conf_set = self.get_section_config(
161164
section,
162-
base=base_pkg if package else base_test,
165+
base=base,
163166
of_type=EnvConfigSet,
164167
for_env=item,
165168
loaders=loaders,

src/tox/session/env_select.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -241,13 +241,29 @@ def _finalize_config(self) -> None:
241241
self._state.conf.core.mark_finalized()
242242

243243
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]:
244+
provision_on = provision_tox_env = provision_loader = None
245+
if self._provision is not None:
246+
provision_on, provision_tox_env, provision_loader = self._provision
247+
if not provision_on and name == provision_tox_env:
248+
# not a provision run, so don't include provision env (.tox) as a run env
245249
return None
246-
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)
250+
if provision_on and name != provision_tox_env:
251+
# for provision run, don't consider any environment other than provision env
252+
return None
253+
if name == provision_tox_env:
254+
# explicitly load the provision env without any base to avoid inheritance
255+
env_conf = self._state.conf.get_env(name, package=False, base=[])
256+
if provision_loader is not None:
257+
env_conf.loaders.insert(0, provision_loader)
258+
else:
259+
env_conf = self._state.conf.get_env(name, package=False)
260+
runner_key_desc = "the tox execute used to evaluate this environment"
261+
env_conf.add_config(
262+
keys="runner",
263+
desc=runner_key_desc,
264+
of_type=str,
265+
default=self._state.conf.options.default_runner,
266+
)
251267
runner = REGISTER.runner(cast(str, env_conf["runner"]))
252268
journal = self._journal.get_env_journal(name)
253269
args = ToxEnvCreateArgs(env_conf, self._state.conf.core, self._state.conf.options, journal, self._log_handler)

0 commit comments

Comments
 (0)