diff options
author | Bernát Gábor <gaborjbernat@gmail.com> | 2022-12-16 10:22:30 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-16 10:22:30 -0800 |
commit | 5cef03092cc06fd598d66a821751cdb1c4789f1c (patch) | |
tree | b86b8928dd05080ae9f6ebafbbfa6077a00a4031 /src/tox | |
parent | d074f3fa05cd10acb789ad23e62310c4a179e013 (diff) | |
download | tox-git-5cef03092cc06fd598d66a821751cdb1c4789f1c.tar.gz |
Fix python hash seed not being set (#2739)
Resolves https://github.com/tox-dev/tox/issues/2645
Diffstat (limited to 'src/tox')
-rw-r--r-- | src/tox/session/cmd/run/common.py | 29 | ||||
-rw-r--r-- | src/tox/tox_env/python/api.py | 7 |
2 files changed, 33 insertions, 3 deletions
diff --git a/src/tox/session/cmd/run/common.py b/src/tox/session/cmd/run/common.py index 794e249a..e8a5eeb7 100644 --- a/src/tox/session/cmd/run/common.py +++ b/src/tox/session/cmd/run/common.py @@ -3,6 +3,8 @@ from __future__ import annotations import logging import os +import random +import sys import time from argparse import Action, ArgumentError, ArgumentParser, Namespace from concurrent.futures import CancelledError, Future, ThreadPoolExecutor, as_completed @@ -108,14 +110,35 @@ def env_run_create_flags(parser: ArgumentParser, mode: str) -> None: help="install package in development mode", dest="develop", ) - if mode not in ("config", "depends"): + if mode not in ("depends",): + + class SeedAction(Action): + def __call__( + self, + parser: ArgumentParser, # noqa: U100 + namespace: Namespace, + values: str | Sequence[Any] | None, + option_string: str | None = None, # noqa: U100 + ) -> None: + if values == "notset": + result = None + else: + try: + result = int(cast(str, values)) + if result <= 0: + raise ValueError("must be greater than zero") + except ValueError as exc: + raise ArgumentError(self, str(exc)) + setattr(namespace, self.dest, result) + parser.add_argument( "--hashseed", metavar="SEED", help="set PYTHONHASHSEED to SEED before running commands. Defaults to a random integer in the range " "[1, 4294967295] ([1, 1024] on Windows). Passing 'noset' suppresses this behavior.", - type=str, - default="noset", + action=SeedAction, + of_type=Optional[int], + default=random.randint(1, 1024 if sys.platform == "win32" else 4294967295), dest="hash_seed", ) parser.add_argument( diff --git a/src/tox/tox_env/python/api.py b/src/tox/tox_env/python/api.py index 6f25dd6a..bc841ad8 100644 --- a/src/tox/tox_env/python/api.py +++ b/src/tox/tox_env/python/api.py @@ -88,6 +88,13 @@ class Python(ToxEnv, ABC): self.conf.add_constant("py_dot_ver", "<python major>.<python minor>", value=self.py_dot_ver) self.conf.add_constant("py_impl", "python implementation", value=self.py_impl) + def _default_set_env(self) -> dict[str, str]: + env = super()._default_set_env() + hash_seed: int | None = getattr(self.options, "hash_seed", None) + if hash_seed is not None: + env["PYTHONHASHSEED"] = str(hash_seed) + return env + def py_dot_ver(self) -> str: return self.base_python.version_dot |