From e5d866b793e66d5480489a83b99b1bfeb306831c Mon Sep 17 00:00:00 2001 From: audmartina9 <211814654+audmartina9@users.noreply.github.com> Date: Tue, 8 Sep 2026 07:58:27 +0800 Subject: [PATCH 1/2] fix: use Windows virtualenv interpreter in pre-commit hook --- git-hooks/pre-commit.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/git-hooks/pre-commit.py b/git-hooks/pre-commit.py index 9e477accd5..4ea6ccea92 100755 --- a/git-hooks/pre-commit.py +++ b/git-hooks/pre-commit.py @@ -2,6 +2,7 @@ from __future__ import annotations import io +import os import shutil import subprocess import sys @@ -217,7 +218,7 @@ def main() -> None: venv_dir = tmp_root / ".venv" run([python, "-m", "venv", str(venv_dir)]) - venv_python = venv_dir / "bin" / "python" + venv_python = venv_dir / ("Scripts/python.exe" if os.name == "nt" else "bin/python") python = str(venv_python) run([ From 2c01bce17793829b8065d22d63cf634e0d80e87f Mon Sep 17 00:00:00 2001 From: audmartina9 <211814654+audmartina9@users.noreply.github.com> Date: Tue, 8 Sep 2026 08:06:19 +0800 Subject: [PATCH 2/2] test: cover offline pre-commit virtualenv execution --- git-hooks/test_pre_commit_venv.py | 57 +++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 git-hooks/test_pre_commit_venv.py diff --git a/git-hooks/test_pre_commit_venv.py b/git-hooks/test_pre_commit_venv.py new file mode 100644 index 0000000000..2e3087819f --- /dev/null +++ b/git-hooks/test_pre_commit_venv.py @@ -0,0 +1,57 @@ +"""Offline integration coverage for the hook's virtual environment interpreter.""" +import contextlib +import importlib.util +import io +import os +from pathlib import Path +import tempfile +import unittest +from unittest.mock import patch + + +class PreCommitVirtualenvTest(unittest.TestCase): + def test_dependency_install_and_validators_use_created_virtualenv(self): + spec = importlib.util.spec_from_file_location( + "pre_commit", Path(__file__).with_name("pre-commit.py") + ) + hook = importlib.util.module_from_spec(spec) + spec.loader.exec_module(hook) + completed = [] + real_run = hook.run + + def overlay(url, dest, subpath): + (dest / "requirements.txt").write_text("", encoding="utf-8") + for script in hook.SCRIPTS: + (dest / script).write_text( + "import sys\nassert sys.prefix != sys.base_prefix\n", + encoding="utf-8", + ) + + def run(cmd, **kwargs): + real_run(cmd, **kwargs) + completed.append(list(cmd)) + + with tempfile.TemporaryDirectory(prefix="precommit-venv-test-") as root: + with ( + patch.object(hook, "get_repo_root", return_value=Path(root)), + patch.object(hook, "checkout_index_tree"), + patch.object(hook, "download_and_extract", side_effect=overlay), + patch.object(hook, "run", side_effect=run), + patch.dict(os.environ, { + "PIP_NO_INDEX": "1", + "PIP_DISABLE_PIP_VERSION_CHECK": "1", + }), + contextlib.redirect_stdout(io.StringIO()), + ): + hook.main() + + self.assertEqual(len(completed), 5) + self.assertEqual(completed[1][1:4], ["-m", "pip", "install"]) + self.assertEqual( + [Path(cmd[1]).name for cmd in completed[-3:]], hook.SCRIPTS + ) + self.assertTrue(all(cmd[0] == completed[1][0] for cmd in completed[-3:])) + + +if __name__ == "__main__": + unittest.main()