From 9b9f8e254d46da65c8544244c423596d54260e24 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 6 Jan 2025 23:30:19 +0000 Subject: [PATCH 01/51] [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.0 → v1.14.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.14.0...v1.14.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 5743224e8..4a23da2bc 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.0 + rev: v1.14.1 hooks: - id: mypy additional_dependencies: [types-pyyaml] From c2c061cf63e00a3ff8c88a9054c47e96a36f2daa Mon Sep 17 00:00:00 2001 From: Lorenz Walthert Date: Sun, 19 Jan 2025 19:43:24 +0100 Subject: [PATCH 02/51] fix: ensure env patch is applied for vanilla emulation otherwise, installing the hooks when RENV_USER env variable is set (e.g. in RStudio with renv project) will result in executing the installation script in the wrong renv --- pre_commit/languages/r.py | 48 +++++++++++++++++++++++++++++---------- tests/languages/r_test.py | 2 +- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/pre_commit/languages/r.py b/pre_commit/languages/r.py index c75a30893..f70d2fdca 100644 --- a/pre_commit/languages/r.py +++ b/pre_commit/languages/r.py @@ -15,27 +15,50 @@ from pre_commit.envcontext import UNSET from pre_commit.prefix import Prefix from pre_commit.util import cmd_output -from pre_commit.util import cmd_output_b from pre_commit.util import win_exe ENVIRONMENT_DIR = 'renv' -RSCRIPT_OPTS = ('--no-save', '--no-restore', '--no-site-file', '--no-environ') get_default_version = lang_base.basic_get_default_version +_RENV_ACTIVATED_OPTS = ( + '--no-save', '--no-restore', '--no-site-file', '--no-environ', +) -def _execute_vanilla_r_code_as_script( + +def _execute_r( code: str, *, prefix: Prefix, version: str, args: Sequence[str] = (), cwd: str, + cli_opts: Sequence[str], ) -> str: with in_env(prefix, version), _r_code_in_tempfile(code) as f: _, out, _ = cmd_output( - _rscript_exec(), *RSCRIPT_OPTS, f, *args, cwd=cwd, + _rscript_exec(), *cli_opts, f, *args, cwd=cwd, ) return out.rstrip('\n') +def _execute_r_in_renv( + code: str, *, + prefix: Prefix, version: str, args: Sequence[str] = (), cwd: str, +) -> str: + return _execute_r( + code=code, prefix=prefix, version=version, args=args, cwd=cwd, + cli_opts=_RENV_ACTIVATED_OPTS, + ) + + +def _execute_vanilla_r( + code: str, *, + prefix: Prefix, version: str, args: Sequence[str] = (), cwd: str, +) -> str: + return _execute_r( + code=code, prefix=prefix, version=version, args=args, cwd=cwd, + cli_opts=('--vanilla',), + ) + + def _read_installed_version(envdir: str, prefix: Prefix, version: str) -> str: - return _execute_vanilla_r_code_as_script( + return _execute_r_in_renv( 'cat(renv::settings$r.version())', prefix=prefix, version=version, cwd=envdir, @@ -43,7 +66,7 @@ def _read_installed_version(envdir: str, prefix: Prefix, version: str) -> str: def _read_executable_version(envdir: str, prefix: Prefix, version: str) -> str: - return _execute_vanilla_r_code_as_script( + return _execute_r_in_renv( 'cat(as.character(getRversion()))', prefix=prefix, version=version, cwd=envdir, @@ -53,7 +76,7 @@ def _read_executable_version(envdir: str, prefix: Prefix, version: str) -> str: def _write_current_r_version( envdir: str, prefix: Prefix, version: str, ) -> None: - _execute_vanilla_r_code_as_script( + _execute_r_in_renv( 'renv::settings$r.version(as.character(getRversion()))', prefix=prefix, version=version, cwd=envdir, @@ -161,7 +184,7 @@ def _cmd_from_hook( _entry_validate(cmd) cmd_part = _prefix_if_file_entry(cmd, prefix, is_local=is_local) - return (cmd[0], *RSCRIPT_OPTS, *cmd_part, *args) + return (cmd[0], *_RENV_ACTIVATED_OPTS, *cmd_part, *args) def install_environment( @@ -204,14 +227,15 @@ def install_environment( renv::install(prefix_dir) }} """ - - with _r_code_in_tempfile(r_code_inst_environment) as f: - cmd_output_b(_rscript_exec(), '--vanilla', f, cwd=env_dir) + _execute_vanilla_r( + r_code_inst_environment, + prefix=prefix, version=version, cwd=env_dir, + ) _write_current_r_version(envdir=env_dir, prefix=prefix, version=version) if additional_dependencies: r_code_inst_add = 'renv::install(commandArgs(trailingOnly = TRUE))' - _execute_vanilla_r_code_as_script( + _execute_r_in_renv( code=r_code_inst_add, prefix=prefix, version=version, args=additional_dependencies, cwd=env_dir, diff --git a/tests/languages/r_test.py b/tests/languages/r_test.py index 10919e4a7..9e73129e1 100644 --- a/tests/languages/r_test.py +++ b/tests/languages/r_test.py @@ -286,7 +286,7 @@ def test_health_check_without_version(prefix, installed_environment, version): prefix, env_dir = installed_environment # simulate old pre-commit install by unsetting the installed version - r._execute_vanilla_r_code_as_script( + r._execute_r_in_renv( f'renv::settings$r.version({version})', prefix=prefix, version=C.DEFAULT, cwd=env_dir, ) From b152e922ef11a97efe22ca7dc4f90011f0d1711c Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 20 Jan 2025 13:35:33 -0500 Subject: [PATCH 03/51] v4.1.0 --- CHANGELOG.md | 18 ++++++++++++++++++ setup.cfg | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9b4c8c22..408afe68b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +4.1.0 - 2025-01-20 +================== + +### Features +- Add `language: julia`. + - #3348 PR by @fredrikekre. + - #2689 issue @jmuchovej. + +### Fixes +- Disable automatic toolchain switching for `language: golang`. + - #3304 PR by @AleksaC. + - #3300 issue by @AleksaC. + - #3149 issue by @nijel. +- Fix `language: r` installation when initiated by RStudio. + - #3389 PR by @lorenzwalthert. + - #3385 issue by @lorenzwalthert. + + 4.0.1 - 2024-10-08 ================== diff --git a/setup.cfg b/setup.cfg index 6936a1f0d..60d976418 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.0.1 +version = 4.1.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 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 04/51] [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 4a23da2bc..b73622927 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 05/51] 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 61293a0d8..fccf29892 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 2355b6620..7fda646ff 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 06/51] [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 b73622927..ead07d89e 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 07/51] [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 ead07d89e..b216fbd69 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 08/51] 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 19aac3872..2f424f89e 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 93f5a1c6e..02b6ce3ae 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 09/51] adjust python default_language_version to prefer versioned exe --- pre_commit/languages/python.py | 38 +++++++++++++------ tests/languages/python_test.py | 67 ++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 12 deletions(-) diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py index 0c4bb62db..88ececce6 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 _norm(path: str) -> 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 - - # Next try the `pythonX.X` executable - exe = f'python{sys.version_info[0]}.{sys.version_info[1]}' - if find_executable(exe): - return exe - - if _find_by_py_launcher(exe): - return exe + v_major = f'{sys.version_info[0]}' + v_minor = f'{sys.version_info[0]}.{sys.version_info[1]}' + + # attempt the likely implementation exe + for potential in (v_minor, v_major): + exe = f'{_impl_exe_name()}{potential}' + if find_executable(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 ab26e14e7..565525a40 100644 --- a/tests/languages/python_test.py +++ b/tests/languages/python_test.py @@ -12,6 +12,7 @@ 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 10/51] 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 408afe68b..b63f44317 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 60d976418..af34452df 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 11/51] [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 b216fbd69..a19b44bc5 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 12/51] [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 af34452df..90f49df9d 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 13/51] 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 4de1d5824..086e874d5 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 836382a8a..03235c46b 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -62,6 +62,42 @@ def invalid_attribute(): 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 @@ def test_docker_hook(tmp_path): 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 14/51] [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 a19b44bc5..97d1174d0 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 15/51] [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 97d1174d0..4ddf34061 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 16/51] [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 4ddf34061..2dc7f4c11 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 17/51] [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 2dc7f4c11..3ef94b45c 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 18/51] 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 df91c0697..7559b5ba6 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 4ea3c25b2..175622d65 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 19/51] [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 3ef94b45c..da8e24ad9 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 20/51] 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 3be6ffe36..8306aeb64 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 998b9d98f..3402c4212 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 5bb5aa68f..213d888eb 100644 --- a/tests/languages/dart_test.py +++ b/tests/languages/dart_test.py @@ -10,7 +10,7 @@ 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 21/51] 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 3402c4212..b4545e71e 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 22/51] 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 b63f44317..42a63f781 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 90f49df9d..9b0e02ad4 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 23/51] [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 da8e24ad9..464cfe600 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 24/51] 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 49a80b7b3..de5c8f346 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 793adbdb2..8ab505ffb 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 559c927c9..fc4531b82 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 08d52cbc3..1646ccd2a 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 50a20f377..e4af1e162 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 25/51] 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 559c927c9..b7ac3dc26 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 _add_cmd(name: str, *, help: str) -> argparse.ArgumentParser: ) _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 26/51] 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 086e874d5..d5ce1eb70 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 03235c46b..b830439a2 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 27/51] [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 464cfe600..0a24427f9 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 28/51] 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 fccf29892..be8963bac 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 7fda646ff..02b11ae28 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 0a24427f9..58b96f76f 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 c5d47a08e..b04c53a5e 100644 --- a/pre_commit/commands/migrate_config.py +++ b/pre_commit/commands/migrate_config.py @@ -3,7 +3,7 @@ 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 c840ad8b5..6223f869e 100644 --- a/pre_commit/file_lock.py +++ b/pre_commit/file_lock.py @@ -3,8 +3,8 @@ 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 678c04b14..bedbd114b 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 1235942c5..9e3b40485 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -5,9 +5,9 @@ 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 e199d0807..19b1880bf 100644 --- a/pre_commit/util.py +++ b/pre_commit/util.py @@ -8,10 +8,10 @@ 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 a1345b583..7c98d1674 100644 --- a/pre_commit/xargs.py +++ b/pre_commit/xargs.py @@ -7,12 +7,12 @@ 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 9b0e02ad4..8fb6e6aab 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 29/51] [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 58b96f76f..b1623a640 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 30/51] 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 2f424f89e..ec1928f37 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 8fb6e6aab..17c3fe0eb 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 31/51] 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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 B1~UKv 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 literal 93998 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 literal 88488 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 Date: Sat, 8 Nov 2025 13:16:33 -0500 Subject: [PATCH 32/51] 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 b2c347c14..000000000 --- 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 b54c910d3..f1559301f 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 33/51] 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 b1623a640..fa0773656 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 2c2370092..000000000 --- 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 8c9cda4c6..000000000 --- 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 9125dc1df..000000000 --- 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 34/51] 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 c0f736d92..51514bd36 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -116,11 +116,12 @@ def check(self, dct: dict[str, Any]) -> None: 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 7aa84af0e..2251abc4e 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 35/51] 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 ba569c377..166bc167f 100644 --- a/pre_commit/all_languages.py +++ b/pre_commit/all_languages.py @@ -19,9 +19,9 @@ 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 @@ '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 51514bd36..eb0fd4d68 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -6,6 +6,7 @@ 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 @@ def remove_default(self, dct: dict[str, Any]) -> None: 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 @@ def remove_default(self, dct: dict[str, Any]) -> None: 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 @@ def check(self, dct: dict[str, Any]) -> None: '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 @@ def check(self, dct: dict[str, Any]) -> None: 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 2251abc4e..93c698f79 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 dcd9cf1e0..000000000 --- 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 a02f615a9..b15b67e76 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 000000000..7f8461e02 --- /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 f1559301f..b1c7a0024 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -17,7 +17,7 @@ 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 36/51] Fix docker-in-docker detection for cgroups v2 --- pre_commit/languages/docker.py | 40 +++--- tests/languages/docker_test.py | 230 +++++++++++++++++++++++++-------- 2 files changed, 201 insertions(+), 69 deletions(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index d5ce1eb70..7f45ac865 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 @@ health_check = lang_base.basic_health_check in_env = lang_base.no_env # no special environment for docker +_HOSTNAME_MOUNT_RE = re.compile( + rb""" + /containers + (?:/overlay-containers)? + /([a-z0-9]{64}) + (?:/userdata)? + /hostname + """, + re.VERBOSE, +) -def _is_in_docker() -> bool: - try: - with open('/proc/1/cgroup', 'rb') as f: - return b'docker' in f.read() - except FileNotFoundError: - return False +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() -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.') + 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 b830439a2..e269976f7 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -14,40 +14,173 @@ 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 37/51] 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 42a63f781..b27af5e7e 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 17c3fe0eb..be031c3ef 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 38/51] 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 6892e097c..d1941e4bb 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 9e3b40485..34c5f0d92 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -8,6 +8,7 @@ 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 @@ def __init__(self, directory: str | None = None) -> None: ' 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 @@ def make_local(self, deps: Sequence[str]) -> str: '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 @@ def mark_config_used(self, path: str) -> None: 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 95113ed5c..85e66977e 100644 --- a/tests/commands/gc_test.py +++ b/tests/commands/gc_test.py @@ -19,11 +19,13 @@ 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 7d4dffb09..4b04a8e7f 100644 --- a/tests/store_test.py +++ b/tests/store_test.py @@ -22,6 +22,17 @@ 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 fake_shallow_clone(self, *args, **kwargs): 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 _chmod_minus_w(p): 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 39/51] [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 fa0773656..e47d56ca3 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 40/51] 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 d1941e4bb..975d5e4c1 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 34c5f0d92..dc90c0519 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -8,7 +8,6 @@ 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 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 @@ def mark_config_used(self, path: str) -> None: # 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 85e66977e..992b02f3b 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 4b04a8e7f..13f198ea2 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 41/51] 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 eb0fd4d68..51f14d26e 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 93c698f79..2c42b80cf 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -12,6 +12,8 @@ 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 42/51] 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 945349fa4..325792d89 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 @@ def test_adjust_args_try_repo_repo_relative(in_git_dir): @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 43/51] 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 000000000..01b27ce61 --- /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 95be7b9b3..198e93657 100644 --- a/pre_commit/lang_base.py +++ b/pre_commit/lang_base.py @@ -5,6 +5,7 @@ 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 c33fbfdaa..0c3eefdaa 100644 --- a/pre_commit/main.py +++ b/pre_commit/main.py @@ -10,6 +10,7 @@ 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('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 _add_cmd(name: str, *, help: str) -> argparse.ArgumentParser: _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 _add_cmd(name: str, *, help: str) -> argparse.ArgumentParser: 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 000000000..df957e36e --- /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 da289aef8..9fac83da2 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 945349fa4..eb9ea18d8 100644 --- a/tests/main_test.py +++ b/tests/main_test.py @@ -8,6 +8,7 @@ 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 b1c7a0024..5d71c3e4c 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 44/51] 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 b27af5e7e..1434728d0 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 be031c3ef..00c71759a 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 45/51] 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 165046f66..43bb4373f 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 46/51] [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 e47d56ca3..50893030f 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 47/51] [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 50893030f..cedeae5e8 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 48/51] [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 cedeae5e8..83ff03f3d 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 49/51] 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 ef05eef84..e8b1ff02c 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 565525a40..593634b79 100644 --- a/tests/languages/python_test.py +++ b/tests/languages/python_test.py @@ -10,6 +10,8 @@ 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 50/51] 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 1434728d0..879ae0731 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 00c71759a..a95ee4473 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 51/51] [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 83ff03f3d..3654066f4 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