summaryrefslogtreecommitdiff
path: root/src/tox
diff options
context:
space:
mode:
authorBernát Gábor <gaborjbernat@gmail.com>2022-12-16 10:22:30 -0800
committerGitHub <noreply@github.com>2022-12-16 10:22:30 -0800
commit5cef03092cc06fd598d66a821751cdb1c4789f1c (patch)
treeb86b8928dd05080ae9f6ebafbbfa6077a00a4031 /src/tox
parentd074f3fa05cd10acb789ad23e62310c4a179e013 (diff)
downloadtox-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.py29
-rw-r--r--src/tox/tox_env/python/api.py7
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