From edd0002e4312dc62fc8a236a3b4dc08d1012555d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 22:30:07 +0000 Subject: [PATCH 01/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/hhatto/autopep8: v2.3.1 → v2.3.2](https://github.com/hhatto/autopep8/compare/v2.3.1...v2.3.2) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4a23da2b..b7362292 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,7 +29,7 @@ repos: - id: pyupgrade args: [--py39-plus] - repo: https://github.com/hhatto/autopep8 - rev: v2.3.1 + rev: v2.3.2 hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 From e2210c97e2128703e41cc19e66f24c23b9157f69 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Thu, 30 Jan 2025 14:58:50 -0500 Subject: [PATCH 02/48] upgrade asottile/workflows Committed via https://github.com/asottile/all-repos --- .github/workflows/languages.yaml | 2 +- .github/workflows/main.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/languages.yaml b/.github/workflows/languages.yaml index 61293a0d..fccf2989 100644 --- a/.github/workflows/languages.yaml +++ b/.github/workflows/languages.yaml @@ -36,7 +36,7 @@ jobs: matrix: include: ${{ fromJSON(needs.vars.outputs.languages) }} steps: - - uses: asottile/workflows/.github/actions/fast-checkout@v1.4.0 + - uses: asottile/workflows/.github/actions/fast-checkout@v1.8.1 - uses: actions/setup-python@v4 with: python-version: 3.9 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2355b662..7fda646f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,12 +12,12 @@ concurrency: jobs: main-windows: - uses: asottile/workflows/.github/workflows/tox.yml@v1.6.0 + uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 with: env: '["py39"]' os: windows-latest main-linux: - uses: asottile/workflows/.github/workflows/tox.yml@v1.6.0 + uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 with: env: '["py39", "py310", "py311", "py312"]' os: ubuntu-latest From 4f90a1e88a80dd460f36e21d774d06bf0e73921b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 22:44:01 +0000 Subject: [PATCH 03/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.14.1 → v1.15.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.14.1...v1.15.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b7362292..ead07d89 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.14.1 + rev: v1.15.0 hooks: - id: mypy additional_dependencies: [types-pyyaml] From 94b97e28f7cc7d9bcb536d7a3cf7ef6311e076fd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 21:07:26 +0000 Subject: [PATCH 04/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/PyCQA/flake8: 7.1.1 → 7.1.2](https://github.com/PyCQA/flake8/compare/7.1.1...7.1.2) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ead07d89..b216fbd6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,7 @@ repos: hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 - rev: 7.1.1 + rev: 7.1.2 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy From b7eb412c798424a94ca83c72eed6f97271545dc4 Mon Sep 17 00:00:00 2001 From: Tushar Sadhwani Date: Thu, 13 Mar 2025 17:29:20 +0530 Subject: [PATCH 05/48] fix: crash on ambiguous ref 'HEAD' --- pre_commit/git.py | 2 +- tests/git_test.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pre_commit/git.py b/pre_commit/git.py index 19aac387..2f424f89 100644 --- a/pre_commit/git.py +++ b/pre_commit/git.py @@ -126,7 +126,7 @@ def get_conflicted_files() -> set[str]: merge_diff_filenames = zsplit( cmd_output( 'git', 'diff', '--name-only', '--no-ext-diff', '-z', - '-m', tree_hash, 'HEAD', 'MERGE_HEAD', + '-m', tree_hash, 'HEAD', 'MERGE_HEAD', '--', )[1], ) return set(merge_conflict_filenames) | set(merge_diff_filenames) diff --git a/tests/git_test.py b/tests/git_test.py index 93f5a1c6..02b6ce3a 100644 --- a/tests/git_test.py +++ b/tests/git_test.py @@ -141,6 +141,15 @@ def test_get_conflicted_files_unstaged_files(in_merge_conflict): assert ret == {'conflict_file'} +def test_get_conflicted_files_with_file_named_head(in_merge_conflict): + resolve_conflict() + open('HEAD', 'w').close() + cmd_output('git', 'add', 'HEAD') + + ret = set(git.get_conflicted_files()) + assert ret == {'conflict_file', 'HEAD'} + + MERGE_MSG = b"Merge branch 'foo' into bar\n\nConflicts:\n\tconflict_file\n" OTHER_MERGE_MSG = MERGE_MSG + b'\tother_conflict_file\n' From 3e8d0f5e1c449381272b80241140e985631f9912 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 18 Mar 2025 14:55:24 -0400 Subject: [PATCH 06/48] adjust python default_language_version to prefer versioned exe --- pre_commit/languages/python.py | 34 ++++++++++++----- tests/languages/python_test.py | 67 ++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 10 deletions(-) diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py index 0c4bb62d..88ececce 100644 --- a/pre_commit/languages/python.py +++ b/pre_commit/languages/python.py @@ -75,6 +75,13 @@ def _find_by_py_launcher( return None +def _impl_exe_name() -> str: + if sys.implementation.name == 'cpython': # pragma: cpython cover + return 'python' + else: # pragma: cpython no cover + return sys.implementation.name # pypy mostly + + def _find_by_sys_executable() -> str | None: def _norm(path: str) -> str | None: _, exe = os.path.split(path.lower()) @@ -100,18 +107,25 @@ def _find_by_sys_executable() -> str | None: @functools.lru_cache(maxsize=1) def get_default_version() -> str: # pragma: no cover (platform dependent) - # First attempt from `sys.executable` (or the realpath) - exe = _find_by_sys_executable() - if exe: - return exe + v_major = f'{sys.version_info[0]}' + v_minor = f'{sys.version_info[0]}.{sys.version_info[1]}' - # Next try the `pythonX.X` executable - exe = f'python{sys.version_info[0]}.{sys.version_info[1]}' - if find_executable(exe): - return exe + # attempt the likely implementation exe + for potential in (v_minor, v_major): + exe = f'{_impl_exe_name()}{potential}' + if find_executable(exe): + return exe - if _find_by_py_launcher(exe): - return exe + # next try `sys.executable` (or the realpath) + maybe_exe = _find_by_sys_executable() + if maybe_exe: + return maybe_exe + + # maybe on windows we can find it via py launcher? + if sys.platform == 'win32': # pragma: win32 cover + exe = f'python{v_minor}' + if _find_by_py_launcher(exe): + return exe # We tried! return C.DEFAULT diff --git a/tests/languages/python_test.py b/tests/languages/python_test.py index ab26e14e..565525a4 100644 --- a/tests/languages/python_test.py +++ b/tests/languages/python_test.py @@ -12,6 +12,7 @@ from pre_commit.languages import python from pre_commit.prefix import Prefix from pre_commit.util import make_executable from pre_commit.util import win_exe +from testing.auto_namedtuple import auto_namedtuple from testing.language_helpers import run_language @@ -34,6 +35,72 @@ def test_read_pyvenv_cfg_non_utf8(tmpdir): assert python._read_pyvenv_cfg(pyvenv_cfg) == expected +def _get_default_version( + *, + impl: str, + exe: str, + found: set[str], + version: tuple[int, int], +) -> str: + sys_exe = f'/fake/path/{exe}' + sys_impl = auto_namedtuple(name=impl) + sys_ver = auto_namedtuple(major=version[0], minor=version[1]) + + def find_exe(s): + if s in found: + return f'/fake/path/found/{exe}' + else: + return None + + with ( + mock.patch.object(sys, 'implementation', sys_impl), + mock.patch.object(sys, 'executable', sys_exe), + mock.patch.object(sys, 'version_info', sys_ver), + mock.patch.object(python, 'find_executable', find_exe), + ): + return python.get_default_version.__wrapped__() + + +def test_default_version_sys_executable_found(): + ret = _get_default_version( + impl='cpython', + exe='python3.12', + found={'python3.12'}, + version=(3, 12), + ) + assert ret == 'python3.12' + + +def test_default_version_picks_specific_when_found(): + ret = _get_default_version( + impl='cpython', + exe='python3', + found={'python3', 'python3.12'}, + version=(3, 12), + ) + assert ret == 'python3.12' + + +def test_default_version_picks_pypy_versioned_exe(): + ret = _get_default_version( + impl='pypy', + exe='python', + found={'pypy3.12', 'python3'}, + version=(3, 12), + ) + assert ret == 'pypy3.12' + + +def test_default_version_picks_pypy_unversioned_exe(): + ret = _get_default_version( + impl='pypy', + exe='python', + found={'pypy3', 'python3'}, + version=(3, 12), + ) + assert ret == 'pypy3' + + def test_norm_version_expanduser(): home = os.path.expanduser('~') if sys.platform == 'win32': # pragma: win32 cover From aa48766b888990e7b118d12cf757109d96e65a7e Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 18 Mar 2025 17:34:49 -0400 Subject: [PATCH 07/48] v4.2.0 --- CHANGELOG.md | 13 +++++++++++++ setup.cfg | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 408afe68..b63f4431 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +4.2.0 - 2025-03-18 +================== + +### Features +- For `language: python` first attempt a versioned python executable for + the default language version before consulting a potentially unversioned + `sys.executable`. + - #3430 PR by @asottile. + +### Fixes +- Handle error during conflict detection when a file is named "HEAD" + - #3425 PR by @tusharsadhwani. + 4.1.0 - 2025-01-20 ================== diff --git a/setup.cfg b/setup.cfg index 60d97641..af34452d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.1.0 +version = 4.2.0 description = A framework for managing and maintaining multi-language pre-commit hooks. long_description = file: README.md long_description_content_type = text/markdown From 6d47b8d52bd53320807886edd82b6fb4e1c67089 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 19:43:51 +0000 Subject: [PATCH 08/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/setup-cfg-fmt: v2.7.0 → v2.8.0](https://github.com/asottile/setup-cfg-fmt/compare/v2.7.0...v2.8.0) - [github.com/PyCQA/flake8: 7.1.2 → 7.2.0](https://github.com/PyCQA/flake8/compare/7.1.2...7.2.0) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b216fbd6..a19b44bc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,7 +10,7 @@ repos: - id: name-tests-test - id: requirements-txt-fixer - repo: https://github.com/asottile/setup-cfg-fmt - rev: v2.7.0 + rev: v2.8.0 hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder-python-imports @@ -33,7 +33,7 @@ repos: hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 - rev: 7.1.2 + rev: 7.2.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy From 43592c2a29c587aab7f70046a02ef95893841e67 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 19:44:12 +0000 Subject: [PATCH 09/48] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- setup.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index af34452d..90f49df9 100644 --- a/setup.cfg +++ b/setup.cfg @@ -10,7 +10,6 @@ author_email = asottile@umich.edu license = MIT license_files = LICENSE classifiers = - License :: OSI Approved :: MIT License Programming Language :: Python :: 3 Programming Language :: Python :: 3 :: Only Programming Language :: Python :: Implementation :: CPython From 466f6c4a3939375dc2dc7a2fc34f553c2715d738 Mon Sep 17 00:00:00 2001 From: Matthew Hughes Date: Sun, 13 Apr 2025 11:18:18 +0100 Subject: [PATCH 10/48] Fix permission errors for mounts in rootless docker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By running containers in a rootless docker context as root. This is because user and group IDs are remapped in the user namespaces uses by rootless docker, and it's unlikely that the current user ID will map to the same ID under this remap (see docs[1] for some more details). Specifically, it means ownership of mounted volumes will not be for the current user and trying to write can result in permission errors. This change borrows heavily from an existing PR[2]. The output format of `docker system info` I don't think is documented/guaranteed anywhere, but it should corresponding to the format of a `/info` API request to Docker[3] The added test _hopes_ to avoid regressions in this behaviour, but since tests aren't run in a rootless docker context on the PR checks (and I couldn't find an easy way to make it the case) there's still a risk of regressions sneaking in. Link: https://docs.docker.com/engine/security/rootless/ [1] Link: https://github.com/pre-commit/pre-commit/pull/1484/ [2] Link: https://docs.docker.com/reference/api/engine/version/v1.48/#tag/System/operation/SystemAuth [3] Co-authored-by: Kurt von Laven Co-authored-by: Fabrice Flore-Thébault --- pre_commit/languages/docker.py | 26 +++++++++++++++++++ tests/languages/docker_test.py | 47 ++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 4de1d582..086e874d 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -1,5 +1,6 @@ from __future__ import annotations +import functools import hashlib import json import os @@ -101,7 +102,32 @@ def install_environment( os.mkdir(directory) +@functools.lru_cache(maxsize=1) +def _is_rootless() -> bool: # pragma: win32 no cover + retcode, out, _ = cmd_output_b( + 'docker', 'system', 'info', '--format', '{{ json . }}', + ) + if retcode != 0: + return False + + info = json.loads(out) + try: + return ( + # docker: + # https://docs.docker.com/reference/api/engine/version/v1.48/#tag/System/operation/SystemInfo + 'name=rootless' in info.get('SecurityOptions', ()) or + # podman: + # https://docs.podman.io/en/latest/_static/api.html?version=v5.4#tag/system/operation/SystemInfoLibpod + info['host']['security']['rootless'] + ) + except KeyError: + return False + + def get_docker_user() -> tuple[str, ...]: # pragma: win32 no cover + if _is_rootless(): + return () + try: return ('-u', f'{os.getuid()}:{os.getgid()}') except AttributeError: diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index 836382a8..03235c46 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -62,6 +62,42 @@ def test_docker_fallback_user(): assert docker.get_docker_user() == () +@pytest.fixture(autouse=True) +def _avoid_cache(): + with mock.patch.object( + docker, + '_is_rootless', + docker._is_rootless.__wrapped__, + ): + yield + + +@pytest.mark.parametrize( + 'info_ret', + ( + (0, b'{"SecurityOptions": ["name=rootless","name=cgroupns"]}', b''), + (0, b'{"host": {"security": {"rootless": true}}}', b''), + ), +) +def test_docker_user_rootless(info_ret): + with mock.patch.object(docker, 'cmd_output_b', return_value=info_ret): + assert docker.get_docker_user() == () + + +@pytest.mark.parametrize( + 'info_ret', + ( + (0, b'{"SecurityOptions": ["name=cgroupns"]}', b''), + (0, b'{"host": {"security": {"rootless": false}}}', b''), + (0, b'{"respone_from_some_other_container_engine": true}', b''), + (1, b'', b''), + ), +) +def test_docker_user_non_rootless(info_ret): + with mock.patch.object(docker, 'cmd_output_b', return_value=info_ret): + assert docker.get_docker_user() != () + + def test_in_docker_no_file(): with mock.patch.object(builtins, 'open', side_effect=FileNotFoundError): assert docker._is_in_docker() is False @@ -195,3 +231,14 @@ CMD ["echo", "This is overwritten by the entry"'] ret = run_language(tmp_path, docker, 'echo hello hello world') assert ret == (0, b'hello hello world\n') + + +@xfailif_windows # pragma: win32 no cover +def test_docker_hook_mount_permissions(tmp_path): + dockerfile = '''\ +FROM ubuntu:22.04 +''' + tmp_path.joinpath('Dockerfile').write_text(dockerfile) + + retcode, _ = run_language(tmp_path, docker, 'touch', ('README.md',)) + assert retcode == 0 From 43b426a501e621cc1c837f07b5633cb12525e79b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 19:45:48 +0000 Subject: [PATCH 11/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/reorder-python-imports: v3.14.0 → v3.15.0](https://github.com/asottile/reorder-python-imports/compare/v3.14.0...v3.15.0) - [github.com/asottile/add-trailing-comma: v3.1.0 → v3.2.0](https://github.com/asottile/add-trailing-comma/compare/v3.1.0...v3.2.0) - [github.com/asottile/pyupgrade: v3.19.1 → v3.20.0](https://github.com/asottile/pyupgrade/compare/v3.19.1...v3.20.0) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a19b44bc..97d1174d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,17 +14,17 @@ repos: hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder-python-imports - rev: v3.14.0 + rev: v3.15.0 hooks: - id: reorder-python-imports exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/) args: [--py39-plus, --add-import, 'from __future__ import annotations'] - repo: https://github.com/asottile/add-trailing-comma - rev: v3.1.0 + rev: v3.2.0 hooks: - id: add-trailing-comma - repo: https://github.com/asottile/pyupgrade - rev: v3.19.1 + rev: v3.20.0 hooks: - id: pyupgrade args: [--py39-plus] From d4f0c6e8a7db7c29177f16fe3e56ab5c9aad7d73 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 19:57:10 +0000 Subject: [PATCH 12/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.15.0 → v1.16.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.15.0...v1.16.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 97d1174d..4ddf3406 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.15.0 + rev: v1.16.0 hooks: - id: mypy additional_dependencies: [types-pyyaml] From d1d5b3d5648d213f8dcb1648eae77b411a27ac05 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 19:55:22 +0000 Subject: [PATCH 13/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/PyCQA/flake8: 7.2.0 → 7.3.0](https://github.com/PyCQA/flake8/compare/7.2.0...7.3.0) - [github.com/pre-commit/mirrors-mypy: v1.16.0 → v1.16.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.16.0...v1.16.1) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4ddf3406..2dc7f4c1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,11 +33,11 @@ repos: hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 - rev: 7.2.0 + rev: 7.3.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.16.0 + rev: v1.16.1 hooks: - id: mypy additional_dependencies: [types-pyyaml] From 4fd4537bc69e6804998d99e4851a9dbe43e91757 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 20:02:20 +0000 Subject: [PATCH 14/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.16.1 → v1.17.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.16.1...v1.17.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2dc7f4c1..3ef94b45 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.16.1 + rev: v1.17.0 hooks: - id: mypy additional_dependencies: [types-pyyaml] From 6f1f433a9cea94a70828ade95931a703c9a9c82b Mon Sep 17 00:00:00 2001 From: Eric Hanson <5846501+ericphanson@users.noreply.github.com> Date: Mon, 21 Jul 2025 18:05:54 +0200 Subject: [PATCH 15/48] Julia language: skip startup.jl file --- pre_commit/languages/julia.py | 5 +++-- tests/languages/julia_test.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pre_commit/languages/julia.py b/pre_commit/languages/julia.py index df91c069..7559b5ba 100644 --- a/pre_commit/languages/julia.py +++ b/pre_commit/languages/julia.py @@ -37,7 +37,7 @@ def run_hook( cmd = lang_base.hook_cmd(entry, args) script = cmd[0] if is_local else prefix.path(cmd[0]) - cmd = ('julia', script, *cmd[1:]) + cmd = ('julia', '--startup-file=no', script, *cmd[1:]) return lang_base.run_xargs( cmd, file_args, @@ -127,6 +127,7 @@ def install_environment( end """ cmd_output_b( - 'julia', '-e', julia_code, '--', envdir, *additional_dependencies, + 'julia', '--startup-file=no', '-e', julia_code, '--', envdir, + *additional_dependencies, cwd=prefix.prefix_dir, ) diff --git a/tests/languages/julia_test.py b/tests/languages/julia_test.py index 4ea3c25b..175622d6 100644 --- a/tests/languages/julia_test.py +++ b/tests/languages/julia_test.py @@ -1,5 +1,8 @@ from __future__ import annotations +import os +from unittest import mock + from pre_commit.languages import julia from testing.language_helpers import run_language from testing.util import cwd @@ -28,6 +31,17 @@ def test_julia_hook(tmp_path): assert run_language(tmp_path, julia, 'src/main.jl') == expected +def test_julia_hook_with_startup(tmp_path): + depot_path = tmp_path.joinpath('depot') + depot_path.joinpath('config').mkdir(parents=True) + startup = depot_path.joinpath('config', 'startup.jl') + startup.write_text('error("Startup file used!")\n') + + depo_path_var = f'{depot_path}{os.pathsep}' + with mock.patch.dict(os.environ, {'JULIA_DEPOT_PATH': depo_path_var}): + test_julia_hook(tmp_path) + + def test_julia_hook_manifest(tmp_path): code = """ using Example From c8925a457afb1d6850c8f105671846bae408aae0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 20:31:31 +0000 Subject: [PATCH 16/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.17.0 → v1.17.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.17.0...v1.17.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3ef94b45..da8e24ad 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.17.0 + rev: v1.17.1 hooks: - id: mypy additional_dependencies: [types-pyyaml] From f1cc7a445f1adbfc9ea4072e180fbe3054af669b Mon Sep 17 00:00:00 2001 From: Byoungchan Lee Date: Fri, 8 Aug 2025 17:02:53 +0900 Subject: [PATCH 17/48] Make Dart pre-commit hook compatible with the latest Dart SDKs Dart introduced sound null safety in version 2.12.0, and as of Dart 3, null safety is mandatory. Older Dart SDKs allowed both pre-null safety and null-safe packages, but modern Dart SDKs, where most source code is null-safe, now reject pre-null safety packages. The current `pubspec.yaml` template with `sdk: '>=2.10.0'` is incompatible with recent Dart SDKs, leading to the following error: An unexpected error has occurred: CalledProcessError: command: ('/path/to/dart-sdk/bin/dart', 'pub', 'get') return code: 65 stdout: Resolving dependencies... stderr: The lower bound of "sdk: '>=2.10.0'" must be 2.12.0' or higher to enable null safety. The current Dart SDK (3.8.3) only supports null safety. For details, see https://dart.dev/null-safety To ensure compatibility with the modern Dart ecosystem, this commit updates the minimum Dart SDK version to 2.12.0 or higher, which implicitly supports null safety. Additionally, `testing/get-dart.sh` has been updated to verify that the pre-commit hook functions correctly with the latest Dart versions. --- pre_commit/resources/empty_template_pubspec.yaml | 2 +- testing/get-dart.sh | 2 +- tests/languages/dart_test.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pre_commit/resources/empty_template_pubspec.yaml b/pre_commit/resources/empty_template_pubspec.yaml index 3be6ffe3..8306aeb6 100644 --- a/pre_commit/resources/empty_template_pubspec.yaml +++ b/pre_commit/resources/empty_template_pubspec.yaml @@ -1,4 +1,4 @@ name: pre_commit_empty_pubspec environment: - sdk: '>=2.10.0' + sdk: '>=2.12.0' executables: {} diff --git a/testing/get-dart.sh b/testing/get-dart.sh index 998b9d98..3402c421 100755 --- a/testing/get-dart.sh +++ b/testing/get-dart.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -VERSION=2.13.4 +VERSION=3.8.3 if [ "$OSTYPE" = msys ]; then URL="https://storage.googleapis.com/dart-archive/channels/stable/release/${VERSION}/sdk/dartsdk-windows-x64-release.zip" diff --git a/tests/languages/dart_test.py b/tests/languages/dart_test.py index 5bb5aa68..213d888e 100644 --- a/tests/languages/dart_test.py +++ b/tests/languages/dart_test.py @@ -10,7 +10,7 @@ from testing.language_helpers import run_language def test_dart(tmp_path): pubspec_yaml = '''\ environment: - sdk: '>=2.10.0 <3.0.0' + sdk: '>=2.12.0 <4.0.0' name: hello_world_dart From 2a0bcea7570620416a550362d9b2d2b24eb80dd8 Mon Sep 17 00:00:00 2001 From: Byoungchan Lee Date: Fri, 8 Aug 2025 17:40:30 +0900 Subject: [PATCH 18/48] Downgrade Dart SDK version installed in the CI --- testing/get-dart.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/get-dart.sh b/testing/get-dart.sh index 3402c421..b4545e71 100755 --- a/testing/get-dart.sh +++ b/testing/get-dart.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -VERSION=3.8.3 +VERSION=2.19.6 if [ "$OSTYPE" = msys ]; then URL="https://storage.googleapis.com/dart-archive/channels/stable/release/${VERSION}/sdk/dartsdk-windows-x64-release.zip" From b74a22d96cca546b8e0bb9f68f1d7d8565205b65 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 9 Aug 2025 14:54:49 -0400 Subject: [PATCH 19/48] v4.3.0 --- CHANGELOG.md | 13 +++++++++++++ setup.cfg | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b63f4431..42a63f78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +4.3.0 - 2025-08-09 +================== + +### Features +- `language: docker` / `language: docker_image`: detect rootless docker. + - #3446 PR by @matthewhughes934. + - #1243 issue by @dkolepp. +- `language: julia`: avoid `startup.jl` when executing hooks. + - #3496 PR by @ericphanson. +- `language: dart`: support latest dart versions which require a higher sdk + lower bound. + - #3507 PR by @bc-lee. + 4.2.0 - 2025-03-18 ================== diff --git a/setup.cfg b/setup.cfg index 90f49df9..9b0e02ad 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.2.0 +version = 4.3.0 description = A framework for managing and maintaining multi-language pre-commit hooks. long_description = file: README.md long_description_content_type = text/markdown From 87a681f8662554ee888a02e162d8772d64eee6cc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 20:46:13 +0000 Subject: [PATCH 20/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v5.0.0 → v6.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v5.0.0...v6.0.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index da8e24ad..464cfe60 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer From c78f248c60846fa48c9d38b488f3acc0fed96207 Mon Sep 17 00:00:00 2001 From: JulianMaurin Date: Mon, 25 Aug 2025 23:20:07 +0200 Subject: [PATCH 21/48] Add fail-fast argument for run command --- pre_commit/commands/hook_impl.py | 1 + pre_commit/commands/run.py | 3 ++- pre_commit/main.py | 4 ++++ testing/util.py | 2 ++ tests/commands/run_test.py | 13 +++++++++++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/pre_commit/commands/hook_impl.py b/pre_commit/commands/hook_impl.py index 49a80b7b..de5c8f34 100644 --- a/pre_commit/commands/hook_impl.py +++ b/pre_commit/commands/hook_impl.py @@ -106,6 +106,7 @@ def _ns( hook=None, verbose=False, show_diff_on_failure=False, + fail_fast=False, ) diff --git a/pre_commit/commands/run.py b/pre_commit/commands/run.py index 793adbdb..8ab505ff 100644 --- a/pre_commit/commands/run.py +++ b/pre_commit/commands/run.py @@ -298,7 +298,8 @@ def _run_hooks( verbose=args.verbose, use_color=args.color, ) retval |= current_retval - if current_retval and (config['fail_fast'] or hook.fail_fast): + fail_fast = (config['fail_fast'] or hook.fail_fast or args.fail_fast) + if current_retval and fail_fast: break if retval and args.show_diff_on_failure and prior_diff: if args.all_files: diff --git a/pre_commit/main.py b/pre_commit/main.py index 559c927c..fc4531b8 100644 --- a/pre_commit/main.py +++ b/pre_commit/main.py @@ -76,6 +76,10 @@ def _add_run_options(parser: argparse.ArgumentParser) -> None: '--show-diff-on-failure', action='store_true', help='When hooks fail, run `git diff` directly afterward.', ) + parser.add_argument( + '--fail-fast', action='store_true', + help='Stop after the first failing hook.', + ) parser.add_argument( '--hook-stage', choices=clientlib.STAGES, diff --git a/testing/util.py b/testing/util.py index 08d52cbc..1646ccd2 100644 --- a/testing/util.py +++ b/testing/util.py @@ -40,6 +40,7 @@ def run_opts( color=False, verbose=False, hook=None, + fail_fast=False, remote_branch='', local_branch='', from_ref='', @@ -65,6 +66,7 @@ def run_opts( color=color, verbose=verbose, hook=hook, + fail_fast=fail_fast, remote_branch=remote_branch, local_branch=local_branch, from_ref=from_ref, diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py index 50a20f37..e4af1e16 100644 --- a/tests/commands/run_test.py +++ b/tests/commands/run_test.py @@ -1104,6 +1104,19 @@ def test_fail_fast_not_prev_failures(cap_out, store, repo_with_failing_hook): assert printed.count(b'run me!') == 1 +def test_fail_fast_run_arg(cap_out, store, repo_with_failing_hook): + with modify_config() as config: + # More than one hook to demonstrate early exit + config['repos'][0]['hooks'] *= 2 + stage_a_file() + + ret, printed = _do_run( + cap_out, store, repo_with_failing_hook, run_opts(fail_fast=True), + ) + # it should have only run one hook due to the CLI flag + assert printed.count(b'Failing hook') == 1 + + def test_classifier_removes_dne(): classifier = Classifier(('this_file_does_not_exist',)) assert classifier.filenames == [] From e67183040220cd8662b5b886b24841e2d04bac9c Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 6 Sep 2025 14:20:01 -0400 Subject: [PATCH 22/48] store_true does not need default=... --- pre_commit/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pre_commit/main.py b/pre_commit/main.py index 559c927c..b7ac3dc2 100644 --- a/pre_commit/main.py +++ b/pre_commit/main.py @@ -62,10 +62,10 @@ def _add_hook_type_option(parser: argparse.ArgumentParser) -> None: def _add_run_options(parser: argparse.ArgumentParser) -> None: parser.add_argument('hook', nargs='?', help='A single hook-id to run') - parser.add_argument('--verbose', '-v', action='store_true', default=False) + parser.add_argument('--verbose', '-v', action='store_true') mutex_group = parser.add_mutually_exclusive_group(required=False) mutex_group.add_argument( - '--all-files', '-a', action='store_true', default=False, + '--all-files', '-a', action='store_true', help='Run on all the files in the repo.', ) mutex_group.add_argument( @@ -275,7 +275,7 @@ def main(argv: Sequence[str] | None = None) -> int: ) _add_hook_type_option(install_parser) install_parser.add_argument( - '--allow-missing-config', action='store_true', default=False, + '--allow-missing-config', action='store_true', help=( 'Whether to allow a missing `pre-commit` configuration file ' 'or exit with a failure code.' From 2930ea0fcd481f4c2cbeae0245a8bb748bae905a Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 6 Sep 2025 14:40:20 -0400 Subject: [PATCH 23/48] handle `SecurityOptions: null` in docker response --- pre_commit/languages/docker.py | 2 +- tests/languages/docker_test.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 086e874d..d5ce1eb7 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -115,7 +115,7 @@ def _is_rootless() -> bool: # pragma: win32 no cover return ( # docker: # https://docs.docker.com/reference/api/engine/version/v1.48/#tag/System/operation/SystemInfo - 'name=rootless' in info.get('SecurityOptions', ()) or + 'name=rootless' in (info.get('SecurityOptions') or ()) or # podman: # https://docs.podman.io/en/latest/_static/api.html?version=v5.4#tag/system/operation/SystemInfoLibpod info['host']['security']['rootless'] diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index 03235c46..b830439a 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -89,7 +89,8 @@ def test_docker_user_rootless(info_ret): ( (0, b'{"SecurityOptions": ["name=cgroupns"]}', b''), (0, b'{"host": {"security": {"rootless": false}}}', b''), - (0, b'{"respone_from_some_other_container_engine": true}', b''), + (0, b'{"response_from_some_other_container_engine": true}', b''), + (0, b'{"SecurityOptions": null}', b''), (1, b'', b''), ), ) From ad0d4cd4271cab68ddbf5e5c3386f38320e0ccd2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 20:44:04 +0000 Subject: [PATCH 24/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.17.1 → v1.18.2](https://github.com/pre-commit/mirrors-mypy/compare/v1.17.1...v1.18.2) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 464cfe60..0a24427f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.17.1 + rev: v1.18.2 hooks: - id: mypy additional_dependencies: [types-pyyaml] From f415f6c4d72224363ba794429b25cc3f52e04933 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Thu, 9 Oct 2025 17:44:05 -0400 Subject: [PATCH 25/48] py310+ Committed via https://github.com/asottile/all-repos --- .github/workflows/languages.yaml | 4 ++-- .github/workflows/main.yml | 4 ++-- .pre-commit-config.yaml | 4 ++-- pre_commit/commands/migrate_config.py | 2 +- pre_commit/file_lock.py | 2 +- pre_commit/languages/golang.py | 3 +-- pre_commit/store.py | 2 +- pre_commit/util.py | 2 +- pre_commit/xargs.py | 2 +- setup.cfg | 2 +- 10 files changed, 13 insertions(+), 14 deletions(-) diff --git a/.github/workflows/languages.yaml b/.github/workflows/languages.yaml index fccf2989..be8963ba 100644 --- a/.github/workflows/languages.yaml +++ b/.github/workflows/languages.yaml @@ -21,7 +21,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-python@v4 with: - python-version: 3.9 + python-version: '3.10' - name: install deps run: python -mpip install -e . -r requirements-dev.txt - name: vars @@ -39,7 +39,7 @@ jobs: - uses: asottile/workflows/.github/actions/fast-checkout@v1.8.1 - uses: actions/setup-python@v4 with: - python-version: 3.9 + python-version: '3.10' - run: echo "$CONDA\Scripts" >> "$GITHUB_PATH" shell: bash diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7fda646f..02b11ae2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,10 +14,10 @@ jobs: main-windows: uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 with: - env: '["py39"]' + env: '["py310"]' os: windows-latest main-linux: uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 with: - env: '["py39", "py310", "py311", "py312"]' + env: '["py310", "py311", "py312", "py313"]' os: ubuntu-latest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0a24427f..58b96f76 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,7 @@ repos: hooks: - id: reorder-python-imports exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/) - args: [--py39-plus, --add-import, 'from __future__ import annotations'] + args: [--py310-plus, --add-import, 'from __future__ import annotations'] - repo: https://github.com/asottile/add-trailing-comma rev: v3.2.0 hooks: @@ -27,7 +27,7 @@ repos: rev: v3.20.0 hooks: - id: pyupgrade - args: [--py39-plus] + args: [--py310-plus] - repo: https://github.com/hhatto/autopep8 rev: v2.3.2 hooks: diff --git a/pre_commit/commands/migrate_config.py b/pre_commit/commands/migrate_config.py index c5d47a08..b04c53a5 100644 --- a/pre_commit/commands/migrate_config.py +++ b/pre_commit/commands/migrate_config.py @@ -3,7 +3,7 @@ from __future__ import annotations import functools import itertools import textwrap -from typing import Callable +from collections.abc import Callable import cfgv import yaml diff --git a/pre_commit/file_lock.py b/pre_commit/file_lock.py index c840ad8b..6223f869 100644 --- a/pre_commit/file_lock.py +++ b/pre_commit/file_lock.py @@ -3,8 +3,8 @@ from __future__ import annotations import contextlib import errno import sys +from collections.abc import Callable from collections.abc import Generator -from typing import Callable if sys.platform == 'win32': # pragma: no cover (windows) diff --git a/pre_commit/languages/golang.py b/pre_commit/languages/golang.py index 678c04b1..bedbd114 100644 --- a/pre_commit/languages/golang.py +++ b/pre_commit/languages/golang.py @@ -90,8 +90,7 @@ def _infer_go_version(version: str) -> str: if version != C.DEFAULT: return version resp = urllib.request.urlopen('https://go.dev/dl/?mode=json') - # TODO: 3.9+ .removeprefix('go') - return json.load(resp)[0]['version'][2:] + return json.load(resp)[0]['version'].removeprefix('go') def _get_url(version: str) -> str: diff --git a/pre_commit/store.py b/pre_commit/store.py index 1235942c..9e3b4048 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -5,9 +5,9 @@ import logging import os.path import sqlite3 import tempfile +from collections.abc import Callable from collections.abc import Generator from collections.abc import Sequence -from typing import Callable import pre_commit.constants as C from pre_commit import clientlib diff --git a/pre_commit/util.py b/pre_commit/util.py index e199d080..19b1880b 100644 --- a/pre_commit/util.py +++ b/pre_commit/util.py @@ -8,10 +8,10 @@ import shutil import stat import subprocess import sys +from collections.abc import Callable from collections.abc import Generator from types import TracebackType from typing import Any -from typing import Callable from pre_commit import parse_shebang diff --git a/pre_commit/xargs.py b/pre_commit/xargs.py index a1345b58..7c98d167 100644 --- a/pre_commit/xargs.py +++ b/pre_commit/xargs.py @@ -7,12 +7,12 @@ import multiprocessing import os import subprocess import sys +from collections.abc import Callable from collections.abc import Generator from collections.abc import Iterable from collections.abc import MutableMapping from collections.abc import Sequence from typing import Any -from typing import Callable from typing import TypeVar from pre_commit import parse_shebang diff --git a/setup.cfg b/setup.cfg index 9b0e02ad..8fb6e6aa 100644 --- a/setup.cfg +++ b/setup.cfg @@ -23,7 +23,7 @@ install_requires = nodeenv>=0.11.1 pyyaml>=5.1 virtualenv>=20.10.0 -python_requires = >=3.9 +python_requires = >=3.10 [options.packages.find] exclude = From 221637b0cbdfbfe8ca209ba5df0111b08f9d8cda Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 20:38:45 +0000 Subject: [PATCH 26/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/setup-cfg-fmt: v2.8.0 → v3.1.0](https://github.com/asottile/setup-cfg-fmt/compare/v2.8.0...v3.1.0) - [github.com/asottile/reorder-python-imports: v3.15.0 → v3.16.0](https://github.com/asottile/reorder-python-imports/compare/v3.15.0...v3.16.0) - [github.com/asottile/add-trailing-comma: v3.2.0 → v4.0.0](https://github.com/asottile/add-trailing-comma/compare/v3.2.0...v4.0.0) - [github.com/asottile/pyupgrade: v3.20.0 → v3.21.0](https://github.com/asottile/pyupgrade/compare/v3.20.0...v3.21.0) --- .pre-commit-config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 58b96f76..b1623a64 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,21 +10,21 @@ repos: - id: name-tests-test - id: requirements-txt-fixer - repo: https://github.com/asottile/setup-cfg-fmt - rev: v2.8.0 + rev: v3.1.0 hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder-python-imports - rev: v3.15.0 + rev: v3.16.0 hooks: - id: reorder-python-imports exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/) args: [--py310-plus, --add-import, 'from __future__ import annotations'] - repo: https://github.com/asottile/add-trailing-comma - rev: v3.2.0 + rev: v4.0.0 hooks: - id: add-trailing-comma - repo: https://github.com/asottile/pyupgrade - rev: v3.20.0 + rev: v3.21.0 hooks: - id: pyupgrade args: [--py310-plus] From ddfcf4034bc72445497b5e6708205523a9da7ed7 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Thu, 16 Oct 2025 10:23:27 -0400 Subject: [PATCH 27/48] fix deprecated call --- pre_commit/git.py | 2 +- setup.cfg | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pre_commit/git.py b/pre_commit/git.py index 2f424f89..ec1928f3 100644 --- a/pre_commit/git.py +++ b/pre_commit/git.py @@ -219,7 +219,7 @@ def check_for_cygwin_mismatch() -> None: if is_cygwin_python ^ is_cygwin_git: exe_type = {True: '(cygwin)', False: '(windows)'} - logger.warn( + logger.warning( f'pre-commit has detected a mix of cygwin python / git\n' f'This combination is not supported, it is likely you will ' f'receive an error later in the program.\n' diff --git a/setup.cfg b/setup.cfg index 8fb6e6aa..17c3fe0e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -52,6 +52,7 @@ check_untyped_defs = true disallow_any_generics = true disallow_incomplete_defs = true disallow_untyped_defs = true +enable_error_code = deprecated warn_redundant_casts = true warn_unused_ignores = true From fc33a62f3c55c671cdef8306b6c3dc91d81e2b4a Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Fri, 24 Oct 2025 15:18:07 -0400 Subject: [PATCH 28/48] upgrade rbenv / ruby-build --- pre_commit/resources/rbenv.tar.gz | Bin 32545 -> 31297 bytes pre_commit/resources/ruby-build.tar.gz | Bin 88488 -> 93998 bytes testing/make-archives | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pre_commit/resources/rbenv.tar.gz b/pre_commit/resources/rbenv.tar.gz index 111546e3dd9796511942c278495c21fe1ef947ae..b5df08744c17c6fd950d89e8a5caf6186905dedc 100644 GIT binary patch literal 31297 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 diff --git a/pre_commit/resources/ruby-build.tar.gz b/pre_commit/resources/ruby-build.tar.gz index a4f7eb24fd0a7e4d59cf120014d8b054555b8b0f..5c82c90609384836116acd7df8bbe9f79a4c7a86 100644 GIT binary patch delta 93686 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
8nw4 z!YLMht)2IuEXtMl+j`ze>*Sk5IVF!}MT`FZ`LgYt>TPXH{}Zi`s+o2?o*S}^Y17~O z%|C=#?Egl;kO*emV#Qi{nZteE(%t18uVU467S1e~{%iG}jgu#3mYn=vbbM9Xtf!G| zVHdfLA6aDxyZO&_oGJ2krS&ZqoQpl-sTqO{e$pOqW~ocKxaysg3nz-;ZS%POZ9jtm~{sp2m?mQyLYr z%lzWlQsny#9xR(KaIiU0aZi)xqN!KB=2jQEL{188%yz!Hgk!0s*rUTA-fV5iVPebh zixZq)bWrrh0R-4%aS;w@@w*pm*8aqIOX@`Z*>eM4eVelLj_}==CtWv091`Scy(TE} z=Z;+yA zdWSs~@5w(pYxt%6q+X@Y%K2yCw7qxT)g!R3z$ofw$G^Khn)XWd0hV*i-sn#BdsvpW z?)V^y1l)g>HD5A?EcnY3n=L{p7(8S8iJ zsf8b&?s}?xO84!KyDjhO^C)hjUx=ugP>JE&N33wzC zY_(~}*OF+X+~OEJpAS16{Xb2Z?{-A`=*NGNn-~^xx}4UK(rGAqdF4ah{6*Kcon)H0 z**?GUy?kJt+M~}q4VSuc6s=@m8qw2dQt}tM}{a z>+71fiJ5CIsfwAia`P4)^JfBp6MQuCjZ8+y50c$>nfem~XLxmZ(Pc|TXw@xMP6kLtdE;U~!d z@nn;IoAy~Xk-Jhmb$%#+4m$s=xT*Z))SwM>_B!4^IziN#UFVJXHNBXw*>@)9dJCtz z-ifJy*!1B7Lz%|5Agl5@QAX2zQf|8&zUTNK`GuR?!Ty}ltT>r7y+2pWNC|wDO%t2R ty-P6$W_+)w?oav`J}oRv{@MTds-nA!6j67x`f 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 WV@Cva`~Bztj4D6Ov>9ITG5`ST$-fH# diff --git a/testing/make-archives b/testing/make-archives index eb3f3af8..10f40a3a 100755 --- a/testing/make-archives +++ b/testing/make-archives @@ -16,8 +16,8 @@ from collections.abc import Sequence REPOS = ( - ('rbenv', 'https://github.com/rbenv/rbenv', '38e1fbb'), - ('ruby-build', 'https://github.com/rbenv/ruby-build', 'ed384c8'), + ('rbenv', 'https://github.com/rbenv/rbenv', '10e96bfc'), + ('ruby-build', 'https://github.com/rbenv/ruby-build', '447468b1'), ( 'ruby-download', 'https://github.com/garnieretienne/rvm-download', From 8bbfcf1f82ed7d1970e21a9c0323030805fdba3f Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 8 Nov 2025 13:16:33 -0500 Subject: [PATCH 29/48] remove redundant system spaces test `test_args_with_spaces_and_quotes` also covers this behaviour --- .../system_hook_with_spaces_repo/.pre-commit-hooks.yaml | 5 ----- tests/repository_test.py | 7 ------- 2 files changed, 12 deletions(-) delete mode 100644 testing/resources/system_hook_with_spaces_repo/.pre-commit-hooks.yaml diff --git a/testing/resources/system_hook_with_spaces_repo/.pre-commit-hooks.yaml b/testing/resources/system_hook_with_spaces_repo/.pre-commit-hooks.yaml deleted file mode 100644 index b2c347c1..00000000 --- a/testing/resources/system_hook_with_spaces_repo/.pre-commit-hooks.yaml +++ /dev/null @@ -1,5 +0,0 @@ -- id: system-hook-with-spaces - name: System hook with spaces - entry: bash -c 'echo "Hello World"' - language: system - files: \.sh$ diff --git a/tests/repository_test.py b/tests/repository_test.py index b54c910d..f1559301 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -80,13 +80,6 @@ def _test_hook_repo( assert out == expected -def test_system_hook_with_spaces(tempdir_factory, store): - _test_hook_repo( - tempdir_factory, store, 'system_hook_with_spaces_repo', - 'system-hook-with-spaces', [os.devnull], b'Hello World\n', - ) - - def test_missing_executable(tempdir_factory, store): _test_hook_repo( tempdir_factory, store, 'not_found_exe', From 95eec7500464500d2ca0cc13d0986000508830e5 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 8 Nov 2025 13:33:50 -0500 Subject: [PATCH 30/48] rm python3_hooks_repo --- .pre-commit-config.yaml | 2 +- .../resources/python3_hooks_repo/.pre-commit-hooks.yaml | 6 ------ testing/resources/python3_hooks_repo/py3_hook.py | 8 -------- testing/resources/python3_hooks_repo/setup.py | 8 -------- 4 files changed, 1 insertion(+), 23 deletions(-) delete mode 100644 testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml delete mode 100644 testing/resources/python3_hooks_repo/py3_hook.py delete mode 100644 testing/resources/python3_hooks_repo/setup.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b1623a64..fa077365 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,7 +17,7 @@ repos: rev: v3.16.0 hooks: - id: reorder-python-imports - exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/) + exclude: ^pre_commit/resources/ args: [--py310-plus, --add-import, 'from __future__ import annotations'] - repo: https://github.com/asottile/add-trailing-comma rev: v4.0.0 diff --git a/testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml b/testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml deleted file mode 100644 index 2c237009..00000000 --- a/testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml +++ /dev/null @@ -1,6 +0,0 @@ -- id: python3-hook - name: Python 3 Hook - entry: python3-hook - language: python - language_version: python3 - files: \.py$ diff --git a/testing/resources/python3_hooks_repo/py3_hook.py b/testing/resources/python3_hooks_repo/py3_hook.py deleted file mode 100644 index 8c9cda4c..00000000 --- a/testing/resources/python3_hooks_repo/py3_hook.py +++ /dev/null @@ -1,8 +0,0 @@ -import sys - - -def main(): - print(sys.version_info[0]) - print(repr(sys.argv[1:])) - print('Hello World') - return 0 diff --git a/testing/resources/python3_hooks_repo/setup.py b/testing/resources/python3_hooks_repo/setup.py deleted file mode 100644 index 9125dc1d..00000000 --- a/testing/resources/python3_hooks_repo/setup.py +++ /dev/null @@ -1,8 +0,0 @@ -from setuptools import setup - -setup( - name='python3_hook', - version='0.0.0', - py_modules=['py3_hook'], - entry_points={'console_scripts': ['python3-hook = py3_hook:main']}, -) From aa2961c122b4aa834c77e612232c154f9439c388 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 8 Nov 2025 14:31:11 -0500 Subject: [PATCH 31/48] fix missing context in error for stages --- pre_commit/clientlib.py | 9 +++++---- tests/clientlib_test.py | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index c0f736d9..51514bd3 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -116,11 +116,12 @@ class StagesMigrationNoDefault(NamedTuple): if self.key not in dct: return - val = dct[self.key] - cfgv.check_array(cfgv.check_any)(val) + with cfgv.validate_context(f'At key: {self.key}'): + val = dct[self.key] + cfgv.check_array(cfgv.check_any)(val) - val = [transform_stage(v) for v in val] - cfgv.check_array(cfgv.check_one_of(STAGES))(val) + val = [transform_stage(v) for v in val] + cfgv.check_array(cfgv.check_one_of(STAGES))(val) def apply_default(self, dct: dict[str, Any]) -> None: if self.key not in dct: diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py index 7aa84af0..2251abc4 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -309,6 +309,27 @@ def test_validate_optional_sensible_regex_at_top_level(caplog, regex, warning): assert caplog.record_tuples == [('pre_commit', logging.WARNING, warning)] +def test_invalid_stages_error(): + cfg = {'repos': [sample_local_config()]} + cfg['repos'][0]['hooks'][0]['stages'] = ['invalid'] + + with pytest.raises(cfgv.ValidationError) as excinfo: + cfgv.validate(cfg, CONFIG_SCHEMA) + + assert str(excinfo.value) == ( + '\n' + '==> At Config()\n' + '==> At key: repos\n' + "==> At Repository(repo='local')\n" + '==> At key: hooks\n' + "==> At Hook(id='do_not_commit')\n" + # this line was missing due to the custom validator + '==> At key: stages\n' + '==> At index 0\n' + "=====> Expected one of commit-msg, manual, post-checkout, post-commit, post-merge, post-rewrite, pre-commit, pre-merge-commit, pre-push, pre-rebase, prepare-commit-msg but got: 'invalid'" # noqa: E501 + ) + + def test_warning_for_deprecated_stages(caplog): config_obj = sample_local_config() config_obj['hooks'][0]['stages'] = ['commit', 'push'] From 725acc969a28a6bc9a7e2260f035426bc932e8da Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 8 Nov 2025 13:13:18 -0500 Subject: [PATCH 32/48] rename system and script languages to unsupported / unsupported_script --- pre_commit/all_languages.py | 8 ++-- pre_commit/clientlib.py | 47 +++++++++++++++++-- .../languages/{system.py => unsupported.py} | 0 .../{script.py => unsupported_script.py} | 0 tests/clientlib_test.py | 20 ++++++++ tests/languages/system_test.py | 9 ---- ...ipt_test.py => unsupported_script_test.py} | 6 +-- tests/languages/unsupported_test.py | 10 ++++ tests/repository_test.py | 14 +++--- 9 files changed, 88 insertions(+), 26 deletions(-) rename pre_commit/languages/{system.py => unsupported.py} (100%) rename pre_commit/languages/{script.py => unsupported_script.py} (100%) delete mode 100644 tests/languages/system_test.py rename tests/languages/{script_test.py => unsupported_script_test.py} (63%) create mode 100644 tests/languages/unsupported_test.py diff --git a/pre_commit/all_languages.py b/pre_commit/all_languages.py index ba569c37..166bc167 100644 --- a/pre_commit/all_languages.py +++ b/pre_commit/all_languages.py @@ -19,9 +19,9 @@ from pre_commit.languages import python from pre_commit.languages import r from pre_commit.languages import ruby from pre_commit.languages import rust -from pre_commit.languages import script from pre_commit.languages import swift -from pre_commit.languages import system +from pre_commit.languages import unsupported +from pre_commit.languages import unsupported_script languages: dict[str, Language] = { @@ -43,8 +43,8 @@ languages: dict[str, Language] = { 'r': r, 'ruby': ruby, 'rust': rust, - 'script': script, 'swift': swift, - 'system': system, + 'unsupported': unsupported, + 'unsupported_script': unsupported_script, } language_names = sorted(languages) diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index 51514bd3..eb0fd4d6 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -6,6 +6,7 @@ import os.path import re import shlex import sys +from collections.abc import Callable from collections.abc import Sequence from typing import Any from typing import NamedTuple @@ -190,6 +191,42 @@ class DeprecatedDefaultStagesWarning(NamedTuple): raise NotImplementedError +def _translate_language(name: str) -> str: + return { + 'system': 'unsupported', + 'script': 'unsupported_script', + }.get(name, name) + + +class LanguageMigration(NamedTuple): # remove + key: str + check_fn: Callable[[object], None] + + def check(self, dct: dict[str, Any]) -> None: + if self.key not in dct: + return + + with cfgv.validate_context(f'At key: {self.key}'): + self.check_fn(_translate_language(dct[self.key])) + + def apply_default(self, dct: dict[str, Any]) -> None: + if self.key not in dct: + return + + dct[self.key] = _translate_language(dct[self.key]) + + def remove_default(self, dct: dict[str, Any]) -> None: + raise NotImplementedError + + +class LanguageMigrationRequired(LanguageMigration): # replace with Required + def check(self, dct: dict[str, Any]) -> None: + if self.key not in dct: + raise cfgv.ValidationError(f'Missing required key: {self.key}') + + super().check(dct) + + MANIFEST_HOOK_DICT = cfgv.Map( 'Hook', 'id', @@ -203,7 +240,7 @@ MANIFEST_HOOK_DICT = cfgv.Map( cfgv.Required('id', cfgv.check_string), cfgv.Required('name', cfgv.check_string), cfgv.Required('entry', cfgv.check_string), - cfgv.Required('language', cfgv.check_one_of(language_names)), + LanguageMigrationRequired('language', cfgv.check_one_of(language_names)), cfgv.Optional('alias', cfgv.check_string, ''), cfgv.Optional('files', check_string_regex, ''), @@ -368,8 +405,10 @@ META_HOOK_DICT = cfgv.Map( 'Hook', 'id', cfgv.Required('id', cfgv.check_string), cfgv.Required('id', cfgv.check_one_of(tuple(k for k, _ in _meta))), - # language must be system - cfgv.Optional('language', cfgv.check_one_of({'system'}), 'system'), + # language must be `unsupported` + cfgv.Optional( + 'language', cfgv.check_one_of({'unsupported'}), 'unsupported', + ), # entry cannot be overridden NotAllowed('entry', cfgv.check_any), *( @@ -402,8 +441,10 @@ CONFIG_HOOK_DICT = cfgv.Map( for item in MANIFEST_HOOK_DICT.items if item.key != 'id' if item.key != 'stages' + if item.key != 'language' # remove ), StagesMigrationNoDefault('stages', []), + LanguageMigration('language', cfgv.check_one_of(language_names)), # remove *_COMMON_HOOK_WARNINGS, ) LOCAL_HOOK_DICT = cfgv.Map( diff --git a/pre_commit/languages/system.py b/pre_commit/languages/unsupported.py similarity index 100% rename from pre_commit/languages/system.py rename to pre_commit/languages/unsupported.py diff --git a/pre_commit/languages/script.py b/pre_commit/languages/unsupported_script.py similarity index 100% rename from pre_commit/languages/script.py rename to pre_commit/languages/unsupported_script.py diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py index 2251abc4..93c698f7 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -380,6 +380,26 @@ def test_no_warning_for_non_deprecated_default_stages(caplog): assert caplog.record_tuples == [] +def test_unsupported_language_migration(): + cfg = {'repos': [sample_local_config(), sample_local_config()]} + cfg['repos'][0]['hooks'][0]['language'] = 'system' + cfg['repos'][1]['hooks'][0]['language'] = 'script' + + cfgv.validate(cfg, CONFIG_SCHEMA) + ret = cfgv.apply_defaults(cfg, CONFIG_SCHEMA) + + assert ret['repos'][0]['hooks'][0]['language'] == 'unsupported' + assert ret['repos'][1]['hooks'][0]['language'] == 'unsupported_script' + + +def test_unsupported_language_migration_language_required(): + cfg = {'repos': [sample_local_config()]} + del cfg['repos'][0]['hooks'][0]['language'] + + with pytest.raises(cfgv.ValidationError): + cfgv.validate(cfg, CONFIG_SCHEMA) + + @pytest.mark.parametrize( 'manifest_obj', ( diff --git a/tests/languages/system_test.py b/tests/languages/system_test.py deleted file mode 100644 index dcd9cf1e..00000000 --- a/tests/languages/system_test.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import annotations - -from pre_commit.languages import system -from testing.language_helpers import run_language - - -def test_system_language(tmp_path): - expected = (0, b'hello hello world\n') - assert run_language(tmp_path, system, 'echo hello hello world') == expected diff --git a/tests/languages/script_test.py b/tests/languages/unsupported_script_test.py similarity index 63% rename from tests/languages/script_test.py rename to tests/languages/unsupported_script_test.py index a02f615a..b15b67e7 100644 --- a/tests/languages/script_test.py +++ b/tests/languages/unsupported_script_test.py @@ -1,14 +1,14 @@ from __future__ import annotations -from pre_commit.languages import script +from pre_commit.languages import unsupported_script from pre_commit.util import make_executable from testing.language_helpers import run_language -def test_script_language(tmp_path): +def test_unsupported_script_language(tmp_path): exe = tmp_path.joinpath('main') exe.write_text('#!/usr/bin/env bash\necho hello hello world\n') make_executable(exe) expected = (0, b'hello hello world\n') - assert run_language(tmp_path, script, 'main') == expected + assert run_language(tmp_path, unsupported_script, 'main') == expected diff --git a/tests/languages/unsupported_test.py b/tests/languages/unsupported_test.py new file mode 100644 index 00000000..7f8461e0 --- /dev/null +++ b/tests/languages/unsupported_test.py @@ -0,0 +1,10 @@ +from __future__ import annotations + +from pre_commit.languages import unsupported +from testing.language_helpers import run_language + + +def test_unsupported_language(tmp_path): + expected = (0, b'hello hello world\n') + ret = run_language(tmp_path, unsupported, 'echo hello hello world') + assert ret == expected diff --git a/tests/repository_test.py b/tests/repository_test.py index f1559301..b1c7a002 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -17,7 +17,7 @@ from pre_commit.clientlib import CONFIG_SCHEMA from pre_commit.clientlib import load_manifest from pre_commit.hook import Hook from pre_commit.languages import python -from pre_commit.languages import system +from pre_commit.languages import unsupported from pre_commit.prefix import Prefix from pre_commit.repository import _hook_installed from pre_commit.repository import all_hooks @@ -424,7 +424,7 @@ def test_manifest_hooks(tempdir_factory, store): exclude_types=[], files='', id='bash_hook', - language='script', + language='unsupported_script', language_version='default', log_file='', minimum_pre_commit_version='0', @@ -457,7 +457,7 @@ def test_non_installable_hook_error_for_language_version(store, caplog): 'hooks': [{ 'id': 'system-hook', 'name': 'system-hook', - 'language': 'system', + 'language': 'unsupported', 'entry': 'python3 -c "import sys; print(sys.version)"', 'language_version': 'python3.10', }], @@ -469,7 +469,7 @@ def test_non_installable_hook_error_for_language_version(store, caplog): msg, = caplog.messages assert msg == ( 'The hook `system-hook` specifies `language_version` but is using ' - 'language `system` which does not install an environment. ' + 'language `unsupported` which does not install an environment. ' 'Perhaps you meant to use a specific language?' ) @@ -480,7 +480,7 @@ def test_non_installable_hook_error_for_additional_dependencies(store, caplog): 'hooks': [{ 'id': 'system-hook', 'name': 'system-hook', - 'language': 'system', + 'language': 'unsupported', 'entry': 'python3 -c "import sys; print(sys.version)"', 'additional_dependencies': ['astpretty'], }], @@ -492,14 +492,14 @@ def test_non_installable_hook_error_for_additional_dependencies(store, caplog): msg, = caplog.messages assert msg == ( 'The hook `system-hook` specifies `additional_dependencies` but is ' - 'using language `system` which does not install an environment. ' + 'using language `unsupported` which does not install an environment. ' 'Perhaps you meant to use a specific language?' ) def test_args_with_spaces_and_quotes(tmp_path): ret = run_language( - tmp_path, system, + tmp_path, unsupported, f"{shlex.quote(sys.executable)} -c 'import sys; print(sys.argv[1:])'", ('i have spaces', 'and"\'quotes', '$and !this'), ) From f80801d75a429d5eafa1d87e9f88f73b108d1890 Mon Sep 17 00:00:00 2001 From: Radek Hrbacek Date: Fri, 5 Sep 2025 15:01:10 +0200 Subject: [PATCH 33/48] Fix docker-in-docker detection for cgroups v2 --- pre_commit/languages/docker.py | 42 +++--- tests/languages/docker_test.py | 230 +++++++++++++++++++++++++-------- 2 files changed, 202 insertions(+), 70 deletions(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index d5ce1eb7..7f45ac86 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -1,9 +1,11 @@ from __future__ import annotations +import contextlib import functools import hashlib import json import os +import re from collections.abc import Sequence from pre_commit import lang_base @@ -17,31 +19,33 @@ get_default_version = lang_base.basic_get_default_version health_check = lang_base.basic_health_check in_env = lang_base.no_env # no special environment for docker - -def _is_in_docker() -> bool: - try: - with open('/proc/1/cgroup', 'rb') as f: - return b'docker' in f.read() - except FileNotFoundError: - return False +_HOSTNAME_MOUNT_RE = re.compile( + rb""" + /containers + (?:/overlay-containers)? + /([a-z0-9]{64}) + (?:/userdata)? + /hostname + """, + re.VERBOSE, +) -def _get_container_id() -> str: - # It's assumed that we already check /proc/1/cgroup in _is_in_docker. The - # cpuset cgroup controller existed since cgroups were introduced so this - # way of getting the container ID is pretty reliable. - with open('/proc/1/cgroup', 'rb') as f: - for line in f.readlines(): - if line.split(b':')[1] == b'cpuset': - return os.path.basename(line.split(b':')[2]).strip().decode() - raise RuntimeError('Failed to find the container ID in /proc/1/cgroup.') +def _get_container_id() -> str | None: + with contextlib.suppress(FileNotFoundError): + with open('/proc/1/mountinfo', 'rb') as f: + for line in f: + m = _HOSTNAME_MOUNT_RE.search(line) + if m: + return m[1].decode() + + return None def _get_docker_path(path: str) -> str: - if not _is_in_docker(): - return path - container_id = _get_container_id() + if container_id is None: + return path try: _, out, _ = cmd_output_b('docker', 'inspect', container_id) diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index b830439a..e269976f 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -14,40 +14,173 @@ from pre_commit.util import CalledProcessError from testing.language_helpers import run_language from testing.util import xfailif_windows -DOCKER_CGROUP_EXAMPLE = b'''\ -12:hugetlb:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -11:blkio:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -10:freezer:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -9:cpu,cpuacct:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -8:pids:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -7:rdma:/ -6:net_cls,net_prio:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -5:cpuset:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -4:devices:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -3:memory:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -2:perf_event:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -1:name=systemd:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -0::/system.slice/containerd.service +DOCKER_CGROUPS_V1_MOUNTINFO_EXAMPLE = b'''\ +759 717 0:52 / / rw,relatime master:300 - overlay overlay rw,lowerdir=/var/lib/docker/overlay2/l/PCPE5P5IVGM7CFCPJR353N3ONK:/var/lib/docker/overlay2/l/EQFSDHFAJ333VEMEJD4ZTRIZCB,upperdir=/var/lib/docker/overlay2/0d9f6bf186030d796505b87d6daa92297355e47641e283d3c09d83a7f221e462/diff,workdir=/var/lib/docker/overlay2/0d9f6bf186030d796505b87d6daa92297355e47641e283d3c09d83a7f221e462/work +760 759 0:58 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +761 759 0:59 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +762 761 0:60 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +763 759 0:61 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro +764 763 0:62 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,mode=755,inode64 +765 764 0:29 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/systemd ro,nosuid,nodev,noexec,relatime master:11 - cgroup cgroup rw,xattr,name=systemd +766 764 0:32 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/rdma ro,nosuid,nodev,noexec,relatime master:15 - cgroup cgroup rw,rdma +767 764 0:33 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/cpu,cpuacct ro,nosuid,nodev,noexec,relatime master:16 - cgroup cgroup rw,cpu,cpuacct +768 764 0:34 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/cpuset ro,nosuid,nodev,noexec,relatime master:17 - cgroup cgroup rw,cpuset +769 764 0:35 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/pids ro,nosuid,nodev,noexec,relatime master:18 - cgroup cgroup rw,pids +770 764 0:36 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime master:19 - cgroup cgroup rw,memory +771 764 0:37 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/perf_event ro,nosuid,nodev,noexec,relatime master:20 - cgroup cgroup rw,perf_event +772 764 0:38 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/net_cls,net_prio ro,nosuid,nodev,noexec,relatime master:21 - cgroup cgroup rw,net_cls,net_prio +773 764 0:39 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/blkio ro,nosuid,nodev,noexec,relatime master:22 - cgroup cgroup rw,blkio +774 764 0:40 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/misc ro,nosuid,nodev,noexec,relatime master:23 - cgroup cgroup rw,misc +775 764 0:41 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/hugetlb ro,nosuid,nodev,noexec,relatime master:24 - cgroup cgroup rw,hugetlb +776 764 0:42 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/devices ro,nosuid,nodev,noexec,relatime master:25 - cgroup cgroup rw,devices +777 764 0:43 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/freezer ro,nosuid,nodev,noexec,relatime master:26 - cgroup cgroup rw,freezer +778 761 0:57 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +779 761 0:63 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k,inode64 +780 759 8:5 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/resolv.conf /etc/resolv.conf rw,relatime - ext4 /dev/sda5 rw,errors=remount-ro +781 759 8:5 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/hostname /etc/hostname rw,relatime - ext4 /dev/sda5 rw,errors=remount-ro +782 759 8:5 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/hosts /etc/hosts rw,relatime - ext4 /dev/sda5 rw,errors=remount-ro +718 761 0:60 /0 /dev/console rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +719 760 0:58 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +720 760 0:58 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +721 760 0:58 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +722 760 0:58 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +723 760 0:58 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +724 760 0:64 / /proc/asound ro,relatime - tmpfs tmpfs ro,inode64 +725 760 0:65 / /proc/acpi ro,relatime - tmpfs tmpfs ro,inode64 +726 760 0:59 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +727 760 0:59 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +728 760 0:59 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +729 760 0:66 / /proc/scsi ro,relatime - tmpfs tmpfs ro,inode64 +730 763 0:67 / /sys/firmware ro,relatime - tmpfs tmpfs ro,inode64 +731 763 0:68 / /sys/devices/virtual/powercap ro,relatime - tmpfs tmpfs ro,inode64 +''' # noqa: E501 + +DOCKER_CGROUPS_V2_MOUNTINFO_EXAMPLE = b'''\ +721 386 0:45 / / rw,relatime master:218 - overlay overlay rw,lowerdir=/var/lib/docker/overlay2/l/QHZ7OM7P4AQD3XLG274ZPWAJCV:/var/lib/docker/overlay2/l/5RFG6SZWVGOG2NKEYXJDQCQYX5,upperdir=/var/lib/docker/overlay2/e4ad859fc5d4791932b9b976052f01fb0063e01de3cef916e40ae2121f6a166e/diff,workdir=/var/lib/docker/overlay2/e4ad859fc5d4791932b9b976052f01fb0063e01de3cef916e40ae2121f6a166e/work,nouserxattr +722 721 0:48 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +723 721 0:50 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +724 723 0:51 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +725 721 0:52 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro +726 725 0:26 / /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup rw,nsdelegate,memory_recursiveprot +727 723 0:47 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +728 723 0:53 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k,inode64 +729 721 8:3 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/resolv.conf /etc/resolv.conf rw,relatime - ext4 /dev/sda3 rw,errors=remount-ro +730 721 8:3 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/hostname /etc/hostname rw,relatime - ext4 /dev/sda3 rw,errors=remount-ro +731 721 8:3 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/hosts /etc/hosts rw,relatime - ext4 /dev/sda3 rw,errors=remount-ro +387 723 0:51 /0 /dev/console rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +388 722 0:48 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +389 722 0:48 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +525 722 0:48 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +526 722 0:48 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +571 722 0:48 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +572 722 0:57 / /proc/asound ro,relatime - tmpfs tmpfs ro,inode64 +575 722 0:58 / /proc/acpi ro,relatime - tmpfs tmpfs ro,inode64 +576 722 0:50 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +577 722 0:50 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +578 722 0:50 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +579 722 0:59 / /proc/scsi ro,relatime - tmpfs tmpfs ro,inode64 +580 725 0:60 / /sys/firmware ro,relatime - tmpfs tmpfs ro,inode64 +''' # noqa: E501 + +PODMAN_CGROUPS_V1_MOUNTINFO_EXAMPLE = b'''\ +1200 915 0:57 / / rw,relatime - overlay overlay rw,lowerdir=/home/asottile/.local/share/containers/storage/overlay/l/ZWAU3VY3ZHABQJRBUAFPBX7R5D,upperdir=/home/asottile/.local/share/containers/storage/overlay/72504ef163fda63838930450553b7306412ccad139a007626732b3dc43af5200/diff,workdir=/home/asottile/.local/share/containers/storage/overlay/72504ef163fda63838930450553b7306412ccad139a007626732b3dc43af5200/work,volatile,userxattr +1204 1200 0:62 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +1205 1200 0:63 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,uid=1000,gid=1000,inode64 +1206 1200 0:64 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs rw +1207 1205 0:65 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=100004,mode=620,ptmxmode=666 +1208 1205 0:61 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +1209 1200 0:53 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/.containerenv /run/.containerenv rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=814036k,mode=700,uid=1000,gid=1000,inode64 +1210 1200 0:53 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/resolv.conf /etc/resolv.conf rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=814036k,mode=700,uid=1000,gid=1000,inode64 +1211 1200 0:53 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/hosts /etc/hosts rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=814036k,mode=700,uid=1000,gid=1000,inode64 +1212 1205 0:56 / /dev/shm rw,relatime - tmpfs shm rw,size=64000k,uid=1000,gid=1000,inode64 +1213 1200 0:53 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/hostname /etc/hostname rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=814036k,mode=700,uid=1000,gid=1000,inode64 +1214 1206 0:66 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs cgroup rw,size=1024k,uid=1000,gid=1000,inode64 +1215 1214 0:43 / /sys/fs/cgroup/freezer ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,freezer +1216 1214 0:42 /user.slice /sys/fs/cgroup/devices ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,devices +1217 1214 0:41 / /sys/fs/cgroup/hugetlb ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,hugetlb +1218 1214 0:40 / /sys/fs/cgroup/misc ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,misc +1219 1214 0:39 / /sys/fs/cgroup/blkio ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,blkio +1220 1214 0:38 / /sys/fs/cgroup/net_cls,net_prio ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,net_cls,net_prio +1221 1214 0:37 / /sys/fs/cgroup/perf_event ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,perf_event +1222 1214 0:36 /user.slice/user-1000.slice/user@1000.service /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,memory +1223 1214 0:35 /user.slice/user-1000.slice/user@1000.service /sys/fs/cgroup/pids ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,pids +1224 1214 0:34 / /sys/fs/cgroup/cpuset ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpuset +1225 1214 0:33 / /sys/fs/cgroup/cpu,cpuacct ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpu,cpuacct +1226 1214 0:32 / /sys/fs/cgroup/rdma ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,rdma +1227 1214 0:29 /user.slice/user-1000.slice/user@1000.service/apps.slice/apps-org.gnome.Terminal.slice/vte-spawn-0c50448e-b395-4d76-8b92-379f16e5066f.scope /sys/fs/cgroup/systemd ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,xattr,name=systemd +1228 1205 0:5 /null /dev/null rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1229 1205 0:5 /zero /dev/zero rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1230 1205 0:5 /full /dev/full rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1231 1205 0:5 /tty /dev/tty rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1232 1205 0:5 /random /dev/random rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1233 1205 0:5 /urandom /dev/urandom rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1234 1204 0:67 / /proc/acpi ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +1235 1204 0:5 /null /proc/kcore rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1236 1204 0:5 /null /proc/keys rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1237 1204 0:5 /null /proc/timer_list rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1238 1204 0:68 / /proc/scsi ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +1239 1206 0:69 / /sys/firmware ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +1240 1206 0:70 / /sys/dev/block ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +1241 1204 0:62 /asound /proc/asound ro,relatime - proc proc rw +1242 1204 0:62 /bus /proc/bus ro,relatime - proc proc rw +1243 1204 0:62 /fs /proc/fs ro,relatime - proc proc rw +1244 1204 0:62 /irq /proc/irq ro,relatime - proc proc rw +1245 1204 0:62 /sys /proc/sys ro,relatime - proc proc rw +1256 1204 0:62 /sysrq-trigger /proc/sysrq-trigger ro,relatime - proc proc rw +916 1205 0:65 /0 /dev/console rw,relatime - devpts devpts rw,gid=100004,mode=620,ptmxmode=666 +''' # noqa: E501 + +PODMAN_CGROUPS_V2_MOUNTINFO_EXAMPLE = b'''\ +685 690 0:63 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/resolv.conf /etc/resolv.conf rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=1637624k,nr_inodes=409406,mode=700,uid=1000,gid=1000,inode64 +686 690 0:63 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/hosts /etc/hosts rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=1637624k,nr_inodes=409406,mode=700,uid=1000,gid=1000,inode64 +687 692 0:50 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=64000k,uid=1000,gid=1000,inode64 +688 690 0:63 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/.containerenv /run/.containerenv rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=1637624k,nr_inodes=409406,mode=700,uid=1000,gid=1000,inode64 +689 690 0:63 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/hostname /etc/hostname rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=1637624k,nr_inodes=409406,mode=700,uid=1000,gid=1000,inode64 +690 546 0:55 / / rw,relatime - overlay overlay rw,lowerdir=/home/asottile/.local/share/containers/storage/overlay/l/NPOHYOD3PI3YW6TQSGBOVOUSK6,upperdir=/home/asottile/.local/share/containers/storage/overlay/565c206fb79f876ffd5f069b8bd7a97fb5e47d5d07396b0c395a4ed6725d4a8e/diff,workdir=/home/asottile/.local/share/containers/storage/overlay/565c206fb79f876ffd5f069b8bd7a97fb5e47d5d07396b0c395a4ed6725d4a8e/work,redirect_dir=nofollow,uuid=on,volatile,userxattr +691 690 0:59 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +692 690 0:61 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,uid=1000,gid=1000,inode64 +693 690 0:62 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs rw +694 692 0:66 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=100004,mode=620,ptmxmode=666 +695 692 0:58 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +696 693 0:28 / /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup2 rw,nsdelegate,memory_recursiveprot +698 692 0:6 /null /dev/null rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +699 692 0:6 /zero /dev/zero rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +700 692 0:6 /full /dev/full rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +701 692 0:6 /tty /dev/tty rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +702 692 0:6 /random /dev/random rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +703 692 0:6 /urandom /dev/urandom rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +704 691 0:67 / /proc/acpi ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +705 691 0:6 /null /proc/kcore ro,nosuid,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +706 691 0:6 /null /proc/keys ro,nosuid,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +707 691 0:6 /null /proc/latency_stats ro,nosuid,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +708 691 0:6 /null /proc/timer_list ro,nosuid,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +709 691 0:68 / /proc/scsi ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +710 693 0:69 / /sys/firmware ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +711 693 0:70 / /sys/dev/block ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +712 693 0:71 / /sys/devices/virtual/powercap ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +713 691 0:59 /asound /proc/asound ro,nosuid,nodev,noexec,relatime - proc proc rw +714 691 0:59 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +715 691 0:59 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +716 691 0:59 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +717 691 0:59 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +718 691 0:59 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +547 692 0:66 /0 /dev/console rw,relatime - devpts devpts rw,gid=100004,mode=620,ptmxmode=666 ''' # noqa: E501 # The ID should match the above cgroup example. CONTAINER_ID = 'c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7' # noqa: E501 -NON_DOCKER_CGROUP_EXAMPLE = b'''\ -12:perf_event:/ -11:hugetlb:/ -10:devices:/ -9:blkio:/ -8:rdma:/ -7:cpuset:/ -6:cpu,cpuacct:/ -5:freezer:/ -4:memory:/ -3:pids:/ -2:net_cls,net_prio:/ -1:name=systemd:/init.scope -0::/init.scope -''' +NON_DOCKER_MOUNTINFO_EXAMPLE = b'''\ +21 27 0:19 / /sys rw,nosuid,nodev,noexec,relatime shared:7 - sysfs sysfs rw +22 27 0:20 / /proc rw,nosuid,nodev,noexec,relatime shared:14 - proc proc rw +23 27 0:5 / /dev rw,nosuid,relatime shared:2 - devtmpfs udev rw,size=10219484k,nr_inodes=2554871,mode=755,inode64 +24 23 0:21 / /dev/pts rw,nosuid,noexec,relatime shared:3 - devpts devpts rw,gid=5,mode=620,ptmxmode=000 +25 27 0:22 / /run rw,nosuid,nodev,noexec,relatime shared:5 - tmpfs tmpfs rw,size=2047768k,mode=755,inode64 +27 1 8:2 / / rw,relatime shared:1 - ext4 /dev/sda2 rw,errors=remount-ro +28 21 0:6 / /sys/kernel/security rw,nosuid,nodev,noexec,relatime shared:8 - securityfs securityfs rw +29 23 0:24 / /dev/shm rw,nosuid,nodev shared:4 - tmpfs tmpfs rw,inode64 +30 25 0:25 / /run/lock rw,nosuid,nodev,noexec,relatime shared:6 - tmpfs tmpfs rw,size=5120k,inode64 +''' # noqa: E501 def test_docker_fallback_user(): @@ -99,9 +232,9 @@ def test_docker_user_non_rootless(info_ret): assert docker.get_docker_user() != () -def test_in_docker_no_file(): +def test_container_id_no_file(): with mock.patch.object(builtins, 'open', side_effect=FileNotFoundError): - assert docker._is_in_docker() is False + assert docker._get_container_id() is None def _mock_open(data): @@ -113,38 +246,33 @@ def _mock_open(data): ) -def test_in_docker_docker_in_file(): - with _mock_open(DOCKER_CGROUP_EXAMPLE): - assert docker._is_in_docker() is True - - -def test_in_docker_docker_not_in_file(): - with _mock_open(NON_DOCKER_CGROUP_EXAMPLE): - assert docker._is_in_docker() is False +def test_container_id_not_in_file(): + with _mock_open(NON_DOCKER_MOUNTINFO_EXAMPLE): + assert docker._get_container_id() is None def test_get_container_id(): - with _mock_open(DOCKER_CGROUP_EXAMPLE): + with _mock_open(DOCKER_CGROUPS_V1_MOUNTINFO_EXAMPLE): + assert docker._get_container_id() == CONTAINER_ID + with _mock_open(DOCKER_CGROUPS_V2_MOUNTINFO_EXAMPLE): + assert docker._get_container_id() == CONTAINER_ID + with _mock_open(PODMAN_CGROUPS_V1_MOUNTINFO_EXAMPLE): + assert docker._get_container_id() == CONTAINER_ID + with _mock_open(PODMAN_CGROUPS_V2_MOUNTINFO_EXAMPLE): assert docker._get_container_id() == CONTAINER_ID -def test_get_container_id_failure(): - with _mock_open(b''), pytest.raises(RuntimeError): - docker._get_container_id() - - def test_get_docker_path_not_in_docker_returns_same(): - with mock.patch.object(docker, '_is_in_docker', return_value=False): + with _mock_open(b''): assert docker._get_docker_path('abc') == 'abc' @pytest.fixture def in_docker(): - with mock.patch.object(docker, '_is_in_docker', return_value=True): - with mock.patch.object( - docker, '_get_container_id', return_value=CONTAINER_ID, - ): - yield + with mock.patch.object( + docker, '_get_container_id', return_value=CONTAINER_ID, + ): + yield def _linux_commonpath(): From 17cf8864737af2ce75c73839a0cdedc26ce50598 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 8 Nov 2025 16:11:43 -0500 Subject: [PATCH 34/48] v4.4.0 --- CHANGELOG.md | 28 ++++++++++++++++++++++++++-- setup.cfg | 2 +- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42a63f78..b27af5e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,27 @@ +4.4.0 - 2025-11-08 +================== + +### Features +- Add `--fail-fast` option to `pre-commit run`. + - #3528 PR by @JulianMaurin. +- Upgrade `ruby-build` / `rbenv`. + - #3566 PR by @asottile. + - #3565 issue by @MRigal. +- Add `language: unsupported` / `language: unsupported_script` as aliases + for `language: system` / `language: script` (which will eventually be + deprecated). + - #3577 PR by @asottile. +- Add support docker-in-docker detection for cgroups v2. + - #3535 PR by @br-rhrbacek. + - #3360 issue by @JasonAlt. + +### Fixes +- Handle when docker gives `SecurityOptions: null`. + - #3537 PR by @asottile. + - #3514 issue by @jenstroeger. +- Fix error context for invalid `stages` in `.pre-commit-config.yaml`. + - #3576 PR by @asottile. + 4.3.0 - 2025-08-09 ================== @@ -71,7 +95,7 @@ - #3315 PR by @asottile. - #2732 issue by @asottile. -### Migrating +### Updating - `language: python_venv` has been removed -- use `language: python` instead. - #3320 PR by @asottile. - #2734 issue by @asottile. @@ -159,7 +183,7 @@ - Use `time.monotonic()` for more accurate hook timing. - #3024 PR by @adamchainz. -### Migrating +### Updating - Require npm 6.x+ for `language: node` hooks. - #2996 PR by @RoelAdriaans. - #1983 issue by @henryiii. diff --git a/setup.cfg b/setup.cfg index 17c3fe0e..be031c3e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.3.0 +version = 4.4.0 description = A framework for managing and maintaining multi-language pre-commit hooks. long_description = file: README.md long_description_content_type = text/markdown From d5c273a2ba0c712659640e9487adb38bd7da68f6 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 9 Nov 2025 16:57:40 -0500 Subject: [PATCH 35/48] refactor gc into store this will make refactoring this easier later and limits the api surface of Store --- pre_commit/commands/gc.py | 82 +-------------------------------- pre_commit/store.py | 96 +++++++++++++++++++++++++++++++-------- tests/commands/gc_test.py | 9 ++-- tests/store_test.py | 25 +++++++--- 4 files changed, 101 insertions(+), 111 deletions(-) diff --git a/pre_commit/commands/gc.py b/pre_commit/commands/gc.py index 6892e097..d1941e4b 100644 --- a/pre_commit/commands/gc.py +++ b/pre_commit/commands/gc.py @@ -1,89 +1,9 @@ from __future__ import annotations -import os.path -from typing import Any - -import pre_commit.constants as C from pre_commit import output -from pre_commit.clientlib import InvalidConfigError -from pre_commit.clientlib import InvalidManifestError -from pre_commit.clientlib import load_config -from pre_commit.clientlib import load_manifest -from pre_commit.clientlib import LOCAL -from pre_commit.clientlib import META from pre_commit.store import Store -def _mark_used_repos( - store: Store, - all_repos: dict[tuple[str, str], str], - unused_repos: set[tuple[str, str]], - repo: dict[str, Any], -) -> None: - if repo['repo'] == META: - return - elif repo['repo'] == LOCAL: - for hook in repo['hooks']: - deps = hook.get('additional_dependencies') - unused_repos.discard(( - store.db_repo_name(repo['repo'], deps), C.LOCAL_REPO_VERSION, - )) - else: - key = (repo['repo'], repo['rev']) - path = all_repos.get(key) - # can't inspect manifest if it isn't cloned - if path is None: - return - - try: - manifest = load_manifest(os.path.join(path, C.MANIFEST_FILE)) - except InvalidManifestError: - return - else: - unused_repos.discard(key) - by_id = {hook['id']: hook for hook in manifest} - - for hook in repo['hooks']: - if hook['id'] not in by_id: - continue - - deps = hook.get( - 'additional_dependencies', - by_id[hook['id']]['additional_dependencies'], - ) - unused_repos.discard(( - store.db_repo_name(repo['repo'], deps), repo['rev'], - )) - - -def _gc_repos(store: Store) -> int: - configs = store.select_all_configs() - repos = store.select_all_repos() - - # delete config paths which do not exist - dead_configs = [p for p in configs if not os.path.exists(p)] - live_configs = [p for p in configs if os.path.exists(p)] - - all_repos = {(repo, ref): path for repo, ref, path in repos} - unused_repos = set(all_repos) - for config_path in live_configs: - try: - config = load_config(config_path) - except InvalidConfigError: - dead_configs.append(config_path) - continue - else: - for repo in config['repos']: - _mark_used_repos(store, all_repos, unused_repos, repo) - - store.delete_configs(dead_configs) - for db_repo_name, ref in unused_repos: - store.delete_repo(db_repo_name, ref, all_repos[(db_repo_name, ref)]) - return len(unused_repos) - - def gc(store: Store) -> int: - with store.exclusive_lock(): - repos_removed = _gc_repos(store) - output.write_line(f'{repos_removed} repo(s) removed.') + output.write_line(f'{store.gc()} repo(s) removed.') return 0 diff --git a/pre_commit/store.py b/pre_commit/store.py index 9e3b4048..34c5f0d9 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -8,6 +8,7 @@ import tempfile from collections.abc import Callable from collections.abc import Generator from collections.abc import Sequence +from typing import Any import pre_commit.constants as C from pre_commit import clientlib @@ -96,7 +97,7 @@ class Store: ' PRIMARY KEY (repo, ref)' ');', ) - self._create_config_table(db) + self._create_configs_table(db) # Atomic file move os.replace(tmpfile, self.db_path) @@ -215,7 +216,7 @@ class Store: 'local', C.LOCAL_REPO_VERSION, deps, _make_local_repo, ) - def _create_config_table(self, db: sqlite3.Connection) -> None: + def _create_configs_table(self, db: sqlite3.Connection) -> None: db.executescript( 'CREATE TABLE IF NOT EXISTS configs (' ' path TEXT NOT NULL,' @@ -232,28 +233,83 @@ class Store: return with self.connect() as db: # TODO: eventually remove this and only create in _create - self._create_config_table(db) + self._create_configs_table(db) db.execute('INSERT OR IGNORE INTO configs VALUES (?)', (path,)) - def select_all_configs(self) -> list[str]: - with self.connect() as db: - self._create_config_table(db) - rows = db.execute('SELECT path FROM configs').fetchall() - return [path for path, in rows] + def _mark_used_repos( + self, + all_repos: dict[tuple[str, str], str], + unused_repos: set[tuple[str, str]], + repo: dict[str, Any], + ) -> None: + if repo['repo'] == clientlib.META: + return + elif repo['repo'] == clientlib.LOCAL: + for hook in repo['hooks']: + deps = hook.get('additional_dependencies') + unused_repos.discard(( + self.db_repo_name(repo['repo'], deps), + C.LOCAL_REPO_VERSION, + )) + else: + key = (repo['repo'], repo['rev']) + path = all_repos.get(key) + # can't inspect manifest if it isn't cloned + if path is None: + return - def delete_configs(self, configs: list[str]) -> None: - with self.connect() as db: - rows = [(path,) for path in configs] - db.executemany('DELETE FROM configs WHERE path = ?', rows) + try: + manifest = clientlib.load_manifest( + os.path.join(path, C.MANIFEST_FILE), + ) + except clientlib.InvalidManifestError: + return + else: + unused_repos.discard(key) + by_id = {hook['id']: hook for hook in manifest} - def select_all_repos(self) -> list[tuple[str, str, str]]: - with self.connect() as db: - return db.execute('SELECT repo, ref, path from repos').fetchall() + for hook in repo['hooks']: + if hook['id'] not in by_id: + continue - def delete_repo(self, db_repo_name: str, ref: str, path: str) -> None: - with self.connect() as db: - db.execute( + deps = hook.get( + 'additional_dependencies', + by_id[hook['id']]['additional_dependencies'], + ) + unused_repos.discard(( + self.db_repo_name(repo['repo'], deps), repo['rev'], + )) + + def gc(self) -> int: + with self.exclusive_lock(), self.connect() as db: + self._create_configs_table(db) + + repos = db.execute('SELECT repo, ref, path FROM repos').fetchall() + all_repos = {(repo, ref): path for repo, ref, path in repos} + unused_repos = set(all_repos) + + configs_rows = db.execute('SELECT path FROM configs').fetchall() + configs = [path for path, in configs_rows] + + dead_configs = [] + for config_path in configs: + try: + config = clientlib.load_config(config_path) + except clientlib.InvalidConfigError: + dead_configs.append(config_path) + continue + else: + for repo in config['repos']: + self._mark_used_repos(all_repos, unused_repos, repo) + + paths = [(path,) for path in dead_configs] + db.executemany('DELETE FROM configs WHERE path = ?', paths) + + db.executemany( 'DELETE FROM repos WHERE repo = ? and ref = ?', - (db_repo_name, ref), + sorted(unused_repos), ) - rmtree(path) + for k in unused_repos: + rmtree(all_repos[k]) + + return len(unused_repos) diff --git a/tests/commands/gc_test.py b/tests/commands/gc_test.py index 95113ed5..85e66977 100644 --- a/tests/commands/gc_test.py +++ b/tests/commands/gc_test.py @@ -19,11 +19,13 @@ from testing.util import git_commit def _repo_count(store): - return len(store.select_all_repos()) + with store.connect() as db: + return db.execute('SELECT COUNT(1) FROM repos').fetchone()[0] def _config_count(store): - return len(store.select_all_configs()) + with store.connect() as db: + return db.execute('SELECT COUNT(1) FROM configs').fetchone()[0] def _remove_config_assert_cleared(store, cap_out): @@ -153,7 +155,8 @@ def test_invalid_manifest_gcd(tempdir_factory, store, in_git_dir, cap_out): install_hooks(C.CONFIG_FILE, store) # we'll "break" the manifest to simulate an old version clone - (_, _, path), = store.select_all_repos() + with store.connect() as db: + path, = db.execute('SELECT path FROM repos').fetchone() os.remove(os.path.join(path, C.MANIFEST_FILE)) assert _config_count(store) == 1 diff --git a/tests/store_test.py b/tests/store_test.py index 7d4dffb0..4b04a8e7 100644 --- a/tests/store_test.py +++ b/tests/store_test.py @@ -22,6 +22,17 @@ from testing.util import git_commit from testing.util import xfailif_windows +def _select_all_configs(store: Store) -> list[str]: + with store.connect() as db: + rows = db.execute('SELECT * FROM configs').fetchall() + return [path for path, in rows] + + +def _select_all_repos(store: Store) -> list[tuple[str, str, str]]: + with store.connect() as db: + return db.execute('SELECT repo, ref, path FROM repos').fetchall() + + def test_our_session_fixture_works(): """There's a session fixture which makes `Store` invariantly raise to prevent writing to the home directory. @@ -91,7 +102,7 @@ def test_clone(store, tempdir_factory, caplog): assert git.head_rev(ret) == rev # Assert there's an entry in the sqlite db for this - assert store.select_all_repos() == [(path, rev, ret)] + assert _select_all_repos(store) == [(path, rev, ret)] def test_warning_for_deprecated_stages_on_init(store, tempdir_factory, caplog): @@ -217,7 +228,7 @@ def test_clone_shallow_failure_fallback_to_complete( assert git.head_rev(ret) == rev # Assert there's an entry in the sqlite db for this - assert store.select_all_repos() == [(path, rev, ret)] + assert _select_all_repos(store) == [(path, rev, ret)] def test_clone_tag_not_on_mainline(store, tempdir_factory): @@ -265,7 +276,7 @@ def test_mark_config_as_used(store, tmpdir): with tmpdir.as_cwd(): f = tmpdir.join('f').ensure() store.mark_config_used('f') - assert store.select_all_configs() == [f.strpath] + assert _select_all_configs(store) == [f.strpath] def test_mark_config_as_used_idempotent(store, tmpdir): @@ -275,7 +286,7 @@ def test_mark_config_as_used_idempotent(store, tmpdir): def test_mark_config_as_used_does_not_exist(store): store.mark_config_used('f') - assert store.select_all_configs() == [] + assert _select_all_configs(store) == [] def _simulate_pre_1_14_0(store): @@ -283,9 +294,9 @@ def _simulate_pre_1_14_0(store): db.executescript('DROP TABLE configs') -def test_select_all_configs_roll_forward(store): +def test_gc_roll_forward(store): _simulate_pre_1_14_0(store) - assert store.select_all_configs() == [] + assert store.gc() == 0 def test_mark_config_as_used_roll_forward(store, tmpdir): @@ -314,7 +325,7 @@ def test_mark_config_as_used_readonly(tmpdir): assert store.readonly # should be skipped due to readonly store.mark_config_used(str(cfg)) - assert store.select_all_configs() == [] + assert _select_all_configs(store) == [] def test_clone_with_recursive_submodules(store, tmp_path): From 063229aee77ba2da3e9ed5c8217070b4128234fd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 20:59:54 +0000 Subject: [PATCH 36/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/pyupgrade: v3.21.0 → v3.21.1](https://github.com/asottile/pyupgrade/compare/v3.21.0...v3.21.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fa077365..e47d56ca 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ repos: hooks: - id: add-trailing-comma - repo: https://github.com/asottile/pyupgrade - rev: v3.21.0 + rev: v3.21.1 hooks: - id: pyupgrade args: [--py310-plus] From 66278a9a0b69a69fde820d2b85a7e198eae52981 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Wed, 19 Nov 2025 14:29:50 -0500 Subject: [PATCH 37/48] move logic for gc back to commands.gc --- pre_commit/commands/gc.py | 91 ++++++++++++++++++++++++++++++++++++++- pre_commit/store.py | 80 ---------------------------------- tests/commands/gc_test.py | 8 ++++ tests/store_test.py | 13 +----- 4 files changed, 100 insertions(+), 92 deletions(-) diff --git a/pre_commit/commands/gc.py b/pre_commit/commands/gc.py index d1941e4b..975d5e4c 100644 --- a/pre_commit/commands/gc.py +++ b/pre_commit/commands/gc.py @@ -1,9 +1,98 @@ from __future__ import annotations +import os.path +from typing import Any + +import pre_commit.constants as C from pre_commit import output +from pre_commit.clientlib import InvalidConfigError +from pre_commit.clientlib import InvalidManifestError +from pre_commit.clientlib import load_config +from pre_commit.clientlib import load_manifest +from pre_commit.clientlib import LOCAL +from pre_commit.clientlib import META from pre_commit.store import Store +from pre_commit.util import rmtree + + +def _mark_used_repos( + store: Store, + all_repos: dict[tuple[str, str], str], + unused_repos: set[tuple[str, str]], + repo: dict[str, Any], +) -> None: + if repo['repo'] == META: + return + elif repo['repo'] == LOCAL: + for hook in repo['hooks']: + deps = hook.get('additional_dependencies') + unused_repos.discard(( + store.db_repo_name(repo['repo'], deps), + C.LOCAL_REPO_VERSION, + )) + else: + key = (repo['repo'], repo['rev']) + path = all_repos.get(key) + # can't inspect manifest if it isn't cloned + if path is None: + return + + try: + manifest = load_manifest(os.path.join(path, C.MANIFEST_FILE)) + except InvalidManifestError: + return + else: + unused_repos.discard(key) + by_id = {hook['id']: hook for hook in manifest} + + for hook in repo['hooks']: + if hook['id'] not in by_id: + continue + + deps = hook.get( + 'additional_dependencies', + by_id[hook['id']]['additional_dependencies'], + ) + unused_repos.discard(( + store.db_repo_name(repo['repo'], deps), repo['rev'], + )) + + +def _gc(store: Store) -> int: + with store.exclusive_lock(), store.connect() as db: + store._create_configs_table(db) + + repos = db.execute('SELECT repo, ref, path FROM repos').fetchall() + all_repos = {(repo, ref): path for repo, ref, path in repos} + unused_repos = set(all_repos) + + configs_rows = db.execute('SELECT path FROM configs').fetchall() + configs = [path for path, in configs_rows] + + dead_configs = [] + for config_path in configs: + try: + config = load_config(config_path) + except InvalidConfigError: + dead_configs.append(config_path) + continue + else: + for repo in config['repos']: + _mark_used_repos(store, all_repos, unused_repos, repo) + + paths = [(path,) for path in dead_configs] + db.executemany('DELETE FROM configs WHERE path = ?', paths) + + db.executemany( + 'DELETE FROM repos WHERE repo = ? and ref = ?', + sorted(unused_repos), + ) + for k in unused_repos: + rmtree(all_repos[k]) + + return len(unused_repos) def gc(store: Store) -> int: - output.write_line(f'{store.gc()} repo(s) removed.') + output.write_line(f'{_gc(store)} repo(s) removed.') return 0 diff --git a/pre_commit/store.py b/pre_commit/store.py index 34c5f0d9..dc90c051 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -8,7 +8,6 @@ import tempfile from collections.abc import Callable from collections.abc import Generator from collections.abc import Sequence -from typing import Any import pre_commit.constants as C from pre_commit import clientlib @@ -18,7 +17,6 @@ from pre_commit.util import CalledProcessError from pre_commit.util import clean_path_on_failure from pre_commit.util import cmd_output_b from pre_commit.util import resource_text -from pre_commit.util import rmtree logger = logging.getLogger('pre_commit') @@ -235,81 +233,3 @@ class Store: # TODO: eventually remove this and only create in _create self._create_configs_table(db) db.execute('INSERT OR IGNORE INTO configs VALUES (?)', (path,)) - - def _mark_used_repos( - self, - all_repos: dict[tuple[str, str], str], - unused_repos: set[tuple[str, str]], - repo: dict[str, Any], - ) -> None: - if repo['repo'] == clientlib.META: - return - elif repo['repo'] == clientlib.LOCAL: - for hook in repo['hooks']: - deps = hook.get('additional_dependencies') - unused_repos.discard(( - self.db_repo_name(repo['repo'], deps), - C.LOCAL_REPO_VERSION, - )) - else: - key = (repo['repo'], repo['rev']) - path = all_repos.get(key) - # can't inspect manifest if it isn't cloned - if path is None: - return - - try: - manifest = clientlib.load_manifest( - os.path.join(path, C.MANIFEST_FILE), - ) - except clientlib.InvalidManifestError: - return - else: - unused_repos.discard(key) - by_id = {hook['id']: hook for hook in manifest} - - for hook in repo['hooks']: - if hook['id'] not in by_id: - continue - - deps = hook.get( - 'additional_dependencies', - by_id[hook['id']]['additional_dependencies'], - ) - unused_repos.discard(( - self.db_repo_name(repo['repo'], deps), repo['rev'], - )) - - def gc(self) -> int: - with self.exclusive_lock(), self.connect() as db: - self._create_configs_table(db) - - repos = db.execute('SELECT repo, ref, path FROM repos').fetchall() - all_repos = {(repo, ref): path for repo, ref, path in repos} - unused_repos = set(all_repos) - - configs_rows = db.execute('SELECT path FROM configs').fetchall() - configs = [path for path, in configs_rows] - - dead_configs = [] - for config_path in configs: - try: - config = clientlib.load_config(config_path) - except clientlib.InvalidConfigError: - dead_configs.append(config_path) - continue - else: - for repo in config['repos']: - self._mark_used_repos(all_repos, unused_repos, repo) - - paths = [(path,) for path in dead_configs] - db.executemany('DELETE FROM configs WHERE path = ?', paths) - - db.executemany( - 'DELETE FROM repos WHERE repo = ? and ref = ?', - sorted(unused_repos), - ) - for k in unused_repos: - rmtree(all_repos[k]) - - return len(unused_repos) diff --git a/tests/commands/gc_test.py b/tests/commands/gc_test.py index 85e66977..992b02f3 100644 --- a/tests/commands/gc_test.py +++ b/tests/commands/gc_test.py @@ -165,3 +165,11 @@ def test_invalid_manifest_gcd(tempdir_factory, store, in_git_dir, cap_out): assert _config_count(store) == 1 assert _repo_count(store) == 0 assert cap_out.get().splitlines()[-1] == '1 repo(s) removed.' + + +def test_gc_pre_1_14_roll_forward(store, cap_out): + with store.connect() as db: # simulate pre-1.14.0 + db.executescript('DROP TABLE configs') + + assert not gc(store) + assert cap_out.get() == '0 repo(s) removed.\n' diff --git a/tests/store_test.py b/tests/store_test.py index 4b04a8e7..13f198ea 100644 --- a/tests/store_test.py +++ b/tests/store_test.py @@ -289,18 +289,9 @@ def test_mark_config_as_used_does_not_exist(store): assert _select_all_configs(store) == [] -def _simulate_pre_1_14_0(store): - with store.connect() as db: - db.executescript('DROP TABLE configs') - - -def test_gc_roll_forward(store): - _simulate_pre_1_14_0(store) - assert store.gc() == 0 - - def test_mark_config_as_used_roll_forward(store, tmpdir): - _simulate_pre_1_14_0(store) + with store.connect() as db: # simulate pre-1.14.0 + db.executescript('DROP TABLE configs') test_mark_config_as_used(store, tmpdir) From 844dacc168d68a32553ecf8a99178ab395fdb11e Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Wed, 19 Nov 2025 14:57:01 -0500 Subject: [PATCH 38/48] add forward-compat error message --- pre_commit/clientlib.py | 11 ++++++++++- tests/clientlib_test.py | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index eb0fd4d6..51f14d26 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -270,10 +270,19 @@ class InvalidManifestError(FatalError): pass +def _load_manifest_forward_compat(contents: str) -> object: + obj = yaml_load(contents) + if isinstance(obj, dict): + check_min_version('5') + raise AssertionError('unreachable') + else: + return obj + + load_manifest = functools.partial( cfgv.load_from_filename, schema=MANIFEST_SCHEMA, - load_strategy=yaml_load, + load_strategy=_load_manifest_forward_compat, exc_tp=InvalidManifestError, ) diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py index 93c698f7..2c42b80c 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -12,6 +12,8 @@ from pre_commit.clientlib import CONFIG_HOOK_DICT from pre_commit.clientlib import CONFIG_REPO_DICT from pre_commit.clientlib import CONFIG_SCHEMA from pre_commit.clientlib import DEFAULT_LANGUAGE_VERSION +from pre_commit.clientlib import InvalidManifestError +from pre_commit.clientlib import load_manifest from pre_commit.clientlib import MANIFEST_HOOK_DICT from pre_commit.clientlib import MANIFEST_SCHEMA from pre_commit.clientlib import META_HOOK_DICT @@ -588,3 +590,18 @@ def test_config_hook_stages_defaulting(): 'id': 'fake-hook', 'stages': ['commit-msg', 'pre-push', 'pre-commit', 'pre-merge-commit'], } + + +def test_manifest_v5_forward_compat(tmp_path): + manifest = tmp_path.joinpath('.pre-commit-hooks.yaml') + manifest.write_text('hooks: {}') + + with pytest.raises(InvalidManifestError) as excinfo: + load_manifest(manifest) + assert str(excinfo.value) == ( + f'\n' + f'==> File {manifest}\n' + f'=====> \n' + f'=====> pre-commit version 5 is required but version {C.VERSION} ' + f'is installed. Perhaps run `pip install --upgrade pre-commit`.' + ) From 8d34f95308fc4c14dea3d3e90153acfdaf55e2de Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Fri, 21 Nov 2025 15:09:41 -0500 Subject: [PATCH 39/48] use ExitStack instead of start + stop --- tests/main_test.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/main_test.py b/tests/main_test.py index 945349fa..325792d8 100644 --- a/tests/main_test.py +++ b/tests/main_test.py @@ -1,6 +1,7 @@ from __future__ import annotations import argparse +import contextlib import os.path from unittest import mock @@ -97,11 +98,9 @@ CMDS = tuple(fn.replace('_', '-') for fn in FNS) @pytest.fixture def mock_commands(): - mcks = {fn: mock.patch.object(main, fn).start() for fn in FNS} - ret = auto_namedtuple(**mcks) - yield ret - for mck in ret: - mck.stop() + with contextlib.ExitStack() as ctx: + mcks = {f: ctx.enter_context(mock.patch.object(main, f)) for f in FNS} + yield auto_namedtuple(**mcks) @pytest.fixture From bdf68790b78158268bbc8482f76491a61d75809a Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Fri, 21 Nov 2025 16:38:55 -0500 Subject: [PATCH 40/48] add pre-commit hazmat --- pre_commit/commands/hazmat.py | 95 +++++++++++++++++++++++++++++++++ pre_commit/lang_base.py | 6 ++- pre_commit/main.py | 10 +++- tests/commands/hazmat_test.py | 99 +++++++++++++++++++++++++++++++++++ tests/lang_base_test.py | 12 +++++ tests/main_test.py | 12 +++++ tests/repository_test.py | 11 ++++ 7 files changed, 243 insertions(+), 2 deletions(-) create mode 100644 pre_commit/commands/hazmat.py create mode 100644 tests/commands/hazmat_test.py diff --git a/pre_commit/commands/hazmat.py b/pre_commit/commands/hazmat.py new file mode 100644 index 00000000..01b27ce6 --- /dev/null +++ b/pre_commit/commands/hazmat.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +import argparse +import subprocess +from collections.abc import Sequence + +from pre_commit.parse_shebang import normalize_cmd + + +def add_parsers(parser: argparse.ArgumentParser) -> None: + subparsers = parser.add_subparsers(dest='tool') + + cd_parser = subparsers.add_parser( + 'cd', help='cd to a subdir and run the command', + ) + cd_parser.add_argument('subdir') + cd_parser.add_argument('cmd', nargs=argparse.REMAINDER) + + ignore_exit_code_parser = subparsers.add_parser( + 'ignore-exit-code', help='run the command but ignore the exit code', + ) + ignore_exit_code_parser.add_argument('cmd', nargs=argparse.REMAINDER) + + n1_parser = subparsers.add_parser( + 'n1', help='run the command once per filename', + ) + n1_parser.add_argument('cmd', nargs=argparse.REMAINDER) + + +def _cmd_filenames(cmd: tuple[str, ...]) -> tuple[ + tuple[str, ...], + tuple[str, ...], +]: + for idx, val in enumerate(reversed(cmd)): + if val == '--': + split = len(cmd) - idx + break + else: + raise SystemExit('hazmat entry must end with `--`') + + return cmd[:split - 1], cmd[split:] + + +def cd(subdir: str, cmd: tuple[str, ...]) -> int: + cmd, filenames = _cmd_filenames(cmd) + + prefix = f'{subdir}/' + new_filenames = [] + for filename in filenames: + if not filename.startswith(prefix): + raise SystemExit(f'unexpected file without {prefix=}: {filename}') + else: + new_filenames.append(filename.removeprefix(prefix)) + + cmd = normalize_cmd(cmd) + return subprocess.call((*cmd, *new_filenames), cwd=subdir) + + +def ignore_exit_code(cmd: tuple[str, ...]) -> int: + cmd = normalize_cmd(cmd) + subprocess.call(cmd) + return 0 + + +def n1(cmd: tuple[str, ...]) -> int: + cmd, filenames = _cmd_filenames(cmd) + cmd = normalize_cmd(cmd) + ret = 0 + for filename in filenames: + ret |= subprocess.call((*cmd, filename)) + return ret + + +def impl(args: argparse.Namespace) -> int: + args.cmd = tuple(args.cmd) + if args.tool == 'cd': + return cd(args.subdir, args.cmd) + elif args.tool == 'ignore-exit-code': + return ignore_exit_code(args.cmd) + elif args.tool == 'n1': + return n1(args.cmd) + else: + raise NotImplementedError(f'unexpected tool: {args.tool}') + + +def main(argv: Sequence[str] | None = None) -> int: + parser = argparse.ArgumentParser() + add_parsers(parser) + args = parser.parse_args(argv) + + return impl(args) + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/pre_commit/lang_base.py b/pre_commit/lang_base.py index 95be7b9b..198e9365 100644 --- a/pre_commit/lang_base.py +++ b/pre_commit/lang_base.py @@ -5,6 +5,7 @@ import os import random import re import shlex +import sys from collections.abc import Generator from collections.abc import Sequence from typing import Any @@ -171,7 +172,10 @@ def run_xargs( def hook_cmd(entry: str, args: Sequence[str]) -> tuple[str, ...]: - return (*shlex.split(entry), *args) + cmd = shlex.split(entry) + if cmd[:2] == ['pre-commit', 'hazmat']: + cmd = [sys.executable, '-m', 'pre_commit.commands.hazmat', *cmd[2:]] + return (*cmd, *args) def basic_run_hook( diff --git a/pre_commit/main.py b/pre_commit/main.py index c33fbfda..0c3eefda 100644 --- a/pre_commit/main.py +++ b/pre_commit/main.py @@ -10,6 +10,7 @@ import pre_commit.constants as C from pre_commit import clientlib from pre_commit import git from pre_commit.color import add_color_option +from pre_commit.commands import hazmat from pre_commit.commands.autoupdate import autoupdate from pre_commit.commands.clean import clean from pre_commit.commands.gc import gc @@ -41,7 +42,7 @@ os.environ.pop('__PYVENV_LAUNCHER__', None) os.environ.pop('PYTHONEXECUTABLE', None) COMMANDS_NO_GIT = { - 'clean', 'gc', 'init-templatedir', 'sample-config', + 'clean', 'gc', 'hazmat', 'init-templatedir', 'sample-config', 'validate-config', 'validate-manifest', } @@ -245,6 +246,11 @@ def main(argv: Sequence[str] | None = None) -> int: _add_cmd('gc', help='Clean unused cached repos.') + hazmat_parser = _add_cmd( + 'hazmat', help='Composable tools for rare use in hook `entry`.', + ) + hazmat.add_parsers(hazmat_parser) + init_templatedir_parser = _add_cmd( 'init-templatedir', help=( @@ -389,6 +395,8 @@ def main(argv: Sequence[str] | None = None) -> int: return clean(store) elif args.command == 'gc': return gc(store) + elif args.command == 'hazmat': + return hazmat.impl(args) elif args.command == 'hook-impl': return hook_impl( store, diff --git a/tests/commands/hazmat_test.py b/tests/commands/hazmat_test.py new file mode 100644 index 00000000..df957e36 --- /dev/null +++ b/tests/commands/hazmat_test.py @@ -0,0 +1,99 @@ +from __future__ import annotations + +import sys + +import pytest + +from pre_commit.commands.hazmat import _cmd_filenames +from pre_commit.commands.hazmat import main +from testing.util import cwd + + +def test_cmd_filenames_no_dash_dash(): + with pytest.raises(SystemExit) as excinfo: + _cmd_filenames(('no', 'dashdash', 'here')) + msg, = excinfo.value.args + assert msg == 'hazmat entry must end with `--`' + + +def test_cmd_filenames_no_filenames(): + cmd, filenames = _cmd_filenames(('hello', 'world', '--')) + assert cmd == ('hello', 'world') + assert filenames == () + + +def test_cmd_filenames_some_filenames(): + cmd, filenames = _cmd_filenames(('hello', 'world', '--', 'f1', 'f2')) + assert cmd == ('hello', 'world') + assert filenames == ('f1', 'f2') + + +def test_cmd_filenames_multiple_dashdash(): + cmd, filenames = _cmd_filenames(('hello', '--', 'arg', '--', 'f1', 'f2')) + assert cmd == ('hello', '--', 'arg') + assert filenames == ('f1', 'f2') + + +def test_cd_unexpected_filename(): + with pytest.raises(SystemExit) as excinfo: + main(('cd', 'subdir', 'cmd', '--', 'subdir/1', 'not-subdir/2')) + msg, = excinfo.value.args + assert msg == "unexpected file without prefix='subdir/': not-subdir/2" + + +def _norm(out): + return out.replace('\r\n', '\n') + + +def test_cd(tmp_path, capfd): + subdir = tmp_path.joinpath('subdir') + subdir.mkdir() + subdir.joinpath('a').write_text('a') + subdir.joinpath('b').write_text('b') + + with cwd(tmp_path): + ret = main(( + 'cd', 'subdir', + sys.executable, '-c', + 'import os; print(os.getcwd());' + 'import sys; [print(open(f).read()) for f in sys.argv[1:]]', + '--', + 'subdir/a', 'subdir/b', + )) + + assert ret == 0 + out, err = capfd.readouterr() + assert _norm(out) == f'{subdir}\na\nb\n' + assert err == '' + + +def test_ignore_exit_code(capfd): + ret = main(( + 'ignore-exit-code', sys.executable, '-c', 'raise SystemExit("bye")', + )) + assert ret == 0 + out, err = capfd.readouterr() + assert out == '' + assert _norm(err) == 'bye\n' + + +def test_n1(capfd): + ret = main(( + 'n1', sys.executable, '-c', 'import sys; print(sys.argv[1:])', + '--', + 'foo', 'bar', 'baz', + )) + assert ret == 0 + out, err = capfd.readouterr() + assert _norm(out) == "['foo']\n['bar']\n['baz']\n" + assert err == '' + + +def test_n1_some_error_code(): + ret = main(( + 'n1', sys.executable, '-c', + 'import sys; raise SystemExit(sys.argv[1] == "error")', + '--', + 'ok', 'error', 'ok', + )) + assert ret == 1 diff --git a/tests/lang_base_test.py b/tests/lang_base_test.py index da289aef..9fac83da 100644 --- a/tests/lang_base_test.py +++ b/tests/lang_base_test.py @@ -164,3 +164,15 @@ def test_basic_run_hook(tmp_path): assert ret == 0 out = out.replace(b'\r\n', b'\n') assert out == b'hi hello file file file\n' + + +def test_hook_cmd(): + assert lang_base.hook_cmd('echo hi', ()) == ('echo', 'hi') + + +def test_hook_cmd_hazmat(): + ret = lang_base.hook_cmd('pre-commit hazmat cd a echo -- b', ()) + assert ret == ( + sys.executable, '-m', 'pre_commit.commands.hazmat', + 'cd', 'a', 'echo', '--', 'b', + ) diff --git a/tests/main_test.py b/tests/main_test.py index 945349fa..eb9ea18d 100644 --- a/tests/main_test.py +++ b/tests/main_test.py @@ -8,6 +8,7 @@ import pytest import pre_commit.constants as C from pre_commit import main +from pre_commit.commands import hazmat from pre_commit.errors import FatalError from pre_commit.util import cmd_output from testing.auto_namedtuple import auto_namedtuple @@ -158,6 +159,17 @@ def test_all_cmds(command, mock_commands, mock_store_dir): assert_only_one_mock_called(mock_commands) +def test_hazmat(mock_store_dir): + with mock.patch.object(hazmat, 'impl') as mck: + main.main(('hazmat', 'cd', 'subdir', '--', 'cmd', '--', 'f1', 'f2')) + assert mck.call_count == 1 + (arg,), dct = mck.call_args + assert dct == {} + assert arg.tool == 'cd' + assert arg.subdir == 'subdir' + assert arg.cmd == ['cmd', '--', 'f1', 'f2'] + + def test_try_repo(mock_store_dir): with mock.patch.object(main, 'try_repo') as patch: main.main(('try-repo', '.')) diff --git a/tests/repository_test.py b/tests/repository_test.py index b1c7a002..5d71c3e4 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -506,3 +506,14 @@ def test_args_with_spaces_and_quotes(tmp_path): expected = b"['i have spaces', 'and\"\\'quotes', '$and !this']\n" assert ret == (0, expected) + + +def test_hazmat(tmp_path): + ret = run_language( + tmp_path, unsupported, + f'pre-commit hazmat ignore-exit-code {shlex.quote(sys.executable)} ' + f"-c 'import sys; raise SystemExit(sys.argv[1:])'", + ('f1', 'f2'), + ) + expected = b"['f1', 'f2']\n" + assert ret == (0, expected) From 1af6c8fa9502336c6977c2ff3e79185bd97a6e57 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 22 Nov 2025 16:02:16 -0500 Subject: [PATCH 41/48] v4.5.0 --- CHANGELOG.md | 7 +++++++ setup.cfg | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b27af5e7..1434728d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +4.5.0 - 2025-11-22 +================== + +### Features +- Add `pre-commit hazmat`. + - #3585 PR by @asottile. + 4.4.0 - 2025-11-08 ================== diff --git a/setup.cfg b/setup.cfg index be031c3e..00c71759 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.4.0 +version = 4.5.0 description = A framework for managing and maintaining multi-language pre-commit hooks. long_description = file: README.md long_description_content_type = text/markdown From 8ea2b790d817088444b2328ff6cfe6742260070f Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 22 Nov 2025 16:06:27 -0500 Subject: [PATCH 42/48] remove sha256 file from zipapp script github displays the checksum for us now! --- testing/zipapp/make | 3 --- 1 file changed, 3 deletions(-) diff --git a/testing/zipapp/make b/testing/zipapp/make index 165046f6..43bb4373 100755 --- a/testing/zipapp/make +++ b/testing/zipapp/make @@ -107,9 +107,6 @@ def main() -> int: shebang = '/usr/bin/env python3' zipapp.create_archive(tmpdir, filename, interpreter=shebang) - with open(f'{filename}.sha256sum', 'w') as f: - subprocess.check_call(('sha256sum', filename), stdout=f) - return 0 From 465192d7de58d569776eaaa818c94cb2b962d436 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 20:53:38 +0000 Subject: [PATCH 43/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/pyupgrade: v3.21.1 → v3.21.2](https://github.com/asottile/pyupgrade/compare/v3.21.1...v3.21.2) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e47d56ca..50893030 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ repos: hooks: - id: add-trailing-comma - repo: https://github.com/asottile/pyupgrade - rev: v3.21.1 + rev: v3.21.2 hooks: - id: pyupgrade args: [--py310-plus] From 48953556d06f8cdb4248002c1a0044e69e0916b3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 21:05:15 +0000 Subject: [PATCH 44/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.18.2 → v1.19.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.18.2...v1.19.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 50893030..cedeae5e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.18.2 + rev: v1.19.0 hooks: - id: mypy additional_dependencies: [types-pyyaml] From c251e6b6d011b3b262339dc8e109de29b0ff8db1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 20:48:45 +0000 Subject: [PATCH 45/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.19.0 → v1.19.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.19.0...v1.19.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cedeae5e..83ff03f3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.19.0 + rev: v1.19.1 hooks: - id: mypy additional_dependencies: [types-pyyaml] From 51592eececd13b99c40ec477ad8f810799147227 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 16 Dec 2025 15:45:01 -0500 Subject: [PATCH 46/48] fix python local template when artifact dirs are present --- pre_commit/resources/empty_template_setup.py | 2 +- tests/languages/python_test.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/pre_commit/resources/empty_template_setup.py b/pre_commit/resources/empty_template_setup.py index ef05eef8..e8b1ff02 100644 --- a/pre_commit/resources/empty_template_setup.py +++ b/pre_commit/resources/empty_template_setup.py @@ -1,4 +1,4 @@ from setuptools import setup -setup(name='pre-commit-placeholder-package', version='0.0.0') +setup(name='pre-commit-placeholder-package', version='0.0.0', py_modules=[]) diff --git a/tests/languages/python_test.py b/tests/languages/python_test.py index 565525a4..593634b7 100644 --- a/tests/languages/python_test.py +++ b/tests/languages/python_test.py @@ -10,6 +10,8 @@ import pre_commit.constants as C from pre_commit.envcontext import envcontext from pre_commit.languages import python from pre_commit.prefix import Prefix +from pre_commit.store import _make_local_repo +from pre_commit.util import cmd_output_b from pre_commit.util import make_executable from pre_commit.util import win_exe from testing.auto_namedtuple import auto_namedtuple @@ -351,3 +353,15 @@ def test_python_hook_weird_setup_cfg(tmp_path): ret = run_language(tmp_path, python, 'socks', [os.devnull]) assert ret == (0, f'[{os.devnull!r}]\nhello hello\n'.encode()) + + +def test_local_repo_with_other_artifacts(tmp_path): + cmd_output_b('git', 'init', tmp_path) + _make_local_repo(str(tmp_path)) + # pretend a rust install also ran here + tmp_path.joinpath('target').mkdir() + + ret, out = run_language(tmp_path, python, 'python --version') + + assert ret == 0 + assert out.startswith(b'Python ') From 8a0630ca1aa7f6d5665effe674ebe2022af17919 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 16 Dec 2025 16:13:56 -0500 Subject: [PATCH 47/48] v4.5.1 --- CHANGELOG.md | 7 +++++++ setup.cfg | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1434728d..879ae073 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +4.5.1 - 2025-12-16 +================== + +### Fixes +- Fix `language: python` with `repo: local` without `additional_dependencies`. + - #3597 PR by @asottile. + 4.5.0 - 2025-11-22 ================== diff --git a/setup.cfg b/setup.cfg index 00c71759..a95ee447 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.5.0 +version = 4.5.1 description = A framework for managing and maintaining multi-language pre-commit hooks. long_description = file: README.md long_description_content_type = text/markdown From 37a879e65ee00d8375d12f053ef76e0024a0ed55 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 20:26:26 +0000 Subject: [PATCH 48/48] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/setup-cfg-fmt: v3.1.0 → v3.2.0](https://github.com/asottile/setup-cfg-fmt/compare/v3.1.0...v3.2.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 83ff03f3..3654066f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,7 +10,7 @@ repos: - id: name-tests-test - id: requirements-txt-fixer - repo: https://github.com/asottile/setup-cfg-fmt - rev: v3.1.0 + rev: v3.2.0 hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder-python-imports