From a768c038e3ac1a6bdf04f7f2c38e7e87bf6a57ee Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 20 Feb 2024 00:02:29 +0000 Subject: [PATCH 001/102] [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.15.0 → v3.15.1](https://github.com/asottile/pyupgrade/compare/v3.15.0...v3.15.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 9cbda101..c428788e 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.15.0 + rev: v3.15.1 hooks: - id: pyupgrade args: [--py39-plus] From e58009684cfc4842028e99d34837e2722af39b93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Lehmann?= Date: Wed, 7 Feb 2024 11:18:24 +0100 Subject: [PATCH 002/102] give docker a tty output when expecting color this makes the behavior more consistent with the system language and would help the executable run in a docker container to produce a colored output. --- pre_commit/languages/docker.py | 9 +++++++-- pre_commit/languages/docker_image.py | 2 +- tests/languages/docker_image_test.py | 24 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 26328515..4de1d582 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -108,10 +108,15 @@ def get_docker_user() -> tuple[str, ...]: # pragma: win32 no cover return () -def docker_cmd() -> tuple[str, ...]: # pragma: win32 no cover +def get_docker_tty(*, color: bool) -> tuple[str, ...]: # pragma: win32 no cover # noqa: E501 + return (('--tty',) if color else ()) + + +def docker_cmd(*, color: bool) -> tuple[str, ...]: # pragma: win32 no cover return ( 'docker', 'run', '--rm', + *get_docker_tty(color=color), *get_docker_user(), # https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container-volumes-from # The `Z` option tells Docker to label the content with a private @@ -139,7 +144,7 @@ def run_hook( entry_tag = ('--entrypoint', entry_exe, docker_tag(prefix)) return lang_base.run_xargs( - (*docker_cmd(), *entry_tag, *cmd_rest), + (*docker_cmd(color=color), *entry_tag, *cmd_rest), file_args, require_serial=require_serial, color=color, diff --git a/pre_commit/languages/docker_image.py b/pre_commit/languages/docker_image.py index a1a2c169..60caa101 100644 --- a/pre_commit/languages/docker_image.py +++ b/pre_commit/languages/docker_image.py @@ -23,7 +23,7 @@ def run_hook( require_serial: bool, color: bool, ) -> tuple[int, bytes]: # pragma: win32 no cover - cmd = docker_cmd() + lang_base.hook_cmd(entry, args) + cmd = docker_cmd(color=color) + lang_base.hook_cmd(entry, args) return lang_base.run_xargs( cmd, file_args, diff --git a/tests/languages/docker_image_test.py b/tests/languages/docker_image_test.py index 7993c11a..4e3a8789 100644 --- a/tests/languages/docker_image_test.py +++ b/tests/languages/docker_image_test.py @@ -25,3 +25,27 @@ def test_docker_image_hook_via_args(tmp_path): args=('hello hello world',), ) assert ret == (0, b'hello hello world\n') + + +@xfailif_windows # pragma: win32 no cover +def test_docker_image_color_tty(tmp_path): + ret = run_language( + tmp_path, + docker_image, + 'ubuntu:22.04', + args=('grep', '--color', 'root', '/etc/group'), + color=True, + ) + assert ret == (0, b'\x1b[01;31m\x1b[Kroot\x1b[m\x1b[K:x:0:\n') + + +@xfailif_windows # pragma: win32 no cover +def test_docker_image_no_color_no_tty(tmp_path): + ret = run_language( + tmp_path, + docker_image, + 'ubuntu:22.04', + args=('grep', '--color', 'root', '/etc/group'), + color=False, + ) + assert ret == (0, b'root:x:0:\n') From 75b3e52e57b5d6fc7bef10c131204edf196ae17a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 00:16:12 +0000 Subject: [PATCH 003/102] [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.8.0 → v1.9.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.8.0...v1.9.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 c428788e..229c0a8a 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.8.0 + rev: v1.9.0 hooks: - id: mypy additional_dependencies: [types-all] From 0939c11b4f0488ae3bff9b67aed67ea744189412 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 21:47:27 +0000 Subject: [PATCH 004/102] [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.0.4 → v2.1.0](https://github.com/hhatto/autopep8/compare/v2.0.4...v2.1.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 229c0a8a..8a0ad8d7 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.0.4 + rev: v2.1.0 hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 From fc622159a6c5cd31919ed2a22fa1c11d8ca56dbf Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 24 Mar 2024 13:17:00 -0400 Subject: [PATCH 005/102] fix per-hook fail_fast to not fail on previous failures --- pre_commit/commands/run.py | 2 +- tests/commands/run_test.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pre_commit/commands/run.py b/pre_commit/commands/run.py index 076f16d8..2a08dff0 100644 --- a/pre_commit/commands/run.py +++ b/pre_commit/commands/run.py @@ -298,7 +298,7 @@ def _run_hooks( verbose=args.verbose, use_color=args.color, ) retval |= current_retval - if retval and (config['fail_fast'] or hook.fail_fast): + if current_retval and (config['fail_fast'] or hook.fail_fast): break if retval and args.show_diff_on_failure and prior_diff: if args.all_files: diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py index e36a3ca9..50a20f37 100644 --- a/tests/commands/run_test.py +++ b/tests/commands/run_test.py @@ -1088,6 +1088,22 @@ def test_fail_fast_per_hook(cap_out, store, repo_with_failing_hook): assert printed.count(b'Failing hook') == 1 +def test_fail_fast_not_prev_failures(cap_out, store, repo_with_failing_hook): + with modify_config() as config: + config['repos'].append({ + 'repo': 'meta', + 'hooks': [ + {'id': 'identity', 'fail_fast': True}, + {'id': 'identity', 'name': 'run me!'}, + ], + }) + stage_a_file() + + ret, printed = _do_run(cap_out, store, repo_with_failing_hook, run_opts()) + # should still run the last hook since the `fail_fast` one didn't fail + assert printed.count(b'run me!') == 1 + + def test_classifier_removes_dne(): classifier = Classifier(('this_file_does_not_exist',)) assert classifier.filenames == [] From 7b4667e9e6e05e31707c404c95115b151745866c Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 24 Mar 2024 13:37:19 -0400 Subject: [PATCH 006/102] v3.7.0 --- CHANGELOG.md | 17 +++++++++++++++++ setup.cfg | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c2ee949..076e1631 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ +3.7.0 - 2024-03-24 +================== + +### Features +- Use a tty for `docker` and `docker_image` hooks when `--color` is specified. + - #3122 PR by @glehmann. + +### Fixes +- Fix `fail_fast` for individual hooks stopping when previous hooks had failed. + - #3167 issue by @tp832944. + - #3168 PR by @asottile. + +### Updating +- The per-hook behaviour of `fail_fast` was fixed. If you want the pre-3.7.0 + behaviour, add `fail_fast: true` to all hooks before the last `fail_fast` + hook. + 3.6.2 - 2024-02-18 ================== diff --git a/setup.cfg b/setup.cfg index a447bbb9..0e155601 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 3.6.2 +version = 3.7.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 4e121ef25c21a8caaca8304cc683e382cacd48f4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 21:31:39 +0000 Subject: [PATCH 007/102] [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.15.1 → v3.15.2](https://github.com/asottile/pyupgrade/compare/v3.15.1...v3.15.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 8a0ad8d7..9cd3b47b 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.15.1 + rev: v3.15.2 hooks: - id: pyupgrade args: [--py39-plus] From 74d05b444de75367eaf630e099f15aa51e060dc1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 22:08:29 +0000 Subject: [PATCH 008/102] [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: v4.5.0 → v4.6.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.5.0...v4.6.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 9cd3b47b..93f70f87 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: v4.5.0 + rev: v4.6.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer From 0d4c6da36e96443f05ae2d1f6c4e63d1a5d2b652 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 29 Apr 2024 21:05:41 -0400 Subject: [PATCH 009/102] adjust _handle_readonly for typeshed updates --- pre_commit/util.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pre_commit/util.py b/pre_commit/util.py index b3682d4f..b75c84a2 100644 --- a/pre_commit/util.py +++ b/pre_commit/util.py @@ -205,10 +205,11 @@ else: # pragma: no cover def _handle_readonly( func: Callable[[str], object], path: str, - exc: OSError, + exc: Exception, ) -> None: if ( func in (os.rmdir, os.remove, os.unlink) and + isinstance(exc, OSError) and exc.errno in {errno.EACCES, errno.EPERM} ): for p in (path, os.path.dirname(path)): @@ -222,7 +223,7 @@ if sys.version_info < (3, 12): # pragma: <3.12 cover def _handle_readonly_old( func: Callable[[str], object], path: str, - excinfo: tuple[type[OSError], OSError, TracebackType], + excinfo: tuple[type[Exception], Exception, TracebackType], ) -> None: return _handle_readonly(func, path, excinfo[1]) From 5c3d006443d616f5b9a717a43a6f3bce60381ddf Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 29 Apr 2024 21:28:16 -0400 Subject: [PATCH 010/102] use a simpler gem for testing additional_dependencies tins required building bigdecimal, whereas jmespath is self-contained --- tests/languages/ruby_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/languages/ruby_test.py b/tests/languages/ruby_test.py index 6397a434..5d767b25 100644 --- a/tests/languages/ruby_test.py +++ b/tests/languages/ruby_test.py @@ -91,8 +91,8 @@ def test_ruby_additional_deps(tmp_path): tmp_path, ruby, 'ruby -e', - args=('require "tins"',), - deps=('tins',), + args=('require "jmespath"',), + deps=('jmespath',), ) assert ret == (0, b'') From 0142f453224801138448584a8517927194865330 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 22:03:55 +0000 Subject: [PATCH 011/102] [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.9.0 → v1.10.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.9.0...v1.10.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 93f70f87..6caee40d 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.9.0 + rev: v1.10.0 hooks: - id: mypy additional_dependencies: [types-all] From 296f59266ec656fe46bf0d1b2bce6aac89476476 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Fri, 10 May 2024 17:06:29 -0400 Subject: [PATCH 012/102] determine rust default language version independent of rust-toolchain.toml --- pre_commit/languages/rust.py | 2 +- tests/languages/rust_test.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pre_commit/languages/rust.py b/pre_commit/languages/rust.py index 7b04d6c2..5f9db8fb 100644 --- a/pre_commit/languages/rust.py +++ b/pre_commit/languages/rust.py @@ -34,7 +34,7 @@ def get_default_version() -> str: # Just detecting the executable does not suffice, because if rustup is # installed but no toolchain is available, then `cargo` exists but # cannot be used without installing a toolchain first. - if cmd_output_b('cargo', '--version', check=False)[0] == 0: + if cmd_output_b('cargo', '--version', check=False, cwd='/')[0] == 0: return 'system' else: return C.DEFAULT diff --git a/tests/languages/rust_test.py b/tests/languages/rust_test.py index 5c17f5b6..52e35613 100644 --- a/tests/languages/rust_test.py +++ b/tests/languages/rust_test.py @@ -9,6 +9,7 @@ from pre_commit import parse_shebang from pre_commit.languages import rust from pre_commit.store import _make_local_repo from testing.language_helpers import run_language +from testing.util import cwd ACTUAL_GET_DEFAULT_VERSION = rust.get_default_version.__wrapped__ @@ -29,6 +30,14 @@ def test_uses_default_when_rust_is_not_available(cmd_output_b_mck): assert ACTUAL_GET_DEFAULT_VERSION() == C.DEFAULT +def test_selects_system_even_if_rust_toolchain_toml(tmp_path): + toolchain_toml = '[toolchain]\nchannel = "wtf"\n' + tmp_path.joinpath('rust-toolchain.toml').write_text(toolchain_toml) + + with cwd(tmp_path): + assert ACTUAL_GET_DEFAULT_VERSION() == 'system' + + def _make_hello_world(tmp_path): src_dir = tmp_path.joinpath('src') src_dir.mkdir() From 9ee076835365c0b3aa700de8f574def623826385 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Fri, 10 May 2024 21:24:51 -0400 Subject: [PATCH 013/102] v3.7.1 --- CHANGELOG.md | 9 +++++++++ setup.cfg | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 076e1631..81d5b33e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +3.7.1 - 2024-05-10 +================== + +### Fixes +- Fix `language: rust` default language version check when `rust-toolchain.toml` + is present. + - issue by @gaborbernat. + - #3201 PR by @asottile. + 3.7.0 - 2024-03-24 ================== diff --git a/setup.cfg b/setup.cfg index 0e155601..83c09acd 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 3.7.0 +version = 3.7.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 5526bb21377dc3e4a59451a55d0d729644eac462 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 21:34:15 +0000 Subject: [PATCH 014/102] [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.1.0 → v2.1.1](https://github.com/hhatto/autopep8/compare/v2.1.0...v2.1.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 6caee40d..eebeea99 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.1.0 + rev: v2.1.1 hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 From 1f128556e4ac2fae84133b9a4f085a8044a44382 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 21:47:18 +0000 Subject: [PATCH 015/102] [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.12.0 → v3.13.0](https://github.com/asottile/reorder-python-imports/compare/v3.12.0...v3.13.0) - [github.com/hhatto/autopep8: v2.1.1 → v2.2.0](https://github.com/hhatto/autopep8/compare/v2.1.1...v2.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 eebeea99..0467fa39 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,7 +14,7 @@ repos: hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder-python-imports - rev: v3.12.0 + rev: v3.13.0 hooks: - id: reorder-python-imports exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/) @@ -29,7 +29,7 @@ repos: - id: pyupgrade args: [--py39-plus] - repo: https://github.com/hhatto/autopep8 - rev: v2.1.1 + rev: v2.2.0 hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 From 9dd247898c86405b68705595d8a3c8911be39d57 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 21:56:51 +0000 Subject: [PATCH 016/102] [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.15.2 → v3.16.0](https://github.com/asottile/pyupgrade/compare/v3.15.2...v3.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 0467fa39..6282056f 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.15.2 + rev: v3.16.0 hooks: - id: pyupgrade args: [--py39-plus] From 49a9664cd0e393fb3bc5e1023bee801cc3e6fc6a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 21:57:20 +0000 Subject: [PATCH 017/102] [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.2.0 → v2.3.0](https://github.com/hhatto/autopep8/compare/v2.2.0...v2.3.0) - [github.com/PyCQA/flake8: 7.0.0 → 7.1.0](https://github.com/PyCQA/flake8/compare/7.0.0...7.1.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 6282056f..b11a1dce 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,11 +29,11 @@ repos: - id: pyupgrade args: [--py39-plus] - repo: https://github.com/hhatto/autopep8 - rev: v2.2.0 + rev: v2.3.0 hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 - rev: 7.0.0 + rev: 7.1.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy From 69b5dce12ab0674cd7a622ca8b55f1afa720211b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 21:49:02 +0000 Subject: [PATCH 018/102] [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.0 → v2.3.1](https://github.com/hhatto/autopep8/compare/v2.3.0...v2.3.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 b11a1dce..1f734f8c 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.0 + rev: v2.3.1 hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 From f632459bc67834a200aac26f1129fc16f82fb625 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 23:34:14 +0000 Subject: [PATCH 019/102] [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.10.0 → v1.10.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.10.0...v1.10.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 1f734f8c..f987dfe8 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.10.0 + rev: v1.10.1 hooks: - id: mypy additional_dependencies: [types-all] From 88317ddb34ac8c60b4be7e22198fb550dcae995e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:04:19 +0000 Subject: [PATCH 020/102] [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.10.1 → v1.11.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.10.1...v1.11.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 f987dfe8..a628f4f4 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.10.1 + rev: v1.11.0 hooks: - id: mypy additional_dependencies: [types-all] From a68a19d217d0d1067828622fde9044d9502693b3 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 28 Jul 2024 14:50:24 -0400 Subject: [PATCH 021/102] fixes for mypy 1.11 --- .pre-commit-config.yaml | 2 +- pre_commit/util.py | 4 ++-- tests/conftest.py | 25 +++++++------------------ 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a628f4f4..1a9a8fef 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -40,5 +40,5 @@ repos: rev: v1.11.0 hooks: - id: mypy - additional_dependencies: [types-all] + additional_dependencies: [types-pyyaml] exclude: ^testing/resources/ diff --git a/pre_commit/util.py b/pre_commit/util.py index b75c84a2..12aa3c0e 100644 --- a/pre_commit/util.py +++ b/pre_commit/util.py @@ -205,7 +205,7 @@ else: # pragma: no cover def _handle_readonly( func: Callable[[str], object], path: str, - exc: Exception, + exc: BaseException, ) -> None: if ( func in (os.rmdir, os.remove, os.unlink) and @@ -223,7 +223,7 @@ if sys.version_info < (3, 12): # pragma: <3.12 cover def _handle_readonly_old( func: Callable[[str], object], path: str, - excinfo: tuple[type[Exception], Exception, TracebackType], + excinfo: tuple[type[BaseException], BaseException, TracebackType], ) -> None: return _handle_readonly(func, path, excinfo[1]) diff --git a/tests/conftest.py b/tests/conftest.py index 30761715..bd4af9a5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -209,36 +209,25 @@ def log_info_mock(): yield mck -class FakeStream: - def __init__(self): - self.data = io.BytesIO() - - def write(self, s): - self.data.write(s) - - def flush(self): - pass - - class Fixture: - def __init__(self, stream): + def __init__(self, stream: io.BytesIO) -> None: self._stream = stream - def get_bytes(self): + def get_bytes(self) -> bytes: """Get the output as-if no encoding occurred""" - data = self._stream.data.getvalue() - self._stream.data.seek(0) - self._stream.data.truncate() + data = self._stream.getvalue() + self._stream.seek(0) + self._stream.truncate() return data.replace(b'\r\n', b'\n') - def get(self): + def get(self) -> str: """Get the output assuming it was written as UTF-8 bytes""" return self.get_bytes().decode() @pytest.fixture def cap_out(): - stream = FakeStream() + stream = io.BytesIO() write = functools.partial(output.write, stream=stream) write_line_b = functools.partial(output.write_line_b, stream=stream) with mock.patch.multiple(output, write=write, write_line_b=write_line_b): From da0c1d0cfa19f6dc0d6ed97820c7cc93fe7e7c58 Mon Sep 17 00:00:00 2001 From: Lorenz Walthert Date: Mon, 22 Jul 2024 20:52:43 +0200 Subject: [PATCH 022/102] implement health check for language:r --- pre_commit/languages/r.py | 77 +++++++++++++++++++++++++---- tests/languages/r_test.py | 100 +++++++++++++++++++++++++++++++++----- 2 files changed, 155 insertions(+), 22 deletions(-) diff --git a/pre_commit/languages/r.py b/pre_commit/languages/r.py index 93b62bd5..5d18bf1c 100644 --- a/pre_commit/languages/r.py +++ b/pre_commit/languages/r.py @@ -14,13 +14,74 @@ from pre_commit.envcontext import envcontext from pre_commit.envcontext import PatchesT 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 -health_check = lang_base.basic_health_check + + +def _execute_vanilla_r_code_as_script( + code: str, *, + prefix: Prefix, version: str, args: Sequence[str] = (), cwd: 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, + ) + return out.rstrip('\n') + + +def _read_installed_version(envdir: str, prefix: Prefix, version: str) -> str: + return _execute_vanilla_r_code_as_script( + 'cat(renv::settings$r.version())', + prefix=prefix, version=version, + cwd=envdir, + ) + + +def _read_executable_version(envdir: str, prefix: Prefix, version: str) -> str: + return _execute_vanilla_r_code_as_script( + 'cat(as.character(getRversion()))', + prefix=prefix, version=version, + cwd=envdir, + ) + + +def _write_current_r_version( + envdir: str, prefix: Prefix, version: str, +) -> None: + _execute_vanilla_r_code_as_script( + 'renv::settings$r.version(as.character(getRversion()))', + prefix=prefix, version=version, + cwd=envdir, + ) + + +def health_check(prefix: Prefix, version: str) -> str | None: + envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) + + r_version_installation = _read_installed_version( + envdir=envdir, prefix=prefix, version=version, + ) + r_version_current_executable = _read_executable_version( + envdir=envdir, prefix=prefix, version=version, + ) + if r_version_installation in {'NULL', ''}: + return ( + f'Hooks were installed with an unknown R version. R version for ' + f'hook repo now set to {r_version_current_executable}' + ) + elif r_version_installation != r_version_current_executable: + return ( + f'Hooks were installed for R version {r_version_installation}, ' + f'but current R executable has version ' + f'{r_version_current_executable}' + ) + + return None @contextlib.contextmanager @@ -147,16 +208,14 @@ def install_environment( with _r_code_in_tempfile(r_code_inst_environment) as f: cmd_output_b(_rscript_exec(), '--vanilla', f, 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))' - with in_env(prefix, version): - with _r_code_in_tempfile(r_code_inst_add) as f: - cmd_output_b( - _rscript_exec(), *RSCRIPT_OPTS, - f, - *additional_dependencies, - cwd=env_dir, - ) + _execute_vanilla_r_code_as_script( + code=r_code_inst_add, prefix=prefix, version=version, + args=additional_dependencies, + cwd=env_dir, + ) def _inline_r_setup(code: str) -> str: diff --git a/tests/languages/r_test.py b/tests/languages/r_test.py index 02c559cb..10919e4a 100644 --- a/tests/languages/r_test.py +++ b/tests/languages/r_test.py @@ -1,14 +1,17 @@ from __future__ import annotations import os.path -import shutil +from unittest import mock import pytest +import pre_commit.constants as C from pre_commit import envcontext +from pre_commit import lang_base from pre_commit.languages import r from pre_commit.prefix import Prefix from pre_commit.store import _make_local_repo +from pre_commit.util import resource_text from pre_commit.util import win_exe from testing.language_helpers import run_language @@ -127,7 +130,8 @@ def test_path_rscript_exec_no_r_home_set(): assert r._rscript_exec() == 'Rscript' -def test_r_hook(tmp_path): +@pytest.fixture +def renv_lock_file(tmp_path): renv_lock = '''\ { "R": { @@ -157,6 +161,12 @@ def test_r_hook(tmp_path): } } ''' + tmp_path.joinpath('renv.lock').write_text(renv_lock) + yield + + +@pytest.fixture +def description_file(tmp_path): description = '''\ Package: gli.clu Title: What the Package Does (One Line, Title Case) @@ -178,27 +188,39 @@ RoxygenNote: 7.1.1 Imports: rprojroot ''' - hello_world_r = '''\ + tmp_path.joinpath('DESCRIPTION').write_text(description) + yield + + +@pytest.fixture +def hello_world_file(tmp_path): + hello_world = '''\ stopifnot( packageVersion('rprojroot') == '1.0', packageVersion('gli.clu') == '0.0.0.9000' ) cat("Hello, World, from R!\n") ''' + tmp_path.joinpath('hello-world.R').write_text(hello_world) + yield - tmp_path.joinpath('renv.lock').write_text(renv_lock) - tmp_path.joinpath('DESCRIPTION').write_text(description) - tmp_path.joinpath('hello-world.R').write_text(hello_world_r) + +@pytest.fixture +def renv_folder(tmp_path): renv_dir = tmp_path.joinpath('renv') renv_dir.mkdir() - shutil.copy( - os.path.join( - os.path.dirname(__file__), - '../../pre_commit/resources/empty_template_activate.R', - ), - renv_dir.joinpath('activate.R'), - ) + activate_r = resource_text('empty_template_activate.R') + renv_dir.joinpath('activate.R').write_text(activate_r) + yield + +def test_r_hook( + tmp_path, + renv_lock_file, + description_file, + hello_world_file, + renv_folder, +): expected = (0, b'Hello, World, from R!\n') assert run_language(tmp_path, r, 'Rscript hello-world.R') == expected @@ -221,3 +243,55 @@ Rscript -e ' args=('hi', 'hello'), ) assert ret == (0, b'hi, hello, from R!\n') + + +@pytest.fixture +def prefix(tmpdir): + yield Prefix(str(tmpdir)) + + +@pytest.fixture +def installed_environment( + renv_lock_file, + hello_world_file, + renv_folder, + prefix, +): + env_dir = lang_base.environment_dir( + prefix, r.ENVIRONMENT_DIR, r.get_default_version(), + ) + r.install_environment(prefix, C.DEFAULT, ()) + yield prefix, env_dir + + +def test_health_check_healthy(installed_environment): + # should be healthy right after creation + prefix, _ = installed_environment + assert r.health_check(prefix, C.DEFAULT) is None + + +def test_health_check_after_downgrade(installed_environment): + prefix, _ = installed_environment + + # pretend the saved installed version is old + with mock.patch.object(r, '_read_installed_version', return_value='1.0.0'): + output = r.health_check(prefix, C.DEFAULT) + + assert output is not None + assert output.startswith('Hooks were installed for R version') + + +@pytest.mark.parametrize('version', ('NULL', 'NA', "''")) +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( + f'renv::settings$r.version({version})', + prefix=prefix, version=C.DEFAULT, cwd=env_dir, + ) + + # no R version specified fails as unhealty + msg = 'Hooks were installed with an unknown R version' + check_output = r.health_check(prefix, C.DEFAULT) + assert check_output is not None and check_output.startswith(msg) From d46423ffe14a37a06a0bcb6fe1b8294a27b6c289 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 28 Jul 2024 15:58:29 -0400 Subject: [PATCH 023/102] v3.8.0 --- CHANGELOG.md | 9 +++++++++ setup.cfg | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81d5b33e..49094bbb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +3.8.0 - 2024-07-28 +================== + +### Features +- Implement health checks for `language: r` so environments are recreated if + the system version of R changes. + - #3206 issue by @lorenzwalthert. + - #3265 PR by @lorenzwalthert. + 3.7.1 - 2024-05-10 ================== diff --git a/setup.cfg b/setup.cfg index 83c09acd..52b7681e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 3.7.1 +version = 3.8.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 9d4ab670d18f3c32ee204dbb50af74884d832ce4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 21:59:01 +0000 Subject: [PATCH 024/102] [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.16.0 → v3.17.0](https://github.com/asottile/pyupgrade/compare/v3.16.0...v3.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 1a9a8fef..16cec4cd 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.16.0 + rev: v3.17.0 hooks: - id: pyupgrade args: [--py39-plus] From 917e2102be90a6384cf514ddc0edefbc563b49fc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 21:59:19 +0000 Subject: [PATCH 025/102] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pre_commit/commands/run.py | 6 +++--- pre_commit/envcontext.py | 2 +- pre_commit/error_handler.py | 2 +- pre_commit/file_lock.py | 6 +++--- pre_commit/lang_base.py | 2 +- pre_commit/languages/conda.py | 2 +- pre_commit/languages/coursier.py | 2 +- pre_commit/languages/dart.py | 2 +- pre_commit/languages/dotnet.py | 4 ++-- pre_commit/languages/golang.py | 2 +- pre_commit/languages/haskell.py | 2 +- pre_commit/languages/lua.py | 2 +- pre_commit/languages/node.py | 2 +- pre_commit/languages/perl.py | 2 +- pre_commit/languages/python.py | 2 +- pre_commit/languages/r.py | 4 ++-- pre_commit/languages/ruby.py | 2 +- pre_commit/languages/rust.py | 2 +- pre_commit/languages/swift.py | 2 +- pre_commit/logging_handler.py | 2 +- pre_commit/staged_files_only.py | 6 +++--- pre_commit/store.py | 4 ++-- pre_commit/util.py | 2 +- pre_commit/xargs.py | 1 - 24 files changed, 32 insertions(+), 33 deletions(-) diff --git a/pre_commit/commands/run.py b/pre_commit/commands/run.py index 2a08dff0..793adbdb 100644 --- a/pre_commit/commands/run.py +++ b/pre_commit/commands/run.py @@ -61,7 +61,7 @@ def filter_by_include_exclude( names: Iterable[str], include: str, exclude: str, -) -> Generator[str, None, None]: +) -> Generator[str]: include_re, exclude_re = re.compile(include), re.compile(exclude) return ( filename for filename in names @@ -84,7 +84,7 @@ class Classifier: types: Iterable[str], types_or: Iterable[str], exclude_types: Iterable[str], - ) -> Generator[str, None, None]: + ) -> Generator[str]: types = frozenset(types) types_or = frozenset(types_or) exclude_types = frozenset(exclude_types) @@ -97,7 +97,7 @@ class Classifier: ): yield filename - def filenames_for_hook(self, hook: Hook) -> Generator[str, None, None]: + def filenames_for_hook(self, hook: Hook) -> Generator[str]: return self.by_types( filter_by_include_exclude( self.filenames, diff --git a/pre_commit/envcontext.py b/pre_commit/envcontext.py index 1f816cea..d4d24118 100644 --- a/pre_commit/envcontext.py +++ b/pre_commit/envcontext.py @@ -33,7 +33,7 @@ def format_env(parts: SubstitutionT, env: MutableMapping[str, str]) -> str: def envcontext( patch: PatchesT, _env: MutableMapping[str, str] | None = None, -) -> Generator[None, None, None]: +) -> Generator[None]: """In this context, `os.environ` is modified according to `patch`. `patch` is an iterable of 2-tuples (key, value): diff --git a/pre_commit/error_handler.py b/pre_commit/error_handler.py index 73e608b7..4f0e0573 100644 --- a/pre_commit/error_handler.py +++ b/pre_commit/error_handler.py @@ -68,7 +68,7 @@ def _log_and_exit( @contextlib.contextmanager -def error_handler() -> Generator[None, None, None]: +def error_handler() -> Generator[None]: try: yield except (Exception, KeyboardInterrupt) as e: diff --git a/pre_commit/file_lock.py b/pre_commit/file_lock.py index d3dafb4d..c840ad8b 100644 --- a/pre_commit/file_lock.py +++ b/pre_commit/file_lock.py @@ -20,7 +20,7 @@ if sys.platform == 'win32': # pragma: no cover (windows) def _locked( fileno: int, blocked_cb: Callable[[], None], - ) -> Generator[None, None, None]: + ) -> Generator[None]: try: msvcrt.locking(fileno, msvcrt.LK_NBLCK, _region) except OSError: @@ -53,7 +53,7 @@ else: # pragma: win32 no cover def _locked( fileno: int, blocked_cb: Callable[[], None], - ) -> Generator[None, None, None]: + ) -> Generator[None]: try: fcntl.flock(fileno, fcntl.LOCK_EX | fcntl.LOCK_NB) except OSError: # pragma: no cover (tests are single-threaded) @@ -69,7 +69,7 @@ else: # pragma: win32 no cover def lock( path: str, blocked_cb: Callable[[], None], -) -> Generator[None, None, None]: +) -> Generator[None]: with open(path, 'a+') as f: with _locked(f.fileno(), blocked_cb): yield diff --git a/pre_commit/lang_base.py b/pre_commit/lang_base.py index 5303948b..95be7b9b 100644 --- a/pre_commit/lang_base.py +++ b/pre_commit/lang_base.py @@ -127,7 +127,7 @@ def no_install( @contextlib.contextmanager -def no_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def no_env(prefix: Prefix, version: str) -> Generator[None]: yield diff --git a/pre_commit/languages/conda.py b/pre_commit/languages/conda.py index 80b3e150..d397ebeb 100644 --- a/pre_commit/languages/conda.py +++ b/pre_commit/languages/conda.py @@ -41,7 +41,7 @@ def get_env_patch(env: str) -> PatchesT: @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir)): yield diff --git a/pre_commit/languages/coursier.py b/pre_commit/languages/coursier.py index 6558bf6b..08f9a958 100644 --- a/pre_commit/languages/coursier.py +++ b/pre_commit/languages/coursier.py @@ -70,7 +70,7 @@ def get_env_patch(target_dir: str) -> PatchesT: @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir)): yield diff --git a/pre_commit/languages/dart.py b/pre_commit/languages/dart.py index 129ac591..52a229ee 100644 --- a/pre_commit/languages/dart.py +++ b/pre_commit/languages/dart.py @@ -29,7 +29,7 @@ def get_env_patch(venv: str) -> PatchesT: @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir)): yield diff --git a/pre_commit/languages/dotnet.py b/pre_commit/languages/dotnet.py index e1202c4f..ffc65d1e 100644 --- a/pre_commit/languages/dotnet.py +++ b/pre_commit/languages/dotnet.py @@ -30,14 +30,14 @@ def get_env_patch(venv: str) -> PatchesT: @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir)): yield @contextlib.contextmanager -def _nuget_config_no_sources() -> Generator[str, None, None]: +def _nuget_config_no_sources() -> Generator[str]: with tempfile.TemporaryDirectory() as tmpdir: nuget_config = os.path.join(tmpdir, 'nuget.config') with open(nuget_config, 'w') as f: diff --git a/pre_commit/languages/golang.py b/pre_commit/languages/golang.py index 66e07cf7..60908796 100644 --- a/pre_commit/languages/golang.py +++ b/pre_commit/languages/golang.py @@ -121,7 +121,7 @@ def _install_go(version: str, dest: str) -> None: @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir, version)): yield diff --git a/pre_commit/languages/haskell.py b/pre_commit/languages/haskell.py index c6945c82..28bca08c 100644 --- a/pre_commit/languages/haskell.py +++ b/pre_commit/languages/haskell.py @@ -24,7 +24,7 @@ def get_env_patch(target_dir: str) -> PatchesT: @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir)): yield diff --git a/pre_commit/languages/lua.py b/pre_commit/languages/lua.py index a475ec99..15ac1a2e 100644 --- a/pre_commit/languages/lua.py +++ b/pre_commit/languages/lua.py @@ -44,7 +44,7 @@ def get_env_patch(d: str) -> PatchesT: # pragma: win32 no cover @contextlib.contextmanager # pragma: win32 no cover -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir)): yield diff --git a/pre_commit/languages/node.py b/pre_commit/languages/node.py index d49c0e32..af7dc6f8 100644 --- a/pre_commit/languages/node.py +++ b/pre_commit/languages/node.py @@ -59,7 +59,7 @@ def get_env_patch(venv: str) -> PatchesT: @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir)): yield diff --git a/pre_commit/languages/perl.py b/pre_commit/languages/perl.py index 61b1d114..a07d442a 100644 --- a/pre_commit/languages/perl.py +++ b/pre_commit/languages/perl.py @@ -33,7 +33,7 @@ def get_env_patch(venv: str) -> PatchesT: @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir)): yield diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py index 9f4bf69a..0c4bb62d 100644 --- a/pre_commit/languages/python.py +++ b/pre_commit/languages/python.py @@ -152,7 +152,7 @@ def norm_version(version: str) -> str | None: @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir)): yield diff --git a/pre_commit/languages/r.py b/pre_commit/languages/r.py index 5d18bf1c..c75a3089 100644 --- a/pre_commit/languages/r.py +++ b/pre_commit/languages/r.py @@ -85,7 +85,7 @@ def health_check(prefix: Prefix, version: str) -> str | None: @contextlib.contextmanager -def _r_code_in_tempfile(code: str) -> Generator[str, None, None]: +def _r_code_in_tempfile(code: str) -> Generator[str]: """ To avoid quoting and escaping issues, avoid `Rscript [options] -e {expr}` but use `Rscript [options] path/to/file_with_expr.R` @@ -105,7 +105,7 @@ def get_env_patch(venv: str) -> PatchesT: @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir)): yield diff --git a/pre_commit/languages/ruby.py b/pre_commit/languages/ruby.py index 0438ae09..f32fea3f 100644 --- a/pre_commit/languages/ruby.py +++ b/pre_commit/languages/ruby.py @@ -73,7 +73,7 @@ def get_env_patch( @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir, version)): yield diff --git a/pre_commit/languages/rust.py b/pre_commit/languages/rust.py index 5f9db8fb..fd77a9d2 100644 --- a/pre_commit/languages/rust.py +++ b/pre_commit/languages/rust.py @@ -61,7 +61,7 @@ def get_env_patch(target_dir: str, version: str) -> PatchesT: @contextlib.contextmanager -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir, version)): yield diff --git a/pre_commit/languages/swift.py b/pre_commit/languages/swift.py index f7bfe84c..08a9c39a 100644 --- a/pre_commit/languages/swift.py +++ b/pre_commit/languages/swift.py @@ -27,7 +27,7 @@ def get_env_patch(venv: str) -> PatchesT: # pragma: win32 no cover @contextlib.contextmanager # pragma: win32 no cover -def in_env(prefix: Prefix, version: str) -> Generator[None, None, None]: +def in_env(prefix: Prefix, version: str) -> Generator[None]: envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) with envcontext(get_env_patch(envdir)): yield diff --git a/pre_commit/logging_handler.py b/pre_commit/logging_handler.py index cd33953d..74772bee 100644 --- a/pre_commit/logging_handler.py +++ b/pre_commit/logging_handler.py @@ -32,7 +32,7 @@ class LoggingHandler(logging.Handler): @contextlib.contextmanager -def logging_handler(use_color: bool) -> Generator[None, None, None]: +def logging_handler(use_color: bool) -> Generator[None]: handler = LoggingHandler(use_color) logger.addHandler(handler) logger.setLevel(logging.INFO) diff --git a/pre_commit/staged_files_only.py b/pre_commit/staged_files_only.py index e1f81ba9..99ea0979 100644 --- a/pre_commit/staged_files_only.py +++ b/pre_commit/staged_files_only.py @@ -33,7 +33,7 @@ def _git_apply(patch: str) -> None: @contextlib.contextmanager -def _intent_to_add_cleared() -> Generator[None, None, None]: +def _intent_to_add_cleared() -> Generator[None]: intent_to_add = git.intent_to_add_files() if intent_to_add: logger.warning('Unstaged intent-to-add files detected.') @@ -48,7 +48,7 @@ def _intent_to_add_cleared() -> Generator[None, None, None]: @contextlib.contextmanager -def _unstaged_changes_cleared(patch_dir: str) -> Generator[None, None, None]: +def _unstaged_changes_cleared(patch_dir: str) -> Generator[None]: tree = cmd_output('git', 'write-tree')[1].strip() diff_cmd = ( 'git', 'diff-index', '--ignore-submodules', '--binary', @@ -105,7 +105,7 @@ def _unstaged_changes_cleared(patch_dir: str) -> Generator[None, None, None]: @contextlib.contextmanager -def staged_files_only(patch_dir: str) -> Generator[None, None, None]: +def staged_files_only(patch_dir: str) -> Generator[None]: """Clear any unstaged changes from the git working directory inside this context. """ diff --git a/pre_commit/store.py b/pre_commit/store.py index 84bc09a4..36cc4945 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -101,7 +101,7 @@ class Store: os.replace(tmpfile, self.db_path) @contextlib.contextmanager - def exclusive_lock(self) -> Generator[None, None, None]: + def exclusive_lock(self) -> Generator[None]: def blocked_cb() -> None: # pragma: no cover (tests are in-process) logger.info('Locking pre-commit directory') @@ -112,7 +112,7 @@ class Store: def connect( self, db_path: str | None = None, - ) -> Generator[sqlite3.Connection, None, None]: + ) -> Generator[sqlite3.Connection]: db_path = db_path or self.db_path # sqlite doesn't close its fd with its contextmanager >.< # contextlib.closing fixes this. diff --git a/pre_commit/util.py b/pre_commit/util.py index 12aa3c0e..e199d080 100644 --- a/pre_commit/util.py +++ b/pre_commit/util.py @@ -25,7 +25,7 @@ def force_bytes(exc: Any) -> bytes: @contextlib.contextmanager -def clean_path_on_failure(path: str) -> Generator[None, None, None]: +def clean_path_on_failure(path: str) -> Generator[None]: """Cleans up the directory on an exceptional failure.""" try: yield diff --git a/pre_commit/xargs.py b/pre_commit/xargs.py index 22580f59..a1345b58 100644 --- a/pre_commit/xargs.py +++ b/pre_commit/xargs.py @@ -120,7 +120,6 @@ def partition( @contextlib.contextmanager def _thread_mapper(maxsize: int) -> Generator[ Callable[[Callable[[TArg], TRet], Iterable[TArg]], Iterable[TRet]], - None, None, ]: if maxsize == 1: yield map From d5c21926ab78fd3d89f4891b29bd426f6ee80c9c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 22:39:33 +0000 Subject: [PATCH 026/102] [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.0 → 7.1.1](https://github.com/PyCQA/flake8/compare/7.1.0...7.1.1) - [github.com/pre-commit/mirrors-mypy: v1.11.0 → v1.11.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.11.0...v1.11.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 16cec4cd..a6c853ca 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.1.0 + rev: 7.1.1 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.11.0 + rev: v1.11.1 hooks: - id: mypy additional_dependencies: [types-pyyaml] From c2c68d985ceac41afe63635c15789207c441614e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:18:35 +0000 Subject: [PATCH 027/102] [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.11.1 → v1.11.2](https://github.com/pre-commit/mirrors-mypy/compare/v1.11.1...v1.11.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 a6c853ca..87b8551d 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.11.1 + rev: v1.11.2 hooks: - id: mypy additional_dependencies: [types-pyyaml] From 364e6d77f051b40d22ac9071ef64bc12f3e6a1fe Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 16 Sep 2024 20:05:29 -0400 Subject: [PATCH 028/102] change migrate-config to use yaml parse tree instead --- pre_commit/commands/migrate_config.py | 58 ++++++++++++++++++++++----- pre_commit/yaml.py | 1 + pre_commit/yaml_rewrite.py | 52 ++++++++++++++++++++++++ tests/commands/migrate_config_test.py | 46 +++++++++++++++++++++ tests/yaml_rewrite_test.py | 47 ++++++++++++++++++++++ 5 files changed, 194 insertions(+), 10 deletions(-) create mode 100644 pre_commit/yaml_rewrite.py create mode 100644 tests/yaml_rewrite_test.py diff --git a/pre_commit/commands/migrate_config.py b/pre_commit/commands/migrate_config.py index 842fb3a7..cdce83f5 100644 --- a/pre_commit/commands/migrate_config.py +++ b/pre_commit/commands/migrate_config.py @@ -1,13 +1,20 @@ from __future__ import annotations -import re +import functools import textwrap +from typing import Callable import cfgv import yaml +from yaml.nodes import ScalarNode from pre_commit.clientlib import InvalidConfigError +from pre_commit.yaml import yaml_compose from pre_commit.yaml import yaml_load +from pre_commit.yaml_rewrite import MappingKey +from pre_commit.yaml_rewrite import MappingValue +from pre_commit.yaml_rewrite import match +from pre_commit.yaml_rewrite import SequenceItem def _is_header_line(line: str) -> bool: @@ -38,16 +45,48 @@ def _migrate_map(contents: str) -> str: return contents -def _migrate_sha_to_rev(contents: str) -> str: - return re.sub(r'(\n\s+)sha:', r'\1rev:', contents) +def _preserve_style(n: ScalarNode, *, s: str) -> str: + return f'{n.style}{s}{n.style}' -def _migrate_python_venv(contents: str) -> str: - return re.sub( - r'(\n\s+)language: python_venv\b', - r'\1language: python', - contents, +def _migrate_composed(contents: str) -> str: + tree = yaml_compose(contents) + rewrites: list[tuple[ScalarNode, Callable[[ScalarNode], str]]] = [] + + # sha -> rev + sha_to_rev_replace = functools.partial(_preserve_style, s='rev') + sha_to_rev_matcher = ( + MappingValue('repos'), + SequenceItem(), + MappingKey('sha'), ) + for node in match(tree, sha_to_rev_matcher): + rewrites.append((node, sha_to_rev_replace)) + + # python_venv -> python + language_matcher = ( + MappingValue('repos'), + SequenceItem(), + MappingValue('hooks'), + SequenceItem(), + MappingValue('language'), + ) + python_venv_replace = functools.partial(_preserve_style, s='python') + for node in match(tree, language_matcher): + if node.value == 'python_venv': + rewrites.append((node, python_venv_replace)) + + rewrites.sort(reverse=True, key=lambda nf: nf[0].start_mark.index) + + src_parts = [] + end: int | None = None + for node, func in rewrites: + src_parts.append(contents[node.end_mark.index:end]) + src_parts.append(func(node)) + end = node.start_mark.index + src_parts.append(contents[:end]) + src_parts.reverse() + return ''.join(src_parts) def migrate_config(config_file: str, quiet: bool = False) -> int: @@ -62,8 +101,7 @@ def migrate_config(config_file: str, quiet: bool = False) -> int: raise cfgv.ValidationError(str(e)) contents = _migrate_map(contents) - contents = _migrate_sha_to_rev(contents) - contents = _migrate_python_venv(contents) + contents = _migrate_composed(contents) if contents != orig_contents: with open(config_file, 'w') as f: diff --git a/pre_commit/yaml.py b/pre_commit/yaml.py index bdf4ec47..a5bbbc99 100644 --- a/pre_commit/yaml.py +++ b/pre_commit/yaml.py @@ -6,6 +6,7 @@ from typing import Any import yaml Loader = getattr(yaml, 'CSafeLoader', yaml.SafeLoader) +yaml_compose = functools.partial(yaml.compose, Loader=Loader) yaml_load = functools.partial(yaml.load, Loader=Loader) Dumper = getattr(yaml, 'CSafeDumper', yaml.SafeDumper) diff --git a/pre_commit/yaml_rewrite.py b/pre_commit/yaml_rewrite.py new file mode 100644 index 00000000..8d0e8fdb --- /dev/null +++ b/pre_commit/yaml_rewrite.py @@ -0,0 +1,52 @@ +from __future__ import annotations + +from collections.abc import Generator +from collections.abc import Iterable +from typing import NamedTuple +from typing import Protocol + +from yaml.nodes import MappingNode +from yaml.nodes import Node +from yaml.nodes import ScalarNode +from yaml.nodes import SequenceNode + + +class _Matcher(Protocol): + def match(self, n: Node) -> Generator[Node]: ... + + +class MappingKey(NamedTuple): + k: str + + def match(self, n: Node) -> Generator[Node]: + if isinstance(n, MappingNode): + for k, _ in n.value: + if k.value == self.k: + yield k + + +class MappingValue(NamedTuple): + k: str + + def match(self, n: Node) -> Generator[Node]: + if isinstance(n, MappingNode): + for k, v in n.value: + if k.value == self.k: + yield v + + +class SequenceItem(NamedTuple): + def match(self, n: Node) -> Generator[Node]: + if isinstance(n, SequenceNode): + yield from n.value + + +def _match(gen: Iterable[Node], m: _Matcher) -> Iterable[Node]: + return (n for src in gen for n in m.match(src)) + + +def match(n: Node, matcher: tuple[_Matcher, ...]) -> Generator[ScalarNode]: + gen: Iterable[Node] = (n,) + for m in matcher: + gen = _match(gen, m) + return (n for n in gen if isinstance(n, ScalarNode)) diff --git a/tests/commands/migrate_config_test.py b/tests/commands/migrate_config_test.py index ba184636..c563866d 100644 --- a/tests/commands/migrate_config_test.py +++ b/tests/commands/migrate_config_test.py @@ -134,6 +134,27 @@ def test_migrate_config_sha_to_rev(tmpdir): ) +def test_migrate_config_sha_to_rev_json(tmp_path): + contents = """\ +{"repos": [{ + "repo": "https://github.com/pre-commit/pre-commit-hooks", + "sha": "v1.2.0", + "hooks": [] +}]} +""" + expected = """\ +{"repos": [{ + "repo": "https://github.com/pre-commit/pre-commit-hooks", + "rev": "v1.2.0", + "hooks": [] +}]} +""" + cfg = tmp_path.joinpath('cfg.yaml') + cfg.write_text(contents) + assert not migrate_config(str(cfg)) + assert cfg.read_text() == expected + + def test_migrate_config_language_python_venv(tmp_path): src = '''\ repos: @@ -167,6 +188,31 @@ repos: assert cfg.read_text() == expected +def test_migrate_config_quoted_python_venv(tmp_path): + src = '''\ +repos: +- repo: local + hooks: + - id: example + name: example + entry: example + language: "python_venv" +''' + expected = '''\ +repos: +- repo: local + hooks: + - id: example + name: example + entry: example + language: "python" +''' + cfg = tmp_path.joinpath('cfg.yaml') + cfg.write_text(src) + assert migrate_config(str(cfg)) == 0 + assert cfg.read_text() == expected + + def test_migrate_config_invalid_yaml(tmpdir): contents = '[' cfg = tmpdir.join(C.CONFIG_FILE) diff --git a/tests/yaml_rewrite_test.py b/tests/yaml_rewrite_test.py new file mode 100644 index 00000000..d0f6841c --- /dev/null +++ b/tests/yaml_rewrite_test.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +import pytest + +from pre_commit.yaml import yaml_compose +from pre_commit.yaml_rewrite import MappingKey +from pre_commit.yaml_rewrite import MappingValue +from pre_commit.yaml_rewrite import match +from pre_commit.yaml_rewrite import SequenceItem + + +def test_match_produces_scalar_values_only(): + src = '''\ +- name: foo +- name: [not, foo] # not a scalar: should be skipped! +- name: bar +''' + matcher = (SequenceItem(), MappingValue('name')) + ret = [n.value for n in match(yaml_compose(src), matcher)] + assert ret == ['foo', 'bar'] + + +@pytest.mark.parametrize('cls', (MappingKey, MappingValue)) +def test_mapping_not_a_map(cls): + m = cls('s') + assert list(m.match(yaml_compose('[foo]'))) == [] + + +def test_sequence_item_not_a_sequence(): + assert list(SequenceItem().match(yaml_compose('s: val'))) == [] + + +def test_mapping_key(): + m = MappingKey('s') + ret = [n.value for n in m.match(yaml_compose('s: val\nt: val2'))] + assert ret == ['s'] + + +def test_mapping_value(): + m = MappingValue('s') + ret = [n.value for n in m.match(yaml_compose('s: val\nt: val2'))] + assert ret == ['val'] + + +def test_sequence_item(): + ret = [n.value for n in SequenceItem().match(yaml_compose('[a, b, c]'))] + assert ret == ['a', 'b', 'c'] From 5679399d905a30b37c8132e8a854353f3025dcc3 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 16 Sep 2024 20:36:33 -0400 Subject: [PATCH 029/102] migrate-config rewrites deprecated stages --- pre_commit/commands/migrate_config.py | 21 ++++++++++++++ tests/commands/migrate_config_test.py | 42 +++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/pre_commit/commands/migrate_config.py b/pre_commit/commands/migrate_config.py index cdce83f5..ada094fa 100644 --- a/pre_commit/commands/migrate_config.py +++ b/pre_commit/commands/migrate_config.py @@ -1,6 +1,7 @@ from __future__ import annotations import functools +import itertools import textwrap from typing import Callable @@ -49,6 +50,10 @@ def _preserve_style(n: ScalarNode, *, s: str) -> str: return f'{n.style}{s}{n.style}' +def _fix_stage(n: ScalarNode) -> str: + return _preserve_style(n, s=f'pre-{n.value}') + + def _migrate_composed(contents: str) -> str: tree = yaml_compose(contents) rewrites: list[tuple[ScalarNode, Callable[[ScalarNode], str]]] = [] @@ -76,6 +81,22 @@ def _migrate_composed(contents: str) -> str: if node.value == 'python_venv': rewrites.append((node, python_venv_replace)) + # stages rewrites + default_stages_matcher = (MappingValue('default_stages'), SequenceItem()) + default_stages_match = match(tree, default_stages_matcher) + hook_stages_matcher = ( + MappingValue('repos'), + SequenceItem(), + MappingValue('hooks'), + SequenceItem(), + MappingValue('stages'), + SequenceItem(), + ) + hook_stages_match = match(tree, hook_stages_matcher) + for node in itertools.chain(default_stages_match, hook_stages_match): + if node.value in {'commit', 'push', 'merge-commit'}: + rewrites.append((node, _fix_stage)) + rewrites.sort(reverse=True, key=lambda nf: nf[0].start_mark.index) src_parts = [] diff --git a/tests/commands/migrate_config_test.py b/tests/commands/migrate_config_test.py index c563866d..9ffae6ee 100644 --- a/tests/commands/migrate_config_test.py +++ b/tests/commands/migrate_config_test.py @@ -213,6 +213,48 @@ repos: assert cfg.read_text() == expected +def test_migrate_config_default_stages(tmp_path): + src = '''\ +default_stages: [commit, push, merge-commit, commit-msg] +repos: [] +''' + expected = '''\ +default_stages: [pre-commit, pre-push, pre-merge-commit, commit-msg] +repos: [] +''' + cfg = tmp_path.joinpath('cfg.yaml') + cfg.write_text(src) + assert migrate_config(str(cfg)) == 0 + assert cfg.read_text() == expected + + +def test_migrate_config_hook_stages(tmp_path): + src = '''\ +repos: +- repo: local + hooks: + - id: example + name: example + entry: example + language: system + stages: ["commit", "push", "merge-commit", "commit-msg"] +''' + expected = '''\ +repos: +- repo: local + hooks: + - id: example + name: example + entry: example + language: system + stages: ["pre-commit", "pre-push", "pre-merge-commit", "commit-msg"] +''' + cfg = tmp_path.joinpath('cfg.yaml') + cfg.write_text(src) + assert migrate_config(str(cfg)) == 0 + assert cfg.read_text() == expected + + def test_migrate_config_invalid_yaml(tmpdir): contents = '[' cfg = tmpdir.join(C.CONFIG_FILE) From a4e4cef335c62dc314fecbbd57e6fc57460c95d3 Mon Sep 17 00:00:00 2001 From: Travis Johnson Date: Thu, 9 May 2024 12:49:09 -0400 Subject: [PATCH 030/102] Upgrade to ruby-build v20240917 --- testing/make-archives | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/make-archives b/testing/make-archives index 3c7ab9dd..251be4a5 100755 --- a/testing/make-archives +++ b/testing/make-archives @@ -17,7 +17,7 @@ from collections.abc import Sequence REPOS = ( ('rbenv', 'https://github.com/rbenv/rbenv', '38e1fbb'), - ('ruby-build', 'https://github.com/rbenv/ruby-build', '855b963'), + ('ruby-build', 'https://github.com/rbenv/ruby-build', 'ed384c8'), ( 'ruby-download', 'https://github.com/garnieretienne/rvm-download', From e687548842aab3c3ccc7677492960c740c2ced11 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 28 Sep 2024 13:06:21 -0400 Subject: [PATCH 031/102] regenerate archives with python3.12 --- pre_commit/resources/rbenv.tar.gz | Bin 32551 -> 32545 bytes pre_commit/resources/ruby-download.tar.gz | Bin 5271 -> 5269 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/pre_commit/resources/rbenv.tar.gz b/pre_commit/resources/rbenv.tar.gz index da2514e71145e91debbad4bb1e11ca6d95ed3f63..111546e3dd9796511942c278495c21fe1ef947ae 100644 GIT binary patch delta 31950 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 diff --git a/pre_commit/resources/ruby-download.tar.gz b/pre_commit/resources/ruby-download.tar.gz index 92502a77e79abba062c5a4fc38e5d885a9982d29..f7cb0b42157696814f31d477b609b1e247c6c0e6 100644 GIT binary patch delta 4977 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 JGE^`y0026K%)tNv delta 4959 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 From c9454e2ec3245b792eb7626e9bea799bf5e96bbf Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 28 Sep 2024 13:07:55 -0400 Subject: [PATCH 032/102] regenerate ruby-build archive --- pre_commit/resources/ruby-build.tar.gz | Bin 75808 -> 88488 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pre_commit/resources/ruby-build.tar.gz b/pre_commit/resources/ruby-build.tar.gz index 19d467fdd2867742cdefe402a78489481ce9abba..a4f7eb24fd0a7e4d59cf120014d8b054555b8b0f 100644 GIT binary patch literal 88488 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

E%sJ2wWVrZ2Mm`!Jln4vwrf`M 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%0A>TXe<9KCS;j?4SKU z|NL))CPeLf{ukfazo@pACA0bQ9Dk)Zx1PydYrDviBP>+KJgcv9bwlUY0NtzJM<(2Q z9{cluf#`qh|M{QmC)HaV{lEH+{L0=9VF#{Fe!uVpORhnm;uGz+zb1;AMCIObW6oj} zSktko;mzf!zt!gdE8rS!z#91$-{Y~A{TI1Y)7dhr_N*j}vk}7uInkCy&koFfWXOK4 z=6&Ih^8Nb%UTXa-|Fi$6{Ym?|kN$^#>woxU$-d~Br`_g8tz5U$XoCHr+PTSFAIMk- zKFusWV^OxDbd&WizMabd9`5?PAKX3p$nSsif3tpm_+O)6GY?-E6J7eGKzi9}du5yE z>Z^0yHMx18dT<(amTOx=c|H%9s2*)-}-+WGz)w3cYQ(9fBtX(?nnRJpYb0& z;0Frw-}Ru1_uKy^lY8`v<}esl>ahzqUW_tXQOYuH<2A4Q^#`23I+QnR`XxP$(D;+` z{r`j3U;huh`@i|;|HnVupMU(H<-Q=*X2UWm2U%Y(IqARLH(uxP%spv+_EzB+PSNPi zb{v{n$M}!GT)6ih^Zy@*{=5hEUW!4ZGXJyO4{%?N)O@@5$&b@6t5eesy!Ym1XKUQ@ z($_@BtKz+BNt%GSQpk#z>SzCZfBCPq`~UT4|M{Q%_q@BmuJzyIckvc(;hJ%0UtfH; z-0NI-)cdtxRNrmBBD97zddAZ^S>`!A)RudE_~WvRVNdt})1Ur-`*k1Gr+$8;{%Gw{ z&0Ci_JUb6Oo^yWUV*fSVVK&U%WZ(-k_sD0npUHh+p`v2{p_Ot&_ z{xhHZcmCeGqme%|J_P$txy2)Qum7C=#lnjTnT72H zwZCBg{r|TA`+wFy`gi~Sn|ArfzrWx9^ZV)E`bTT`mw(E?|NqC<|F_Hk+s<3b`2N9u zrTvBf*iSzD?<$vPe)7$^mO7_%TtU0sqd;Mw7oA>|!^PTj?;MV;)rw`}Y{eCn5^ZtSZ z_WzmgmGAlg+rItP{o2oWzsLVS|6>hk@!ju>JC`4Sv;UvrpX2lQ_5c6%WBcdn?Wgzk z*F3y^{?*&xNBN)q|8v%^=K1~K`&Mqbf4e`v{`d9sbwB#2eA@r_`tkCQANR`FKK~QP zfB&of+vCAs{{OH3v8!%j{FQXikGucaU%37?eo5Zn{m1@S|M9L@(X)Rb{>}XN{QI@p z|9?DmOp?3z{Q>7cB~|;HpXXQC?aM!Q{r^b2a1vxv+cQbMLtpZYK`We z4@XRU(j8n~3VT(Z-(;-QimA5?wcPjn+2(fnjg@tV|6Y54=C}U;xai+&&3~_7|JffE zF}G>UG;j87K^vVNN*yI)nzcc5Z&iHdI$d*>hpEagcU6<=;iHYS|DXQRF8;j!d40?| z`#F!~9Jfs{h|y>|9$@S&t=VjFH8T$i-vVGpWX7+{hG>`P;Pd{k}ucJCKz$w z49xJg;gTxtc;+&V&#A=y?#KV7e?E7A-v4>O-t+nXAJ4D<{Qp%%>$Q_r4=b+(tXZ~} zeS#zZx?4F%Yi|7MWh{+YFOnN__!RT&DW>Y{&;C#Sa~i5O-tVLS`p^2?w+M7TU9xb( z{-SA9C)P*WaV@{AFQoXACB-B_;&6p&m(k?9ykwu1*}wmbfBJuvea-)4P3u3e-~Iov z`+@)B&&wD-?J_rga8=JCx$kEG5q9?=qpOhcAEm}NX$UXk)tHsOMZd}@R zhHW{^7QW+#T(j=&Kc=G=a?ItmU)h$xn@{48)K?e&EB|-@>7VVvf3{!$nZN#ryjq9B z#t?C-b4)LeKZ={WifLm;uiXYm#wU~d8iKDRKkvUT!Cn5RUiSarr9Y3){ad9A|cZ4r>JiRR2ST9>(t5aOC7V@-pi!ay^Zo~awf|7{mw(Ty|BA0|uVlZylB2Yd|NWYa*K=OJ zT3-{$cI91E8?VT`xZj_|B-vU%p8LOd!vE>_{x6pOAAkP;&cFK~gCpu+{2|+ABEIVP zCsrQlF=5!(FpWi*)hehieB;(-*4G}MS`&KLUH{0o&<9Na;`jZ_zy3ew+<(ho_Y?k$ z{;Xy7jtJf28k5|3z^L0osbSK*`g>e=GWd$w+14ysJyq^+#*SCH@BhRf|9|@W|F^&9 zpZ;mTo#DeVt^>Kx=VwMKYWN;kxx8$hhQhs9MmD!rRA15Zo!Bq;+N%HBtL#?uxSTDz z|4aYuulaj_-T$3){s(`p|4{W;{=wRR@moUV4y~063XQGH`5-zW%{?k0_oDaP&lyYK z7{_ZUN2NY9%Gs3nPyg}%r?3B){d@oP&-_*Yo3FqA{~+}5{Rgg_H@?))HmD|@s zm1==Wyo(=AUfDgv)bH{9XZu~+FK%Euw(bA*kN-b?t*`$7zUZI-)&B=yf35$p>fibW zjWgW+SKF1W47^p}V|0Cu>ocwyyH@NhDwHYR6{IM5@WH{X-T%H@fdlIK|G0DiSN^iE z*!zz^?&|-oniJb>YyUlD-0J=$fA+DBf?FPobzw}!~c=*{;&MAzxLnjr+?-b{g40tFW&OM?J*tRny;*}yLNf0{C~;B z^H$iKjj7f|H!8RH8iO%QhB9l?$E4P~e?EKt1Fcm1{XhJ3{i(n8cYoJE{S$7en11k9 zxX%&`t3N+i#fWD_)oM;L{Krvv^yYHqC$sN1CyMaj`nf;+(|Y~$|L^_ZKkI++yZ^86 z{nviJUtD%V$99&xhG{-pizjlX)vVV`aSm4cw7&7GxX`Ux#bN__@-#-0$ z|M&mupZ1~ueph|X->v)aa+Jl7hXwhoH@5~ITy`um&{}V^o_G4iOSc4A=Ni;FzBb^W zd*e_1iTe7=f8YQ8|9}48ZWH%1mFl{v@5?o^&nCS);oK626dO&E$f>{G~@5F7l)ai*nCdSNm+TK|jyJkjA(F*B{+q7ui=o zZ$kZ=xA*?l-~ajl^Phi@|Ns8?b@z|U^_%6_{C}7q(cHiNK>k*C`TcMETz~vHah~_! z%;?9K29Fu_uN-J!>6hfT;b1M-RkMn#YQbwnRwlRg<#n}rZOlFN`Q!hm+utv;6Z{`z zKmY%!9k2iE_x30=)peN5pZNblvZl1=*Tdg-_Z&Wd{r!I5uHVY< zZ2q0>xAQsTzl?FIpYz4QUBT8x3~>|X-KPX>UD*Hf(xVr$e94bi?Uni3`s$vS`@M&U zf+Fn$ zX9Xg2Q+{1obL`pwl7IJqI`cFB*ZTjZ^3VN^Z-4zi{n$Rg(f!eU`-jtCoNs@B$o@v6 z&O8%_q!~L*BLWxBIICvRvOuPtSxdt4b=2A|svDJlp102BZk^v&U*Y$!{NI0}pY86S z`S+jsuYRsxv26C^8!}h;o=rSyzxLkp6sHE8Inx3ky<4^L(LLK_=3+f=QNgms3pW2; ze}4b}?XUmqcmMyj;qU&c{Qv9YzWu+D>v5wcbjgu``Kz}*ji{-(>eqKx!}EMfg3^_f zZOJ}wXJ|4y-)BBJue-jc?qB)e_o*NI`5()_|JX17ulbZA*PIL2XG}I;x7?XwLVstN zF=?IDCBs~Y?WY2#Bwj0bGc`(V zH*DRSS!n7Q*=r@P<-u8hh;Oz2ccTrvMNHT3i(22kd~L1Ti^?DCuU`O7FQ|TumtXdO z<@Yc4U)TLhm%VGJawuwUYRjW3m&CWv_{pI({envDWi_3sy~kcjOg8NM*dVF%rcvSi ziT~opbrnkg7JfVb{eS1S|Mi7`>OaQ+>;M1r|1bUjumAu2Ut_|O$^Pf-bn#F3_ixO< z|NrUR^7s3H9lKXA{{CI_|IhwEG8oMcY(My4^xOaMKj%+BT3LPbd#O*|9&rqx~cUms{bAD ze*V9a(_!y?#w*sE4M`Q!XHK7b;`7OQddQm9=Ck9Bo|rcZ9!@?PK*%}U(Dwa9%phvw*TgWnW8)^ z?M^5!`tEj1>26))!fQ!W*b3%w^<}NGX04F>_wnY>`@jF|_te)Y{I8h*-&#n)mW|28 zif!MF!%cCz8ODhZduQBe7$mR(?c=wD&ar3@C=N~u3OUfBd zF>-riYE-(y^ndoArw#tc?d`4qTmP$1{PX$okLU3Z=G#A=zsBe2p-WXhEqRaJ@7C*X zJT~ute!!HTDg6^0t`tmLcfsPl*n(xdWlvoGcz@p9|FZx08~nTd_(%T!1NFbB{6BpA zu){Tn4axt$cU=uhuqxGYOxD|Ocy+bci;FLs756U!P&+PkJ&!)9+WP53#q>!# zd*s5?e)vqDW)-?klKYtmQ|<+~EwO*<_5Q6d_*eeAK3?qqAA^5C!Frombhkt#3uKm; z^(_{(2>ACeRY7cBtE}^Dsk>t3^0hP8 zEOp*j^7+5dpVOZ|?*|oy^_3F;i~8$#3jd$JI5WRA^tIgu@y9(kPwe57T*N3C z|NqWz`QY})$$#|gI@aH>`|Z2u=R5bx2iL#-+x`F3-s(N|`}h6-RsXZ#_08Sy`F%yHs{nY0dz<&lQl3^t1Y&%gb@{onVeAO9!) zslWU0f922mTmR}yzyIIO_)mTZW5E0O3^kV+Hmv$~shTyv>0H5|$9AuHzA0X;H0)b< zw6b8k*6N2FZPz@EHFmgh$DaNF*PTD_|NS2)^Z#q(pX+|Ojt5M#Q$$}xE**Sv@J zySGJ6tnv@Oa4gD9w&jqqrpDT$1nK7Xv!!1c?)?Gjp850s&;O?%@3))qziR&fU!Qp< zM0H$Y-SM@{-Fv-7)bGldy#X6aUa!u`U43=m3Z27Vi@RlVou@9(|2Mz6zM>2?7?Szt zF!NvgJKz78pJPye*l9LFc$$@U!U3J^iPNJhX1cX#h##L?>D1d&-{R5Sq&jPQEK`jb zxM2MHfBG?dy9xDs&i|ileBkBrqm8SsvP~@S^ybfe;&JHQ@rC;(oe$iaRa8+g-%}LA zu&gxtI77qP|Cc}epFam`gP8n#+4$#j?Z5YP7~MMhm}k7!GVL(6X$f2$z4`b5yZ@gr{diyQME!2C zyK@+8Lob#5kEkm%b3==zt0bOx5}1n+S~v0oB#iN^XL6P zP+9)Z;oontyWj1-(%DnHVCyBLHTgOB)U2nT_?_Ul`LU?nVKtNHthKDO&em{>+yF(? zr#FA{|DN}L94~ib|DEUY@8lShlCQ@ZJ-e-nF=zyDnSoTngmuFH*tM@C|?c1aCQ3-vxZ67udieJ zQ1RxS;DL2^{mK7w_6Ee7bW~->%@SKD{Ay07(uKv#Hf}JA5;k7SBjR>=*0+S)P0Jts z&jiiNMnCvp$lmZ!+>haKx_d)98}pt&&iDTt{(jO``pTk@Rd?3a1`(}gjSCbFk`wtG zg97{aH8|&d{_pbV@#pXVZ+_h`e(XQ<)B5jM>&uVS2g|0tJ(F9ps#ogW@L${y$I?8r!;MXWz-0jBgIxpFdV#n+Iwn9{m_Ef2@A*@&D)B|Hp(Z z2-Dbnc~xzu=N8$OJHH!hm&{zvsJC7_iu3TnIGvO0Z=8Cv_vd$?Kc7GU{(tsA_v8PK zpYH#Db>I5Y{n9gEL^YWnUYi&_*PAu`bD+=0^qL9trKHS~thOAOsh-funXIRB_m4gQ z|F=7T-v3-5Cj)Zxz3~6{1pj|aDox!Mzk4Om=C(wxb)~*jwq_Yfi{u@g{Ck6wt1U01 z-vy1v;?MtW{(OJ_yng=w`our>0spGw|5m&Iv0htk`t3qcR@=A3*OojCo4`0_(TT2C zQu8ABTV5B4IB2W3{H(*R_WJpq^_6x1zW@9W4&?pcukJ5DvVXC)_h}Y~Lc^K<7jFvs z99#6|z1Yz?F^w*1(KdZQA9Oforzl)Fe(wML&iY!A-uuXU<%F+G1hMO0xVmQji-4*v zdX7^wwRUTty>QfZ`s}rb_I7UFxaHc}|HU8r{cS;KH`Raq^Emx;eckLo?C*ORf35iU z^TUPMkNiICy(2a*^^K_5@<%7w`-4)T(p4VO8@~*7URbctDdz}2aOz3Im4~~M8`You z=lX14_UHehAM5)c?Z5Z@zwt-;ncwu{`v2{Jz`DTQ){h}v@_~$KN`kKQUc>8xUCDl~ zC;MCdO5d~EsQ!O?^XvZT|KBhDsE=U?s8?iKF~60e?!){$;+sntxp%nV&}e@oUMS(0 zJM9|dYeR(+@IGled>X)s~pKhoQ}P-UNoHKizry)?$-Srt>Q6xZ5O9m` zWgw{dd>Q=Dcuo4E&I`U(sq-EMWrVsl&(!>PO5e-&Sxbn#f%=Z5cGpW>{o8)ld;Pop z`Sbp-`}KSNf7AGPyY}Dh<$uawZJVVVdiq7a<3v~0}Gve@eZo_xbsrwafnVO~{L1vi(Iy@yzXl zaxcFh-+0^n^F%f7j^*B0ucd!n%Ua>|@99rSQ*yseSN+cO`)f|sTh%U(+~{$5*BOh& zwF@eFSPx5>3YEHM3D&ZOyjRsqZ2PzQs$=dukj?w;?Emln_y5q3>+T=dfB$*?{I~x* z-DU@;&E3Eva^Pt7^qZ~KR|H=-|G3Xv^VM#TMv?N0%{_#0Ezp=vCuW{+f3^ER|K)#+uId2EyPC`lvs1UO%Jw@ud-+sRiPcJiUoVBb{m;}s z_Q@@1@fovQ&;Gys(H{H%fBSQJxuf=Xp8q%g+kaT&t;EmSCv8?KJe+if{m`tALlP+_ z9G#1Ida$wH;yY^a?Vh0Q^?U!TmHwsw`EX+Y;K)||Nmca zt?>GN761L$$L;@lxW4Z1v)}*!`PWx`eU%^4yuanF^|A-&*YE#*`upR(BpQzi-=nCEi2+>MZ+r{n?|xPyYV?pYML__g!T8a#7`v%a_&R|Noq? z|Kb1b-TL+SWx~Jy{r%%|{JlEi$FYCD`seTOHGhA<{_h#_-@QL?e~+95|5EE;t+xMn-TeLj|KDzJf4{H$r3r z|Kop-m4CeZ{r$Z?tL*=+smTA=zWT%e-oHOz*CfAEzWhJ_sr(PS|65-FKmVz)f7buI z|NhLc|FyLK$uo<0vpx3A`}lPJ)#{J@7yyCs8y>Fg2jQ=YOyLzF({NR)1bz@%!s)`Tx`2-dTU> z|HPHHN<2SI|7q8qt5?7Ab$|L(`@fG?+t>Z${-3)4r}9hr_kH@GJMHD}&t!Xe_u1F) zC+ur(ti1c@|KSh+KkL_g{@;K0fBSiP*?<3K|J=X*Kl#Sj{jZPwFRy#Kzvq9uc+H>7 z_kPC5{TGP8+xzSPk5{wz@_*m`Xn$Pu|JeV#_5Od|{xRPC|NiKI4?BOdANl>~{ZISr zPvz^R{}@80c< zm4SaAoBp`}`~UT)^7YdH%iDfkeY94veKTL&qu@{1*I#tp&HLP|`J|Z9RK5Ui9=Tc5 z7%nb&5wYcGed3?XqCbw;{(Hac&*l8b|IY>37Z|NEI?p3;^ zX7{NlQHI5gs+wVjTh5ejd2{B?{#kyuO)NPVj<`gs%4-IATzmHa=*Rzm{?)(#A3OK| zuiHQV-~7K`!@6}C>bUo4DjqPkb#el)SO;Ze>Fx9x|G7Gwz*6^h7&*nVcb z{b#?$zlT4+|Nr*y|JI-F_mA2Cu{n`mrMZ=TTcqU@Kk+cPXy!G7eP?*8p8CyA=`&JI zdt&=wL{{r?JZl+69Jf1|Gt0XdsiJ<$T%w^+~e1`pp9F~a^6qg zx^L0XoTXn^J~$9I`M1)o&YCToe%43+v9J9i_=h|5qQr_CNOI|N39v|5KemT+Y^;|L2k00j9WZtD68VLx@T8@yX0jW(B-6?RwKal|I6p?nLFA3zdu%QZ`LH=`*8iY z|Es@0`X5#H@4wCd|NVdM_y7CVo*(ycdd+_37svUk<)fGmd@tuY6#xI%b$xrgp9@)E z{N8?l|K}gCE?@tj!hIDMmm@k+iR!Y&}WSo}!eoRtSJUWuMIP4(8N z%eVghc=h;v?boB?>#wgi7ySI!|Lp&NAzS{g6x&h%w$gZi-REDwzsu)6-hJ1*zUt5N zwEFlze>`q&*T4UG`nTS{uWy@wyZ+sNE7zVsbNIcb{&W3*Y&d^|art4*7{iPji(et$ zOBpU4o)cJMID7B9O|Pte%{+a;nN`&HrQhx;E^qnur~a?v{rCDDXsyksc>hQH|DE|? zc*yd`Qc20}X|5@W;qf~qOjqyR@HE)%7Sp^;^;cP?I!?iAlDG1k{~vc}*njK)@4El| z3)cSM&-VYnne+V0i~iLw>nbkJ^{>lX{JZ%79r?OHjPbSKnCp*m_7^jrWjnHA)nZ@q zR~~D(8onx=pz(h4%$-S#XX*P?JFeq+;ybZw`X`}+U$V#kfAIKv{{H3vpyS(iJ^#PQ z6a_1FK$DgFQA@$Y5uznAI%e(U6#%@JMZ_9H4ZdfEA& zQxi4nzxBg$>`RB9p&*%O>pU?lf{PCCk zj&m&4dcO^L3JjuN|K(us(#z)ybT78HVvERlo$E5Yb;tR$|Ajx@Uw82Twg3BF{@qso znLq#2{kmuIIZd~>9GbRopSY#jCF|{%uIuO>xW&MpRyV=(KgX(ruH4SKB8$cD{IQq) z|5pk$(Bl1Mzx|~D|1|&qP5-x;>0*Xz+V!N2j%(Rz|8?$8JbU@<^_R?C2Lx0dpJ*+4 zYT<73H$!UA&w4FTqp5w<>;L)_>nm0Mf71N_$@u?eN8=mk<7-no?i*h@9(j!=Z_ShL zQ#M_%nL}Lnid+@dKFA+`pmZnL%X``WNB{pV^z*v=r}gtct)KpPf8eUGEjvAOZLRp) z{xmmPMy<}RRAahjX{0MqG%HgfiSrx}lTq=FpZ_O+{D0%!fBv5T=KrrhnE&7R-~VSm z4f`km|MPFX-QPm{&+AXU$mn*SEfg$x?S#IiaEJG%l&^YxBk=pXyTdknlu0XUijHPW^UrnnPx1Co|1Vlyj|NQ^ckLT{c>i=E&|M~8Z`cR`+ zu0|XYTQ{#=xFu>!&=RM$F|Dzazn@rt*~}y(Au*PVwXz44&gw<~@Bdn_Kk@%BkAJV1 z|B3%ouemuj!@kOS25Y4fgGg`RSrJWM24!*UKBg>=uU3IQGkuJhGg6QL_doGJ^xXfP zzxTbL$jhCyuQ~Pq=^uaDrRB%?9422|<-MnorC)HVuTBG_nbfXpZYm}?f>e|KaZ7v9{2ybf6o8FXp`tA_5JhuVx{C;_nDcrMG1aT zR2tuLe9wlynSX;@r8$9c}sl=1=;sJ?H<;U;C$@w6~vB|8L6w(?8`;bo7UM+&vIo^=-ve0KieT9mm2ew>}DLppBrr((HXnWd+^LEizwJTbmC(3?#AsF`S+J75GQ04#)ioi0* z^w0K2K8uR0er6Oe6nLDqcx_w-4Ie-a?D|)q?bm*) z{a60?f9r?;)-V5`oIfYF%7r;#Uv<_>-c_cXMK?DcU-p#g9Y4; zE3_xMuV3Wn6yY`{NL(sQ@6r|-=L;u3duPvlzNSL4t2O@l{`mI)Z~vSBPyclP{KNl~ zHf{-Bxa+saliX=q5e>(hN`B|@?&3P5#aZ`qUT0Ui+G;1;Rc&V@^V|MwDg3;D`C~oL z@4q$w!tZ|lfA;^%KlOWh{f(IA>u>pAdyuwWzHV-P<(K;(75?x4x_|b6f`xF8Nb5Y@VLB_}V8~(>AVkU-!rCM}5ur z{`QajpwOuNQ-5pclY@Wmzm3?G_UO)%+gXgOR(#ztxtsA?XyDFcZ+LyVJGi~Y_4aI7 zR8a1;J^JDPxc2{ZL2Cz}?4Nh||I;H%j~3cU2&rUU3S(nb44oc4-EC=+q14vpm-DA_ z_s5j4ul3DVK6_-!?1%rgKG%Q$bN=lAoqy(wFx-)h$e1(pf1y|5vUu_3UJr!Bznd9J z9|-*Qpy`t2#sco_+OlmuoMKUI%;tvwzef~Q7X7RI{=Z7{&-eR=|CdWPSjT!-2u|v6 z5|Movk@Eau>I$Q&2UBv2&wlylyzJ}AFtx($@2BU3=BTW>K0Ja=>75cg9t=zSUbN+zyIg_JO6b4d5}w4SdIQJ-(-?y=~5@eZG6rDn(I`K)1P|2 z8rJ^vk`^er(UdABu=K@&+Yk2J+W+7E|NOK6Isa}){)s=wAaYM_ZsY#>NB=+NQP?{31^)>VhXUEF{}}I7 zzup^>_W!KK-g?K?PbOc}+0(J;o1k4)>c!a){$FG|!2Yt{?Em!#|I63>w_N?FeC0pK z6A@E4Dg}1-FmQ$O&CAfJ)e#JTrq$~8(qi|TCHK6d7`mtG<=yG{$G+~+|7)NlB%c0X z^XdN5U*>%K`pu3S7_a%h;MJvEJtqy1=B>vjbj57>@Pz*&qr9zS)H7Du*!-6IJzW2z zLE9gv{@;A6e)_BV2Mrf2xW;1h_-{~lvErPAT(3+o>|VG^sBa~A!pB*RGHdl;xA^9@ z)bB#o7Jt=g#+7ysYuU{nS!w@Pe|4GbaY`brdhW8x27BxD4!3GfW>{(>av`s!ejlpF z`6m6(I#l=mTjh3I>x$fs+zUD%6Q`+p_$g9bBIsU)Z0u3TR`ycY} zyw?BNRrOaVK66OmI_NaZ+hM)x=eqS*!xAHJyzZE=NvXL0nu+*US+0j$L|OA&{@02A z+x{>8bG_F8^r`>#uI}ISz%1tTx3jmaC;FUw?ds6Zw^!uE^X2`I_PJ=e1s}e)M^vV^ zVsiA&|C6&n@IwNo-m>$*H@ibRTk@6C9<7OsKd%@4Ah_znj~|CFE-RX1!8W7(YMa}O z-US`($9g}k4}Vw>+W5Zw(|Yxf>&yNAw@qT$zVXwi$jS-q$&OK}zf`y-`0ku#_i@VZ z=zUhiIj?!weYXGodjIX${J#!bWuE@2KIrHFpuhaQXKzP2dcQowV&hobb1Zer!M4hq zTOV#(W-wb(%X@`HOG{|p_Dlb{*IoXf4H|e|`Dgx>f9!g9>+gj9`g7DhJ^!G^GzZDg z;oEM8SN&NO%D`;c%=m8My-WYAv-z@Wb$1B9yZwH;jp!Hw<<^KnZ{s*t#oR*WnZ-UW|=eHJ>tZvSglDk`f{fSiFjD~ft*DkUK zc+FjG;r|ZJ%Krry|9?Lr5HG^gc=`J21``h7#aGU-C*9Clu~(QWL#oNBi{(m$> zGUZ?PJNo{WgU(@E{;7V_Kk;`j>bd3I>x?&@e_|J&x@cd@kEHHomW+jJ5+O!nD`a0S z;gl^@{GvB0@o?{ldQnKoo`;0&%YVY|+y5tBp5A*e`Nc-No)1>D`ZHc|bXI3auywXr zEjVDb#jO3_iJ$Qh8_oYiY}EU8f1S_ND3@gnBCP$7?RlnbH!ih&!m!im^|E5l^N(Nn z^B?kIXnG~m6n*i3to#4num8{fAN5d2^K20rQPCx^AGuSdu7L} zUoD9;Q@YH!KKtpes$wU%*LQX@mV95fby|$tch|>8UJO^v0@D>ORN+@QeTR{@#D~ zKjxqRrT>py|KE<%(>$~6mc~Y*x{#*D+5zjbuZ1Q|i~Fp4VD;36n|GcmEn$3NWOe_< zPgJLh>;Jmn^RD%#m%G)je`l_-Yj07B*4lXHkAePA)h(7`v-`4=gpC6&teCDroEi(N zmqAXApJM&lp4;n);Ja#;exsd}tphjTJl?cY=vw#jKL*SNSJjT1+;3ABao98QGdNV& zfi^3H6MEd2{j1mV{7jS)u6@3s@7-@$U6O97fldn=UAGcG9`# zvOA?Dz{v8z)PwuaEcWd9X1L(ai9hzckYjYZ-mm*5KPpQbRHaHc3)$RKWL%Osq0({P z;>pUoGR{$UvmQEl^oDYtTzQY{|8;20!0hxsZ9MsSRF-b4X^6huhR>HO?&U zOJ*S-!Xi36R-J`J3p52qN;gcGb-1o!r10v^k=UcB93(bY*|#y4=4>_pddb*W;*{uy z?@UX#N(r!3C_k@%sRd1Xr~iBYir@93{${R~+}u4^ZU_FB?{+O_EU~dlHJiBdv;$wR zgSMow&-vxIX5_X(eE1HuGXdg5*}v~292iWGu`FNw**rl{dDX*Bm(;EXnS5G2Wn+z> z=PT8>EgC*CkKN9pdGX5oGyh+DEO;cze&LM$nOCPu>a&u~-d@cJ-SF^u#R5yNkF(zJ zE;f5O`{jS<>lgpO1D$FDvC#E@^y(=a(q`oC<(t2X&n6(V_fTBc!l>hmI-6CTT(uVS zX|{+p-|l_!|D_e^(4qT(=7SULCF{@ojV7?i8!q<)`|tg$p7F2zIH-yBef59a%-`=f{SGe_>1Ud}RbO+So!vxr5BB>T zJ2}{X9||hqX@0om4*NQ*PbXt8pZ)UxDN36A z_MShd3zZh=JU4p&gzMp=0|I5*|4>ST_bPtxR4^bj#I^8@vy;a_#KVYuvPB zg8zp_iH%$Gmi`xycZJmJ#h?=XwD@2B30)J#qY|?t+9OXIAGE(!+Y!Po6|A;v_RA9r z2ag*4G?zEKY_X&a*6V#?QeBoJ$Jf3=twv6Z|6PB$;MpY3{k~^*N3=w^cs=S@S#&(^zD|<& zqTmBIuNWgz6OZ0YxO3uX{628iZVstvr@#O5U-adkR{`=?Rt!vf$}4JLIlU6N<9qnl zj8b0pE!UC*;)6_?8#^Ew5>Za>yZqnWEjilO`IlV#uIp`E)~WJca$Qxe#xCm`zA`yd zcNyPi#}zlX?3nnozTfY^{IdUdKmIrU@&E6udVjC~`Zw)AB&==UVXnXZ+O5gI_vAUf zd$n(mR#oY#3-x^&i6$G)n+RSmPJNqN^8e@VAN%|MmH+<#_CGj`@^`%p` z=e64`4A+}wuVY%$J$**Vbk)6jT|uZtY#K|Le<;+lC;G#s`*v4h z-@Sd)ERBuRHV8^;zTi0bq&{&oQ-Si|{kKEEK-zfIL2bOZi~if5`{ra-Kevas%Xi_; z)uu9xZM6pHOv6pupBjoTiHNsYkQK!+&wSDUT$J*4o3-!(1BGi>qO5q^UY44z4dl$| zGgL5oSHAQToAz_%E0WI7bCzD&^H2KX|81a*32PkI-*)|{#wNJ45?dqIen`x6*<#NV0uhfBnJ!|8+m@S2I+sWO%lfxooxZ|5ORj zN=fCag(ghSQ;&bR)Oe!G`X^HM zd#SN^`ySY_dus9v@ht0QO$QB)7Vz(!`s;q_m;Jl{?f+>HZUckDC#s5RmO;63WLwjn zjSFX7GK$`DC34r-#}gE`yj$zCk2`kPg-2!D;4B7j;@#H!6+gqSx%NwY$EgeTTNux5H~Rnh;=})kzwEdEx1a6*{`kM|Js;NZFaA~j zvt*r-P^#Cu=$WhnTzxb0L_hyeS?zcw!pQ0Rp}Ywj?H3+69q|8eEZEw=|Gz=9%J%p# z`zJm)9F-e7*EYC*p4Y{l3tZLpCAlU16uxRGwtl+b!yES9FtIgsFIx8^fB%d6YWdSL zsjd-`wbvwep0T^6x1~mDXS}0{cV~iY#|an3>zll$D?JVSRsUr*w5_lAU;SnMZ`c2~ zpU+zBo%UmL$VzuX=NElgpO3p)L7<)8UW z{=Y3L|L5Nje1Re7YI@C!Kamrz7br)o`;csVn*4E&cNUeN>&| zf8Sp`zn^bBVDj`WX4ovxw|~bn*MN`f0zbOF`u`VPiQR@& zV)yGV{=c^80%yUNAFE3jI!!kBUT))bY!>rZZzv0?Mj_Tk&4Mdf)uFzxCJN=l|}<|Fb{* z|9$oUyeI$k@5N6pSd$wvd$sW<;pVbc$&X%Kj5?W+a3(P8SMBo*<4?0rZ_=<@a&7j@ z|JtA;;s5@>|H1JxwfkRq&8)B!A^!z_ACzd!6q;r6^;&Kezrckp!hZL>i}MUVyx`lj zrShuu$^TDLnm{{W)PLr>zR7EjpzWc88Kts^>sO`q*r!y^{#g^bBdqv>qsXco{5KtD zOp#vs|0GJCTXgZi(JhHX0ijFJ^ev6fpD?lh%1PJSGOKTY+w^B$`7(pm%3Hnn-sP+* z(la5h1vTBlt(jAE|Lt#>%&{;?{4>wz+K%E|46`qL&+I<4rKLOSw9bO1zuTvNkk7U{ z;)K>m-CyMX|F&^oyu-${)1@hG^;;Mxc$M`0TJ57y>*x7r>-LyA!RN0(yUxXIB((!A z;ZE)Tx4p}-U&B~R&iC)HpsZ~iw#%05Hr!k6c<3{q>HOD@t^Ojm+IXR6#eCIS`lpVTy*!<_^k2Q` zUwuR)@s#WT+f6FhTMtBR-0hdzdFK6P4jsOA6WkU&pOo(3Zoi!O{Z`$X9f`Hyq)+~r z??o;7e#F0+e~_)gXsb-DoksG%ix(u^;-6-4hNYAVpHiP#^<@tr~g&{t_O8BUAD+&M{@g258HChP1Nfi^Yq>{5l4rmMFHG}y++3a@|T{G ze))eTD9OST!7JDQtCc@Vo$NFI|9QqI&+crGmv<&8SB3Iu*{rekhFXb=! zxBNPCx8#-Uf9)9E@XJe_<4ba)&Te6F)5>Q3_ORH|B>&~NwI%P5GfZGx{Zu@l>#oOt z{=LXOp>X|Q_cyZWh_k4yo)XpGDYb3IX5B}fepa1`YT;zfL zxZCAr?MtK8Q01{Aq*Pd{pI^xqxB#udhzrLR2f zq}N_dV?Ck$P1O0=qO@X(-#jx)IihEEo!ha%bmiBuSM?~J=~uFU*E6I!*nfVsy5o^Y zb3qS7fmRfEWu1;JYHLdBU|Esd{T&+~0^ zU%U0A%-Xq<4ZKY)2Hf0oSQM}^**8JiBm#2>h{}A~59yE)s{%QX9kCH#0_wQW% zFMVdv%3VczE2lCY(g>(bRZ#F1nc*#Q{$2CZEy)oMibgMTOV?~)_(U?hfBt{= z-{;?J%Rli~>hBtRv1YbkntphT%<2q-C0DMVT&e7%G2?uRtl?)@CneJ>&y1Y*Nd8-Y z`G56s$Ow=o!;0w~3~B3Uy|lkpHs@#g$~S9gynHZgrK4u(((`;3C7kcwd^wjVbeLRY zdusORf0gLp`n$jGp9K}Nq6~LB88(DZnGjjRIjcBfK{HRdLf?|wlM$wF`&KQT`oVPK zHAR-VH_5lagIq9ehduw?fBAoJ)X4|&*9|W&-@56>l@p=WmmRwm7kE75&~cdfbN_U+ zhQ4JFrX6(HFZyr&qW|l`b2C%xZ94yV|C>K|@^9ru`5{J|^v@Z*>JXC@mAT!#fyKZs zhpX&eUVEH|c=;K|r#?b?E&o@)`2YIa|Gax z`y-}!ZAbqk{ueXk+n9JKI%^wnd7ZXd*tkXd;eV}P|84&lf3Da2|5oLn{;ztwbKlm^ z`flbwfAwn}<_!nlT%5f&bfvNXyUWRCu3L}TiB<3?bv*)==)e9$d(uxq`r;RvFifcU zZnr>ZvYWDO?Xka2?vvv~5>-z>iC^Zlr7>(`d)C~Ct=GY!`u-hgJbrq;ZRdaMzxBc| z+9a?>^gu z=gL-s<_>sm+5UN*F#Mq`+<0xxnlJCny1q5CO!9maly7YR^~7wO`E85;zHi{+d$#t) z{|8pT_Jbz!z(bGx?_T`BG?#nJVs3@$nwtybFTQ?o?bZ_>#xEIvCLe3KeeutJH-7hd z7Yg)bAGQKSKg({FjC7S5x8C+f_X+%G-taEqRDBeY>gxHgGq5yh zN}Oze&BF}$0_lJA*B$=v?(Vz4~jGQ*tAPmj%6U*&+JxH{8DO#Xt5N|CL@Ow(OqmOR-JPU$4(?pPm?4 z>>BE3f2GlP@sFq{nXZzqD*NY1=P2NjNR~*?nZ&T4-ZTX#||JIxQF9)5Kmj0=J(x2yx{z*PEHLi4d z{N>f<-OqgIEo7Lvy@t(-u`qh3f`@b91*-zl`R@eNj%`0^AHVwl{b%)`>*fB}`2Dxv zclrN$(=9H?zHDflGEZAm>y-OzEx+^r+BGU4MW;%d9RAmKQ2tk4+K2sNI~o5ef7-4Q z|4o0vl|QAAfc9Us&wj|~|9*e*W2dte`kk(oLs9J_e{pm;zH8IWtZnN_cdFX&MF zR4wO?e0V; zAODxkJ$LoT{~JB(GlM2a_$mKiahzjc-p~C;&7Nm3g_gIbtY-GIW1MR2|3088;9{jz z&cFKB`X8IFJbzOE`hT3k|Kn#1YX9}G{?S>l&*^u)^vm7YbxtoTwL5=Gi3u1yJM`sy z^Nc;~PxvgEak)@yd1mji+5h98|6lpX{^H(0`?s(CUwQM-;qC|WdcV25*Z3CYo(z(= z5bHHt6eQAUd3M(ofh{+$Uu@t0`^c>lS=C))U$+1K|Nq19e?PYW`2X(i_w1+D6Z-%7 z*Vm-)KX9ojdu*KXf4^*5O_pT9Ncn>W*C!@8Rhzvh@k zE}#CGXPrl?u?C05iuIDG7JLqPbW}e6Zseu;cK?p<{8az%x&0sY>hIUD=l5-Y`1||E z<@@*iRXeu($7}!UKK&PWXUgk+5x*}dvujy}$E~Bc4y^Lfi+AzwW7F*IJ*G;v0(2XsqkI=;Hq6sb4$C z>z8l;2k*C@fBV06e*e{@6F8TqIK9kfQY_4#8PryGfKSr+d3Ae~>E@K6%O_pML^L&I zYIA68-)Ep{ad- zfkW}Op14HQZ002lRk6nnbv|u#Gd}OX{7c}p{$*QT6JPKao(bZefA63D-`$^A{{8>t z?a2dj%M$dPJNF!!bt9>C(b1|stOm1#qW+%gc02aFyYSJAgPSzwAG`6b{`UX>`}c0| zo~Uy2T8mo~yN61|1OfhVj`uI-oLlv-)91JO_c!PE1z!%ejWxE7-5Ywj;B>8{xEhFPd1_U>+vZifTRkHVWB zx~H*DOMdoF@SULC&v3!OnOEiRp6V(vH#fI_extl^rmS_k-@Nb*|IR=Axc}?_y_P@v zr?(gIYTuDKuhsC1tK99trRQga7H`~ei=}#g$C>uCrL36KX(+o;A6z^+^;D7XWc{g7k&#Csf4A^ zJS?T=8)JEC9mCci_S)yX4t#;B@Eho9r5>lc?))tGE=*+m^K8_q-sskSP1rTA%_;V}!bI<@422&06M z+&9hxZqFX(w14nfWL#jdyp2mv@A_n!%G1v{A7y6k6kd5mu1Y>ASZS&85C3+ZQl}`1 z)-#q0!bOUidyj_%EaW&dC#ZPcqctavYri@_^>Sudeb|X7tcKSNmI)l4l(dwiL0E8- z!O@+UHH?jR2nkFVEGq859(k4|NiWu zee6AlW#R|_pYpN@jc8B)Ay>$t?-R6i%Ed@6UY?|08P8x%#+SiQSzXzZn>TD1Np{L{ z+Z)CDZ+*8+@SpVpEXk+#6q=}p6fV+TAn`p&YvNKjji;JSD#cCO-kWuv=qtx0viC=% zJL+CAef0m-OOx*ZqDGBV7wr9VsE~h`;hW_RY#xrX5pR18_!fBGc2JwD^jKEp;=M`% zleIhjSt}oZn1AG}>!y%D>cy|^7oGk8>)6A3Ma$EYr(9E?zie1^kq*6h?lsdjma5HAt^71eDaH1pQVO@ym#WMb?FaUG*XyJH z>=*i{pQ|`0CS`s@$n}GaZ&*E5n{MvBVl~;I_<0k{bcy!X=N{IwN}sjaip!24co*K$ z7)@{v%mF^J%?Q0b@id}YG zvF41rl+wbuz_Rmt$4~9$mv!!ipGcW;a?SY}fj(IqWGcK={7bbGqgo^;PRVF(sJh4T z%Fst}g}A1lVAIV>zy05I{XgeZ-XHgG{m+;CH~A@VN|E57^=lq4(_Gjjb-+Nz z$w2UE5U+4`c5ts{_^be#kftxw*sc2#wOVr`2K?g*6=5hX=(6|#2l@2>XW79?&@fnc1I)O`)ZHAIhHSguToI{`ZK1zh7oN8eWKD_z$I`!Ls|9399xb?;VZ-0)@ zUjF~(Cxxy!m;d3{KI$rSgv?32QkXhZSn@Q_45o8ZZz{yhYFi3SblxeS-s;=ws&?6c zagt)n8EZ;Bw);RU39T&SbjH zkmzl5{gm~Y>nr|;`z??B8?QLo&-Cn?0Fe~s;;?{eQbJ{1wv!~(Y7Gp}OgMjO!j0RF zX2ncrRF3a8oy0ly)z_E*w+60^oMR*?w5UPgU`vF@w7{GdA6uG^&X7uz-73>O$1+bf zX~EybFx{P8iL-l*?rs0|pY3J+9yZVgO8Yy1$?Nkk`r!KIzlxpAbHz~ZhYTnC*yi)M zu2q`pHFM*YRGX_>_S#Z&9{6yXZ#i@;E73SN(Q3QY-~Dn$A&k{d0=%y}f1O$4BH6i# zN0V_I|HT`x9ax^FoLca{t8msOAHzw%OiCp;v-}Rp+#L3If0EVN*Y!5G31XYdBHwLH z91eql4ASBY|9=0^xupLD9`vH>hRO%5Brw+2kVancK^@*8T0c` zzN^x#2U!d@svG>{u_oAm2PHB2MS81N- z)TJ!xeGyq4(*nAra`%=_yK&1P=1}2%)1b#5GY_ut<2`%u*0gipdL4ewM}j9sD$DwO zm?Ac#=(y%m8P@o4l~%#F>f^py6SvJcV`09vy*m2$f1W?bvk(3M_UF3q!TLQaM-Fqd ztmFLO>A}nE*EJ<+^~{TYmh+6BiWEyOb>eQ_5OhOYnPXd6qEn}-md@MAqd#7KsDFAT z<3Ro7Ss@kbQ>VB|YHymr?QNjka@|b%UUGlX%w>Iw(-=3-V6b)6oqX_Rr^dxc_1*u) zkJfKe`;-58|6P$k>fTN^n;ag@`fz`_kN110CH|U5jzJBjxkgDF&KS)sd^W?oG|RNK zDO2U}Nxc@qk3Lmmli#o7`XBDs%l2ov5x1p}(M+Q$%Ul8)XC$<2GC87tKr5B+c+e!=3Ob_)3OI7?+Onhn#s2Ge{m=3JasOBSeUU%u z-cB~#z+O%5F>K;>J^1=cbaQT+fYGdA-ec=7`Q4iET1(kQ&}W9YRq?D;t*5uLABMO8 z*Iw>6`R{p$kAdrUY~eGWm3iD^TZoe4mI*7FgBV^#znSZ-=Th@nPVsev&b-@aw*9#O z=zr_S`Rh6VNB_S+yXk+8XUB1Iju_#8(y5#`w%yWl)YzmL(L2G8xyJZVrAp5^owS+4 zcByi&r<{DSYt@paS61jmEB;$QM~e5y{4B*8UMmaOmTEjHa@1Lp?|Jaj_9Fp~Q@kaa zY7?9d+?w+(c&2LvPaX6;oALKOS;I{h7hC=xx+L)+{`3^> zwZSulmikC)8nw(Z{@^cl?smF`%+b>^91kZPDmf`NJE*G!9IFEV*Khb+ZTHXEs{4P> zmf!o$S^iJo^6=)K`!{#|^xm>1avCSwvo+T%#7_3mQ&O270p+AED$vF2uq;n zmeV}`p==xGPbz!5{OJGF5A9>c|7}OLHQVyC+{X}((}5ii&Rq8KoL<#sbZR0)_58^_ z7QUHXo31>1@k4*f@+&O`-?b0_7oEJQ@~OJ(ohrvU1rq6+8*fOuSPIU3bR*!9tH(sn z&&;Vo?Gsg37DZTze`Au!`?&w;fA5F(@#6oszy1&Q>4Up_?%mz<u%@98fA#v{`&Qq3(c0`aEr33(hVD=d{!x`;&r99_)9GNn3e-%Tf-J zc?F8!rwD1ZcJ?)J@*nb=eI_D%%?GB$3)7oEIEXOcQp$b{O2_U0lYD>p-~Revy6L}n z)Q7yd_jxgY!dsG;Z9Kne!tCz!YfGJ4L-f1~n`drvGM=;R!GC4PKnum*vnC(IlAi|c z+jV%qwwkN(Kjw4QY}4$Y#icT-*(Gj!EUNlJ-dK%AQOqmY-AFs=vCQQtBZ*$M$y~zM zKn2D0L-jlL{v6l+cc16a^wW&CH+AxSf2@!7(shrMXyhrE>ZxnVNps#-e#~iB)ZD;l zxoJEb&v7?0atc1zoYur_wT|b1xK9_`pKyz_DQ?CAg=bbKygZy?#1x#qvdD_nh*Kq~ zPs7|#dy$F6-z!$LT2(Ao_5Qi==>O9X;8^`wpU3fU`DwK$Np$$z!N|+0l$E=O~pMSO}nmI z)~^HEDt~SJhE~HT6I$nGz7kx1ZpM|5Jprk{H$)dEHnC(KXqn6)GiAv}$?Z}vr)&q6 z6-PhVb0<}7EuYik?6ODc(NQZYmbIMUoF}lqY+dZMuwYJT(45MZ zIy1gSdfd~i_0kBIbYl~C+SE`Qx40*%S9jyhPl@$QMKTN;i*ek8q1D&%@Q$uEIBDo*jFUTp|eNnQD*hI)qnRe z{hPe?QT^-xm483Z*J1p7!sge+v_I$9EIs7yQp&Y$?X$3o^~S5_Ub(}3AYJ8jN4TVD zQ|0P4+jXX%Ql2cyRk1_pPrM@Qtgz}mM}$fmE|@LmTV^TQ#yO#+Elsg^+J!`Bm13h5 z&C+`Y%*Be+mQG0t5bL=5sQ!1Q>Yw|^v=7#wO8+Q-y6o?Nw+H{t;@JM>K6XpYzQknm z^;CvK*~Fl>Ips~uV$z~Kj>#nBQT0g@?}CLUi)o); z_JF4kyQlV@3O({CMw4~cr<#d9%S94b%WgUnnW+0G zaiK9TKtJV}WtQRozk7uKbTFNIZGObA_-HSVQL)1jE2whpJlE&*(q`O(v*rGdo z7nogbyWL~lds!z~^2@ZW+z_uV+g*&)JuJk0)&?xO$hqw*tM0$~o&SGiz27nE@BMlI zcX9scpWaZl!|{Stah;*t8vY2k1hog7MXGbwu<97|rLkIwUX#`}N)*_r^i*cT1tz{C zgW1OIU$Z9Er;21m{a@Zu)VcE0jZFsb(=4_gihNe%w#KdDt(2PewV78cr_bt%mg{q` zRt;XeG23we-x$IFoKfrltLMG_pWXL=r^_CxUr$R-IHDH+PxsPX*79(Qx98U7D|z3| z>&b4L_;h8HWy7Rt3k04YvuHhhN}#53XG8hCMN1$5&(gfG<=Oj?Q-&+-)OdU+Zeg>| zoO@2>lGHNGhA%yAe-|{rR=>z0ypqT3@T3XH*WLY}YrnqXfA-h^N7nv-{`GkM9+oeM zKfl<1;D2zV?CX?eTlgN{Ghmp@lP%j(wN_?_PqtO&7kaC{h(_Co7J zeXB^ufqK0}HkUPqja<{X9?cZAIy$XcuHXz;N~l}Khu%{e(<)o0Uf|I5-l%rwhuD8m z?yX<@Z~l(2|M&d+;XkdRE=BII*pK?Am+v_~$|yV3XRb(?d9;ODNK40PiQ)Enp34LT z6OTGuB<@_QsK02+j147_?CbiQu{wTK{CHeU{;J3nLR}59JF&daX@; zOQ!|sY`xH<{cvyY$Nhg}WdC1(_1`(_|NPhe|4TSuxIe#`-}t|OLt<=vQkIB!WS7zF zC8|#8D^((H3*2s$>RqwqUbEPOh^0Q3jFYBwWjhy~d;0i4m*#~j&t(_H8mT4xQrG$zkAA_qG>TwB8DSS*=x-0rD^++huF^(O&dw=@2~eSYdk|Mflp?yvhFQ~u|; zcf{XgpI6_nxcJL{Y24;19*HhqD~?E>l{x0au*Fid!{v%(mT{+qm-7jKzu+gG=cX*b zq_Df@|M{yy3mE@La?SE7l0Wx`KauZc}7`zM{MIJuK~MtYcZ%Aw4RS%pmx7ag0X zBzEmU)SrC&@Z4PiGxg>R_ z7>oVl{CoL^?^yI$J3^;GeyO+5+TBG+Y#eHeK)y&?(mT8*0Wv8|V zN-bS|m36hM$K{2Y;!JEo%?Gp!ysWjRvK`odt#EaZs#ru{%&`Iv+1ATvEV$hqkHu=u zcz$BvO{s@MKm4y}{onq4|2>&M%e@U4U+&@Dkud*;(X7go8%j?xA6VJLou+bWlGkKT zoz`Psjb$HQQ& z$);39Fek`S_j*vF2vY->H1qPR7juQhIud)%UeZyOd**T_yW&VnOXt*=O{M}%Gy~X9 z_k_*#U3>9{^r8f_2Ybb43FS@kl@*@(MKf8F*;(Z96HS#Mg@^Y3E7I2fjSrC6{uYbnF!O%)~7dV}vG3GW}0kAengS z!Gh0C>jXZBdvvjF5pP+N_)VFE&ojl>Lg~edXY+!*MO^)=pU8w+EG_U=e7%$Xop&G0 z89txv|N6)NhrazUq!Y3G-)FVQ_K{316Dm0(w)}rB`1MZ4%*I&t182%DM2(gl7S&?C zJpZN7>;*h?_}DW7rOaws9hP4?v~*=G+rRbuj+g%N=au*rb!&=e?%wGujTZ2k1lh54 z7`RolmaPlCku_VYe}|Xu3x?@hM~n|&5`FZa%k$!v|K5ddJ6QHCWJ{fY{he;M`FKJ)8;>BawF3N7eA z=X}5E?|gxueHl)gJ}gTOBPLx*WB8Qtq&mIVsU>liSGJ?7Rlba>%3}*RK}E%?D@I@b zzpAz|{_lK;X$AAG;+LHlSps6KnWO~N8YJ?5@T58^ERj6ZE->+gglfVs;mNN8H#_~^ z?-XS6_8a#h4Gn|&oUelC@A5gkhVP8rhIbl%a}x}teO88Mx<$6FOu7~Q*i=+8D#Kz4JYZVb+Pc$-+f6WT?Z0?QO{p*To|;ZP)`y*3Se`j?C0zJFr*H$yj#C^F zj1fw2RQMd5CY-QP6e`YYO>{|FedYh^WzMlGI}UUtP2pl~J`i*|=<&{^BTEgqf+kxD zpHW$J$V{Dw#YL5E_05d;#_GApqW<20^?&7($nRfHy|=jk-~G(X`jb(A|EIn9@4P(6 z_=D?;*@By5zT7F`YWxsqF6BS5VB5QQEA4FM<{#T|QuW8)OAO8PS z?!%&X-?O6ofA;hJQgU;KYoAKIsH`uacW^z*md%lzCA%iguV zS9sii@_{eCy$wB{0_}gDuiFhn8xp7Da?&7DWA?pwd>t!{ptV&bu2*~%QpoqDHK@124@??czu zTa{eqZod5S*Q75BmaMtcHXGp_b)vn!Ls?k&jPXk>jnSq&Tq<`ZS&_5`~L0!oAuw-SC#)?Y%O0~ zl>h&;b-z8M4bzJohNon9`9*$GFR!b~fA3NIc9r-y`I>(}F2*hYeY(YmtM1Fid4^B> z-xdDr>X)ne_VKTL-A9A^q~v6lX`fH7y)Ee7zi->##7nk}CwBe6x%haw-QSY`51ZNh znPYm7Ew{4VWb<*AebH0aVyide;S5{vnxC7~H}&1_Mf+spYS+JCpu8iv{&07}-`&>l z_wiism2!{az5eL^;l+)<_kO1pajxnQ+3;H-NGhRZ-^pGPo~d)^^zpqt#B{RV+Q9Or zrQO?h$)G^%DgWwfN(z!zvo4VQ`u%w6Nk<9VN0 zqIm1$TIMlTm*3ak_r~_7&c3}qc7F^`HmZ%Li~M&=)p%CB{Qh>7bo zq%Pd6UtV-=@0%kAp$?l4uC$!9pZoip2RCw`xcHt~|98omly}$vuGk~Sy6}bjld=ix z|0+EF-Fi=lL+B!LMH|$q2mp(_iKN9^s`$RgCZQ zt{yvj?#aEdoT7yXA78EA5w*oaf_>q#b4~5mn@{aeVzdo+|GUIoOZ}Yzqh9WUJHJ-; zckZb%e_|mxw{7>&U1dCLb_Px;s(;}(hs*eNO=#9?YpqP-@X~G1PPMAGN^xD;aiwDI zrcV#5?;r5lo3*&NtZ(k-#d#UOrU)$#PQH^NB4=ycXVd?7_CKDpGyZiISkzV>YD(JR zb8^${lHKag6+g|ZP0Mmxq$V-U|G9nB%iu||-%ftGr>T7Pr04(2l$ZuK3H@7)>alup z3G?o$l!-MPygwcmS^v-YLE5L;DJ-Vt?^WksJU98R{{B0me;;37e0Tl6s{G>g-_Py; z|MaU}k=uH$dEV~o|B359SQS5FTGD^jyqmW`a>1X){$@Gns~y(rXDs@)xA}2y@W0&` z-%#G9*SJSKgOm*&0w-nXCcSdIkae39QFXNByQ zFBdwmzJJ+3Q&a8uQ?u}tKWAh%2mK0lcUk_%Y)kC%JQ4of(EFRNMy4qG6Y2fhivyMFMv zoT#)}dhBR~P06WaPk)6!ERHl3`{eVqg)CXNSzKtcccew(%iLXR(eVa%Z)d&w)@Lc(%kCb1 z->ObrcE7~zgHJB!&ETo|bn$t-3fr2yfe#j0y=^u$lT&%ZwP()dhdb4MRvvLKs5O2U z-*Nly_xHiYyQv$tu6V^%b5u9}{9|pq;;CnQlhr1!Sg*A3loiuKrY);FP|M1A%9~%SF0J)w zT={Rs%~JM<&!)0&HeMd+#J^bBWzCLAug8ClUw#OY{r;==s;*4Gc-L9ST0_0*i@5Bs z7JhM9eO~m@i=Nkewc_{f4)~sJ{cq>x2tB>Kx4zX^oKE>~U+*1r=(Vb~`}y)uuDdsU zkd!rQD7<|2w_kz4jgIs2LTp|4a*kU6{JvvTbo{oxXG*g26UC?ZOQ|of@@z2tDVkZp zRyXJ9^wgOz(h5G=Jh1!l{z0XXc!B%L2P>uRq`w_|mu0Z&0J{dyp93>4-Aw)#$H^7^ zeD1r=#@(?(OQn8_*l3@taKFTO^v3qNJJTJ#V)om6blnye>E3Ou>RQYswpG;Id!vi_ zk-M{H*SqeVtNh}y0aM)FKz5VLOQk#apPTGErT=K<@=0q~CZ9OgBED1j;X{QthF|*3 zi`1^@zuVK{`}pv2maB4vjOyKm^UaDDc}-$24=In}?$KPgr)kacbMw_- zx-LB3bTj0@xdWR#7jiCrG&Rj3nj`SGaHQ_v1IxJn_vkg=TR*MDS5-eofaT+zqRmF( z#x`xgW-q93&i=l!wb6p_bj#t*JbW)czsy*qU-zP~i2rc+37^8H6`}8fwq1S8^r(-? zTmACQPhpiyD-z<8=f%6LFY>w9vGVh+?p^t}es8^Q^U|e!+xN-SpZ{1B>v-{6XE;|z zAybaE{)SqsTPwxqc4!v7zLR?TMyIh!_QlgXm}_=?zao44V8QZ=RsU|ade2-Mol-90 z!ewEnl|5JaThFQ1T@KfpF1(D(dA}lLbLi!@f=}Yk38bp;F_+ghEfvftDdJl8Ic&$i z&;wtz_bT*liu!91E~6eTUl$Qpf6qdb{p+za5;NpApL>4^=}~8}Sqs!|x!KY0{z=S1=GDzTrge3Xm`eG&Ouw(6 zd~*7Im4`dhE*;(eJU(pG-h&@*-nz$EzRfHxt=yMa@5rasv$$U`O5(O+Kjwc~c;WKR zN_7*(e778($;-8L-GzC-Cd}abDR0Z;miY9<#n!e*`rM+r+c*E{i+`q7c&jHtWZ#*y z2P^Wk1lZ)R+H6_>!)rqGOYUrU!K9PDkLMKz-aX13w3yW+V5Mn0qrF6qbM>QgUgslD zEC2jn-~9gcQud6utWRI`h%eq7ET=9f`nNg!X{-9<&(phe=O2wySzh^~meYN|&YLxt zlNAnZuoBX@T(t1go?o{n*oE&<-hEE=UBIiLLwjdj->mdc`D=)(k>#siH|}tuVx?4$ zg}JZiJ!ATKdREep)D@{oN%K`XoxiWXeDA{BcJ(JpJ7?@$CBl38_B=25xD(&p9($ft zP)t90Y^VD>tM77lH6IGhmmhDhc9^ti>9=YI=EqNdJ}8-SUnlgAvFWY1CYLv}8-KdI zk=I*iz01XOYwYg+O5MupZ&eYUv$(cte#y2;{Pz{-=1YGSpTA&@V3yPJbJrFz7F1o5 z<=@qqy8g(iw>dw1%W>z{u4Q+$3b#0|%u@ek+x}uR`Chc_%0Rt31zA zKjHG^C+_8SRq6jfHnSI=e)zBXyqs%fef`A_kH$k^cJ+63UzFHqYf*UIe%J5Es>0?j z>_3a<{IbcOtrw#*TQ8PXi598eEL|ubr@L2*EhXaRVFNkg zCXRPXcaGi^<(LsC&U9+4aDZQic;D_jCbw+QIjgvG&Er|Hs_0aag+$F<;rt4bu%Kt> zbK^4}Metq`;WzqHy=%`7;kbyrXK&lZ^ZNNtXQnRse)#g^#|sudi`tgpWchpBoXuAa z0;bP(Ja_%Z&qoiJf4vZtuHSoJav`^MsOjf^_TzUqTopSxdw#g*6gi%52jy+sn9VKE z2Xz`4ZLXapKJ#XThJKitir8_DncOa$7GyLpx$^dNQn;zzj_7TBGrVV9Zn?YWMWay0 z0wvSxMy`iF)%Rvt&D1K|!R1u@*-b!eU&z<${bh@vT;45TU-i7bU+BeV{isQw}JF;OaMr_P;8>=!fxmrLAS?7}#!_e$`LOy-2Cr`K8DD_OSD zJn77IzwhCmr@avT`#vdPc2>Rk-g3p@ zJPF51%NMN95%zU!*QyX}`pepTV*9et6O%f(rnM-)mbo;Ow{i1Yl_TkH2EJR2?k(wv zUekKni>WMA`qQz9tcvGfC;VQtC2qqK`;RWavTn|qxoeJl(EQ^o?-kAsPi)-Be@uJ| zXY=0`<}!S3omPC^If)O8Lu9|DD_=3$5E%G9?)lZ3dm|=v%`54eKU?_a?1Rh8-?MXY z@%ttHKa&{7QT%)N`*%LCG7ha#tMhq~os=HeHq+euo!a^5?l0?0Uux-@dFdT4w+K|qh zaK9}lX6@hjf{K~J4V&NA_k5W1_k5?o+Q0wXZu~C}tNC>Fu>bkZVe1!vt+QLBYv!B2 z``@iMm$nL)rH0r#zdaXNd2LyZ@XMGl8$0g>ySJ^}^>y`ngPuPFc9q<+cVeLP>zqrUFK&ISG3O3X z|6Jn@-Kood8HIj*^wp#(u6vI8+Bv@7b2fThIrViyt2<`?szCqeh?K z8x(W`PyXv&q|Z>8?xMBpM?_XfX!Yl_HzR+q-^8`uMEHZue}ByvIsfb#)e^G*$IAbH zzgfSI>DPHJH}C_BgUZtv!g3#HF>MG1d>tzNw9chJ{;=dT)9I`3_(sAPY0 zKX;Q@-kIsE_W%B5qrBNhTW3YW(KY6)Y20w3)kX*goW=p81;q=tsGA(NbcE0kr>Rz+?_>rtt$q%)ae?PqSqhw0) zyfgYL*U$HcO30SY`Sak*jccNzrfMc1%-VkQJ$LNB`7pzE)`FO>d)257I zo?U$(kd_s<;AQq|ap$E|?@xVy^>yUesz?o)8*BI2{kfB|CHPhN=7P#^LTlrz-Y2XG z`TsI-`huI6u134gxj5mo=nt7~+UDMEK0#mOoWk?%&a%gzIbEHZYFk;lT#SFceVL(y z>ym#DO17|VD0C5hBuJN855I|CoMkzs|p>AJ=!(r~a9JY`^56rynEb z=A#j!8~1cPb=A>NsuVok9kEX<`{7Newr#7+53S$wjXQ;X*~Ns%wr7`SFYfswX;o%o z>mT{kZm*o%xq$l1OBD{~eCqYz*Ll+1QhQ#dYx?P&!pzxc;*W$+eJgdy=cc0ci3+yL zSFzKlXT;y^c*U{0>zbBZ1Z|%6#b+D2S2n3iofFrR ze7OHkx%Sld~;K;{aQ0+M@88Oj<&dxnH3iw#Fsx!c>mnJ`?tZ) zHLp+1oF~3ef4Aqw>#q!7Je#%3QEyr5@n*;UZD&gFukx3(|5x*WvH$z~zjfN&Us{*$ zkx!O9%wov2uUSl1c4e~lE&j{(1py5?>El zo_$r9p}(g5+u>R97hbC?yi}ClD7PxvfWJ@VOkKP9%LipER^%A^+)}%^RQtN#n`L6s zp|u~J__7vq&fRoUn0-t4yHI9MrmcEE=5Z}w71OfK?6X0@6B$0IwO19T&Na5LQuo{J zt78-2`sT`u_{6G*64FPP9Qt)|Lpej(k7`!Q^uB`Qj3Ry8Smz&=pR(oL{F^K7FMawI z6SrNj>h;$D#b*s}{XAFn_P_C;|IhX(A7lCJcPRSz|F0kSXGyJ@``^jy;-~+&KK#F7 zY5mGB-2HFpng4=~2jd>wI|gm}w?F&m8QCh1n0IZi?uMpDe)HN_Z}nkUJQBNOhq12x z*^aBc?US0$ylLNk+Hc`at+%E9|Ffh{iT2d@r2pB^v24lL|5dh+_sh64E&Fcqoy|7;mwx!nnxa3!J(1S`@}K?Cf07cvp|*HM+o_(r z1@%SeBSzwOue`LfBNQ!`i$)#|L48iwVB|GWABbNRnZ^M5qk|KQ&Kzy1Cu`#*>6 z|5yL$|9>UkxBl1rKOf)!-@O0-_J33VKe}H3C;Z1-?{&YQgx7xh zv%UWB`hUI8|KETA-~Ru#{Vx0dEWZCwxc+VaKlA!mfA|01{{O-Gzs+m^zk2_#y8hex zzwh^de(?T(Z~Xs@|MuVhyZ`^?`<36O|9}4f&-?$s{~!DR`)d8q^?$e5zwZC{`Yiw3 z`FH-F|Mz3A{D0&6XZm0Le!u_wa{oX1ys+IL_rI-sUjFZR|Jm}qt;)Zy9;^3|H;Y>T zUw>i7w?F2>Gqyagm!04J^S@cuhkp<5rQ7Sy{ZVW_Z(*C2*113PZ7M!I-j$rMZyB<9 z#^Sthb6zjWd7I(5V#Bmsd6N=y=FC4j+s3R=iRs~7wf~pT@wct>;f-iHcS8T2n!lNS zeZ~97zwPhe3b4}&y5fB_d*Ow}$IIpFKW3~h@atOVS-Cr@TJ883wUx5VV{fk7zVhFf z3yhk4-7C6(@~5Yt5^>kqwePyVb9dfx!RR|3d?~@+wNB5JuHKsBch$IAzUG7D$4j>^ zc2+bjbbEg*Sz5eM=CxnuzS%kZW^|o6J@=D|$GvU6FL#@BIUU~G#9`cd|Fhd%x%dDc zHP+cIiBYF-E;5MLi@SU8mW15YW`&ryJpGd-+*zY0Sv#v2sPeD@44rh&b#bR-rSU;Ca-#Tq5X27lV9c>N%fglRW)Jrt}j)ep6y-vYyX6f zrECl~{{M{)v;P-gd-i`v*suL{O0^-jFRxk4@lTSmsqt@GU0@bPY)LS1mj{Ee>~l@vdmWw~G8yt}euv)c1d?>_Qe@_(7 zXh^ykcK3!}-obu#pZ^v4g2KKJlbh$1O3sY2YhEcGx{E0?e(s{@CvsN&OL*a@mYiEJ z^!)ppw0RR}{Qgq$;+J7n%m$^;JhPS`-}pRLg%BzNd%xASUSii92F3(PxJ8k8q zEjxB4v!`wG3fh$=Eyi;sEBaHT>^*tcTVi)L?>(w3UFCG?(K~a)Iyb$YyK|=RtNF|% zasJhRo70bq#2L;z!;(VOOr#4qW@@uJ@oRziz<)0ycr#;V|HR1gR zbG=TMSEUwOXEr@mpRN1)%>AwWyz@Fc4P}G%%e6Su#hYS*WU1Ph^79EprNvCUD&cG z(h9DMEmvP$*>bgD^|Sxes*`g4qywv%a?i5-n=3Md<^B7fdHu)Utq`7j^qF>tUVG&- zT?xM5g%($S1$C~IPg2f)aiZqk>Z+_&fzh4`(LY`^xy(e#7(^u=a zS#2|u`uioRti8?m(y7ZEPb9hP?6|q|L0oSCo;_wypT9Xer}658|I69gA99-{?pOvSyU!q{7X9J=vul&pk4L9}TXy?MYir_>&pHyu zH+77*6(;Un{Y+ZZJ;~Ya{ERglc8Oc)*MDzHm3*`5$=q_MIp+$Uwq0}BYBS|m<-}(0 zrlV$gIW}#Luh|v3@)_1ndhaP1Yf<^BJK|*+#{v1{JFJR!2Rv@M;JI|8v~>TRZpm}c zR5jzJYCd(>1YG~QXY1aLh4+vDI$ij$ra)?OX6woef%zhbgzEV-KG;~=T1q@CEZ5GA zVzPAFap9f&Nv7+wo;)eh`<`gKJ#n!|jgdvs#QQ(9KkIZI4mMuL-xs51m6~^KW&h`z z$I1UReU6;=sWz^Bto18D z=-uj8o2Ut?4=1&G*%n@yxI5smc;z1P*0Mhd1#w*+$DVJIGP5&ZKB0?cEBB|^rv_WA z`Fu=+QyL5MV)h)A7GHj{=XUCqI`gJ~y|*5V{w%Ca-7U6E#5X+j*4v_U|uy$MVlIFu8b#;OFSq z2T$bs7{#t{f3J9cmbKg*IT^LAih?SZXE!vSF|L}p=%UfwneB&d>guHGwym_kI_0aT zLP%)lqY8ndKzaN4XlCWKN0CqVL?pYnH>Z2nTKWb({-N5^j90V zv7PeC(+@o`?dpnD?yHw>m4-U5l9|4zNyB&Ez8wa>ayPU3AK!iO^}j;6H}Ajyb5|d! zUp{HF*}vbfAJ_lbZT7F&>-qP37wP{`zrOk3!*@8&?^0=^yGjcCy~8efb9mUv3oH=-&t-=#gRAf{+Gwz7ExBvgm zyVdsd^#%2(r`lC-SP)W}{Apcv|Gpnz3J<@2^mWsfz31PZ6L0K(`giyDx(`SBpL-uU zec|Igf38n^DpnUgSDo1hWGhBv-pra5$W0kE2mq}*6(85^M{q!Y9oL+`?zu{vG{>#qVSD|jiaqaSN`HUUt=39n zj>Sg)vp$fX@ag*0>CBfGCcfVjtX`lPQot@1b7j)-$!vh>=Q44;6Kq}%R2AL zv!s8Q7F~%`zsZyT@=%bks$dhUE*C(gC+ z_om<}GxlTzJ$PH5?EA4!LcUVmE_ma^Z{WxLA=Dj}#TkPt1_M@nQ94#~h#*>M*j4pMY6YV{<-V-^kCl42RsLS7OE_o&$j26)wGhoF}*q(G1)hn z794#l&{@yqIGO*M$Vs=!`%We1|C+RYa=+86^H0902qPnUa(2`dmt5LE^VqpBE1jBt1Sm@~8A@C2 zobY$SglE=wZ6&6M{CqWuj`{SuUqt`j z?ByAg_MAz!JKGg-u&Ku7plC*(_5S^D{;YrWRg^hkt>V9amlC~y{Zrol{J*t^>%5)8 zM@ROvySE(O8F~2QKYh8ns1&Pt`y)Mz_FU)G+v025vi;8gH|>V23l|1kneKmZNN!Gk zkmSN`X7;CEueaM@{%rH*^i}H)R2OzdwaLBo2@0Pc{N(N*f1U>6{jK}w1|2W4le7BX z>|So|nek)oW*1H zJk)Zxb#n4M)@kV<>^4p2o`3guT~19 zpSUgFkEENv-dZ_h?a$MW3)Cym^zW0~y?CJLHnrHid@77;{$LVJ)9`%{g``d=+$EAZSdFFJU51(GDHt)#h)!YZKyws_)(D|uTW46vm zr^aN>**9m|e0#o%9JVy5eIkBDZPvO8WvkAI-V#_l(T3+zuFk8eQp1rkl){PZ2C);d&)(~-gM#4_F zpGIMy%D$&A{9brv7HdWOqUu70o=Gu!Tm_yVj+MNdA1=KmPt!Jae{*oVmX+V3-Xx~z zoxx{TyiQ#$JF9A;&&mngSLAJflhY0E$2?_bQD5kc0cd%akldG=Z%DYWlCu*CX z`)+;tYUA`)zjr-l#fGoeTMOG16&q(v4kJlM4)Ic`To}Bel6qeetR#3H#!9NKbow!schz`m@m? z(zjCgPQE&QdwRg+|;C~{Nay^o4*QbqOaHY`ISxk+o%1b-r&x! z`aNd<^5q+1%L{BIc9qWg->Y~a{rdkEIiKs-JpG*4{aN>4__6wj_x4@kV0eD?zkAWO z|J})Yw?F=m`m=x5Oo>*RO861mqi|2oZUS}5;(Xa2qFA20qjpFgle zcl8^ev-gb3_S}7yb99c1f$oeQrvA(CR$l%5Jm~Sx<9}kJo}XKM-oCcrd)$^2_w{Y& zZ+n*h;qqsh^mzsMY69Q;#mv#2v*F>=(D$!jIxjRmn|p@eFt0WB=SFVryGJ``*f^b2 zStBK4Yjf4G$m`3-br;N6yf~TY@w$nC4-54?jA+ gOLajb+gq89f49v4cDXL^-ShwKH#E8h85(#P0P8{AyZ`_I From fa08d1d6372e389e0a34425001543429732410e1 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 30 Sep 2024 18:09:04 -0400 Subject: [PATCH 033/102] also apply sensible regex warning for `repo: meta` --- pre_commit/clientlib.py | 2 ++ tests/clientlib_test.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index a49465e8..0127c4d0 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -289,6 +289,8 @@ META_HOOK_DICT = cfgv.Map( item for item in MANIFEST_HOOK_DICT.items ), + OptionalSensibleRegexAtHook('files', cfgv.check_string), + OptionalSensibleRegexAtHook('exclude', cfgv.check_string), ) CONFIG_HOOK_DICT = cfgv.Map( 'Hook', 'id', diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py index eaa8a044..9d31d339 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -256,6 +256,24 @@ def test_validate_optional_sensible_regex_at_local_hook(caplog): ] +def test_validate_optional_sensible_regex_at_meta_hook(caplog): + config_obj = { + 'repo': 'meta', + 'hooks': [{'id': 'identity', 'files': 'dir/*.py'}], + } + + cfgv.validate(config_obj, CONFIG_REPO_DICT) + + assert caplog.record_tuples == [ + ( + 'pre_commit', + logging.WARNING, + "The 'files' field in hook 'identity' is a regex, not a glob " + "-- matching '/*' probably isn't what you want here", + ), + ] + + @pytest.mark.parametrize( ('regex', 'warning'), ( From 7441a62eb1db5820d52a2c28afa3025773e4f015 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 30 Sep 2024 18:41:13 -0400 Subject: [PATCH 034/102] add warning for deprecated stages names --- pre_commit/clientlib.py | 42 ++++++++++++++++++++++++++++++++++------- tests/clientlib_test.py | 26 +++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 7 deletions(-) diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index 0127c4d0..4e0425c3 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -99,6 +99,32 @@ class StagesMigration(StagesMigrationNoDefault): super().apply_default(dct) +class DeprecatedStagesWarning(NamedTuple): + key: str + + 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) + + legacy_stages = [stage for stage in val if stage in _STAGES] + if legacy_stages: + logger.warning( + f'hook id `{dct["id"]}` uses deprecated stage names ' + f'({", ".join(legacy_stages)}) which will be removed in a ' + f'future version. ' + f'run: `pre-commit migrate-config` to automatically fix this.', + ) + + def apply_default(self, dct: dict[str, Any]) -> None: + pass + + def remove_default(self, dct: dict[str, Any]) -> None: + raise NotImplementedError + + MANIFEST_HOOK_DICT = cfgv.Map( 'Hook', 'id', @@ -267,6 +293,12 @@ class NotAllowed(cfgv.OptionalNoDefault): raise cfgv.ValidationError(f'{self.key!r} cannot be overridden') +_COMMON_HOOK_WARNINGS = ( + OptionalSensibleRegexAtHook('files', cfgv.check_string), + OptionalSensibleRegexAtHook('exclude', cfgv.check_string), + DeprecatedStagesWarning('stages'), +) + META_HOOK_DICT = cfgv.Map( 'Hook', 'id', cfgv.Required('id', cfgv.check_string), @@ -289,8 +321,7 @@ META_HOOK_DICT = cfgv.Map( item for item in MANIFEST_HOOK_DICT.items ), - OptionalSensibleRegexAtHook('files', cfgv.check_string), - OptionalSensibleRegexAtHook('exclude', cfgv.check_string), + *_COMMON_HOOK_WARNINGS, ) CONFIG_HOOK_DICT = cfgv.Map( 'Hook', 'id', @@ -308,16 +339,13 @@ CONFIG_HOOK_DICT = cfgv.Map( if item.key != 'stages' ), StagesMigrationNoDefault('stages', []), - OptionalSensibleRegexAtHook('files', cfgv.check_string), - OptionalSensibleRegexAtHook('exclude', cfgv.check_string), + *_COMMON_HOOK_WARNINGS, ) LOCAL_HOOK_DICT = cfgv.Map( 'Hook', 'id', *MANIFEST_HOOK_DICT.items, - - OptionalSensibleRegexAtHook('files', cfgv.check_string), - OptionalSensibleRegexAtHook('exclude', cfgv.check_string), + *_COMMON_HOOK_WARNINGS, ) CONFIG_REPO_DICT = cfgv.Map( 'Repository', 'repo', diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py index 9d31d339..1335e086 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -309,6 +309,32 @@ def test_validate_optional_sensible_regex_at_top_level(caplog, regex, warning): assert caplog.record_tuples == [('pre_commit', logging.WARNING, warning)] +def test_warning_for_deprecated_stages(caplog): + config_obj = sample_local_config() + config_obj['hooks'][0]['stages'] = ['commit', 'push'] + + cfgv.validate(config_obj, CONFIG_REPO_DICT) + + assert caplog.record_tuples == [ + ( + 'pre_commit', + logging.WARNING, + 'hook id `do_not_commit` uses deprecated stage names ' + '(commit, push) which will be removed in a future version. ' + 'run: `pre-commit migrate-config` to automatically fix this.', + ), + ] + + +def test_no_warning_for_non_deprecated_stages(caplog): + config_obj = sample_local_config() + config_obj['hooks'][0]['stages'] = ['pre-commit', 'pre-push'] + + cfgv.validate(config_obj, CONFIG_REPO_DICT) + + assert caplog.record_tuples == [] + + @pytest.mark.parametrize( 'manifest_obj', ( From 33e020f315a0f8654500ffbbb103ef7b39fd7ff9 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 30 Sep 2024 19:22:14 -0400 Subject: [PATCH 035/102] add warning for deprecated stages values in `default_stages` --- pre_commit/clientlib.py | 27 +++++++++++++++++++++++++++ tests/clientlib_test.py | 24 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index 4e0425c3..f7885071 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -125,6 +125,32 @@ class DeprecatedStagesWarning(NamedTuple): raise NotImplementedError +class DeprecatedDefaultStagesWarning(NamedTuple): + key: str + + 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) + + legacy_stages = [stage for stage in val if stage in _STAGES] + if legacy_stages: + logger.warning( + f'top-level `default_stages` uses deprecated stage names ' + f'({", ".join(legacy_stages)}) which will be removed in a ' + f'future version. ' + f'run: `pre-commit migrate-config` to automatically fix this.', + ) + + def apply_default(self, dct: dict[str, Any]) -> None: + pass + + def remove_default(self, dct: dict[str, Any]) -> None: + raise NotImplementedError + + MANIFEST_HOOK_DICT = cfgv.Map( 'Hook', 'id', @@ -398,6 +424,7 @@ CONFIG_SCHEMA = cfgv.Map( 'default_language_version', DEFAULT_LANGUAGE_VERSION, {}, ), StagesMigration('default_stages', STAGES), + DeprecatedDefaultStagesWarning('default_stages'), cfgv.Optional('files', check_string_regex, ''), cfgv.Optional('exclude', check_string_regex, '^$'), cfgv.Optional('fail_fast', cfgv.check_bool, False), diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py index 1335e086..7aa84af0 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -335,6 +335,30 @@ def test_no_warning_for_non_deprecated_stages(caplog): assert caplog.record_tuples == [] +def test_warning_for_deprecated_default_stages(caplog): + cfg = {'default_stages': ['commit', 'push'], 'repos': []} + + cfgv.validate(cfg, CONFIG_SCHEMA) + + assert caplog.record_tuples == [ + ( + 'pre_commit', + logging.WARNING, + 'top-level `default_stages` uses deprecated stage names ' + '(commit, push) which will be removed in a future version. ' + 'run: `pre-commit migrate-config` to automatically fix this.', + ), + ] + + +def test_no_warning_for_non_deprecated_default_stages(caplog): + cfg = {'default_stages': ['pre-commit', 'pre-push'], 'repos': []} + + cfgv.validate(cfg, CONFIG_SCHEMA) + + assert caplog.record_tuples == [] + + @pytest.mark.parametrize( 'manifest_obj', ( From 1d2f1c0ccea63906c8bcc9265bb9940383341c0c Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 30 Sep 2024 19:58:16 -0400 Subject: [PATCH 036/102] replace log_info_mock with pytest's caplog --- tests/conftest.py | 7 ------- tests/repository_test.py | 8 ++++---- tests/store_test.py | 8 ++++---- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index bd4af9a5..8c9cd14d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,7 +2,6 @@ from __future__ import annotations import functools import io -import logging import os.path from unittest import mock @@ -203,12 +202,6 @@ def store(tempdir_factory): yield Store(os.path.join(tempdir_factory.get(), '.pre-commit')) -@pytest.fixture -def log_info_mock(): - with mock.patch.object(logging.getLogger('pre_commit'), 'info') as mck: - yield mck - - class Fixture: def __init__(self, stream: io.BytesIO) -> None: self._stream = stream diff --git a/tests/repository_test.py b/tests/repository_test.py index ac065ec4..32c361ef 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -240,16 +240,16 @@ def test_unknown_keys(store, caplog): assert msg == 'Unexpected key(s) present on local => too-much: foo, hello' -def test_reinstall(tempdir_factory, store, log_info_mock): +def test_reinstall(tempdir_factory, store, caplog): path = make_repo(tempdir_factory, 'python_hooks_repo') config = make_config_from_repo(path) _get_hook(config, store, 'foo') # We print some logging during clone (1) + install (3) - assert log_info_mock.call_count == 4 - log_info_mock.reset_mock() + assert len(caplog.record_tuples) == 4 + caplog.clear() # Reinstall on another run should not trigger another install _get_hook(config, store, 'foo') - assert log_info_mock.call_count == 0 + assert len(caplog.record_tuples) == 0 def test_control_c_control_c_on_install(tempdir_factory, store): diff --git a/tests/store_test.py b/tests/store_test.py index 45ec7327..b6b0a0b0 100644 --- a/tests/store_test.py +++ b/tests/store_test.py @@ -65,7 +65,7 @@ def test_store_init(store): assert text_line in readme_contents -def test_clone(store, tempdir_factory, log_info_mock): +def test_clone(store, tempdir_factory, caplog): path = git_dir(tempdir_factory) with cwd(path): git_commit() @@ -74,7 +74,7 @@ def test_clone(store, tempdir_factory, log_info_mock): ret = store.clone(path, rev) # Should have printed some stuff - assert log_info_mock.call_args_list[0][0][0].startswith( + assert caplog.record_tuples[0][-1].startswith( 'Initializing environment for ', ) @@ -118,7 +118,7 @@ def test_clone_when_repo_already_exists(store): def test_clone_shallow_failure_fallback_to_complete( store, tempdir_factory, - log_info_mock, + caplog, ): path = git_dir(tempdir_factory) with cwd(path): @@ -134,7 +134,7 @@ def test_clone_shallow_failure_fallback_to_complete( ret = store.clone(path, rev) # Should have printed some stuff - assert log_info_mock.call_args_list[0][0][0].startswith( + assert caplog.record_tuples[0][-1].startswith( 'Initializing environment for ', ) From d31722386e57a98d8d7d6d74228d255b9a9ffaf3 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 30 Sep 2024 20:29:19 -0400 Subject: [PATCH 037/102] add warning for deprecates stages for remote repos on init --- pre_commit/clientlib.py | 38 +++++++++++++++++++++++ pre_commit/store.py | 5 +++ tests/store_test.py | 69 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+) diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index f7885071..c0f736d9 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -2,6 +2,7 @@ from __future__ import annotations import functools import logging +import os.path import re import shlex import sys @@ -70,6 +71,43 @@ def transform_stage(stage: str) -> str: return _STAGES.get(stage, stage) +MINIMAL_MANIFEST_SCHEMA = cfgv.Array( + cfgv.Map( + 'Hook', 'id', + cfgv.Required('id', cfgv.check_string), + cfgv.Optional('stages', cfgv.check_array(cfgv.check_string), []), + ), +) + + +def warn_for_stages_on_repo_init(repo: str, directory: str) -> None: + try: + manifest = cfgv.load_from_filename( + os.path.join(directory, C.MANIFEST_FILE), + schema=MINIMAL_MANIFEST_SCHEMA, + load_strategy=yaml_load, + exc_tp=InvalidManifestError, + ) + except InvalidManifestError: + return # they'll get a better error message when it actually loads! + + legacy_stages = {} # sorted set + for hook in manifest: + for stage in hook.get('stages', ()): + if stage in _STAGES: + legacy_stages[stage] = True + + if legacy_stages: + logger.warning( + f'repo `{repo}` uses deprecated stage names ' + f'({", ".join(legacy_stages)}) which will be removed in a ' + f'future version. ' + f'Hint: often `pre-commit autoupdate --repo {shlex.quote(repo)}` ' + f'will fix this. ' + f'if it does not -- consider reporting an issue to that repo.', + ) + + class StagesMigrationNoDefault(NamedTuple): key: str default: Sequence[str] diff --git a/pre_commit/store.py b/pre_commit/store.py index 36cc4945..1235942c 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -10,6 +10,7 @@ from collections.abc import Sequence from typing import Callable import pre_commit.constants as C +from pre_commit import clientlib from pre_commit import file_lock from pre_commit import git from pre_commit.util import CalledProcessError @@ -136,6 +137,7 @@ class Store: deps: Sequence[str], make_strategy: Callable[[str], None], ) -> str: + original_repo = repo repo = self.db_repo_name(repo, deps) def _get_result() -> str | None: @@ -168,6 +170,9 @@ class Store: 'INSERT INTO repos (repo, ref, path) VALUES (?, ?, ?)', [repo, ref, directory], ) + + clientlib.warn_for_stages_on_repo_init(original_repo, directory) + return directory def _complete_clone(self, ref: str, git_cmd: Callable[..., None]) -> None: diff --git a/tests/store_test.py b/tests/store_test.py index b6b0a0b0..7d4dffb0 100644 --- a/tests/store_test.py +++ b/tests/store_test.py @@ -1,12 +1,15 @@ from __future__ import annotations +import logging import os.path +import shlex import sqlite3 import stat from unittest import mock import pytest +import pre_commit.constants as C from pre_commit import git from pre_commit.store import _get_default_directory from pre_commit.store import _LOCAL_RESOURCES @@ -91,6 +94,72 @@ def test_clone(store, tempdir_factory, caplog): assert store.select_all_repos() == [(path, rev, ret)] +def test_warning_for_deprecated_stages_on_init(store, tempdir_factory, caplog): + manifest = '''\ +- id: hook1 + name: hook1 + language: system + entry: echo hook1 + stages: [commit, push] +- id: hook2 + name: hook2 + language: system + entry: echo hook2 + stages: [push, merge-commit] +''' + + path = git_dir(tempdir_factory) + with open(os.path.join(path, C.MANIFEST_FILE), 'w') as f: + f.write(manifest) + cmd_output('git', 'add', '.', cwd=path) + git_commit(cwd=path) + rev = git.head_rev(path) + + store.clone(path, rev) + assert caplog.record_tuples[1] == ( + 'pre_commit', + logging.WARNING, + f'repo `{path}` uses deprecated stage names ' + f'(commit, push, merge-commit) which will be removed in a future ' + f'version. ' + f'Hint: often `pre-commit autoupdate --repo {shlex.quote(path)}` ' + f'will fix this. ' + f'if it does not -- consider reporting an issue to that repo.', + ) + + # should not re-warn + caplog.clear() + store.clone(path, rev) + assert caplog.record_tuples == [] + + +def test_no_warning_for_non_deprecated_stages_on_init( + store, tempdir_factory, caplog, +): + manifest = '''\ +- id: hook1 + name: hook1 + language: system + entry: echo hook1 + stages: [pre-commit, pre-push] +- id: hook2 + name: hook2 + language: system + entry: echo hook2 + stages: [pre-push, pre-merge-commit] +''' + + path = git_dir(tempdir_factory) + with open(os.path.join(path, C.MANIFEST_FILE), 'w') as f: + f.write(manifest) + cmd_output('git', 'add', '.', cwd=path) + git_commit(cwd=path) + rev = git.head_rev(path) + + store.clone(path, rev) + assert logging.WARNING not in {tup[1] for tup in caplog.record_tuples} + + def test_clone_cleans_up_on_checkout_failure(store): with pytest.raises(Exception) as excinfo: # This raises an exception because you can't clone something that From 801b956304e2ad2738bdb76d9c65ed52e967bb57 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 5 Oct 2024 13:30:25 -0400 Subject: [PATCH 038/102] remove deprecated python_venv alias --- pre_commit/all_languages.py | 2 -- pre_commit/repository.py | 9 --------- tests/all_languages_test.py | 7 ------- tests/repository_test.py | 18 ------------------ 4 files changed, 36 deletions(-) delete mode 100644 tests/all_languages_test.py diff --git a/pre_commit/all_languages.py b/pre_commit/all_languages.py index 476bad9d..f2d11bb6 100644 --- a/pre_commit/all_languages.py +++ b/pre_commit/all_languages.py @@ -44,7 +44,5 @@ languages: dict[str, Language] = { 'script': script, 'swift': swift, 'system': system, - # TODO: fully deprecate `python_venv` - 'python_venv': python, } language_names = sorted(languages) diff --git a/pre_commit/repository.py b/pre_commit/repository.py index aa841856..a9461ab6 100644 --- a/pre_commit/repository.py +++ b/pre_commit/repository.py @@ -3,7 +3,6 @@ from __future__ import annotations import json import logging import os -import shlex from collections.abc import Sequence from typing import Any @@ -68,14 +67,6 @@ def _hook_install(hook: Hook) -> None: logger.info('Once installed this environment will be reused.') logger.info('This may take a few minutes...') - if hook.language == 'python_venv': - logger.warning( - f'`repo: {hook.src}` uses deprecated `language: python_venv`. ' - f'This is an alias for `language: python`. ' - f'Often `pre-commit autoupdate --repo {shlex.quote(hook.src)}` ' - f'will fix this.', - ) - lang = languages[hook.language] assert lang.ENVIRONMENT_DIR is not None diff --git a/tests/all_languages_test.py b/tests/all_languages_test.py deleted file mode 100644 index 98c91215..00000000 --- a/tests/all_languages_test.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import annotations - -from pre_commit.all_languages import languages - - -def test_python_venv_is_an_alias_to_python(): - assert languages['python_venv'] is languages['python'] diff --git a/tests/repository_test.py b/tests/repository_test.py index 32c361ef..b54c910d 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -80,24 +80,6 @@ def _test_hook_repo( assert out == expected -def test_python_venv_deprecation(store, caplog): - config = { - 'repo': 'local', - 'hooks': [{ - 'id': 'example', - 'name': 'example', - 'language': 'python_venv', - 'entry': 'echo hi', - }], - } - _get_hook(config, store, 'example') - assert caplog.messages[-1] == ( - '`repo: local` uses deprecated `language: python_venv`. ' - 'This is an alias for `language: python`. ' - 'Often `pre-commit autoupdate --repo local` will fix this.' - ) - - def test_system_hook_with_spaces(tempdir_factory, store): _test_hook_repo( tempdir_factory, store, 'system_hook_with_spaces_repo', From dbccd57db0e9cf993ea909e929eea97f6e4389ea Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 5 Oct 2024 14:58:22 -0400 Subject: [PATCH 039/102] v4.0.0 --- CHANGELOG.md | 25 +++++++++++++++++++++++++ setup.cfg | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49094bbb..2e4dd3cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ +4.0.0 - 2024-10-05 +================== + +### Features +- Improve `pre-commit migrate-config` to handle more yaml formats. + - #3301 PR by @asottile. +- Handle `stages` deprecation in `pre-commit migrate-config`. + - #3302 PR by @asottile. + - #2732 issue by @asottile. +- Upgrade `ruby-build`. + - #3199 PR by @ThisGuyCodes. +- Add "sensible regex" warnings to `repo: meta`. + - #3311 PR by @asottile. +- Add warnings for deprecated `stages` (`commit` -> `pre-commit`, `push` -> + `pre-push`, `merge-commit` -> `pre-merge-commit`). + - #3312 PR by @asottile. + - #3313 PR by @asottile. + - #3315 PR by @asottile. + - #2732 issue by @asottile. + +### Migrating +- `language: python_venv` has been removed -- use `language: python` instead. + - #3320 PR by @asottile. + - #2734 issue by @asottile. + 3.8.0 - 2024-07-28 ================== diff --git a/setup.cfg b/setup.cfg index 52b7681e..70289e1f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 3.8.0 +version = 4.0.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 4235a877f3ac4998b41e9cce8a709ac13de159b5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 00:02:26 +0000 Subject: [PATCH 040/102] [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: v4.6.0 → v5.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.6.0...v5.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 87b8551d..7bd2611f 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: v4.6.0 + rev: v5.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer From 222c62bc5d2907efbd6052c5fb89c4c027400044 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 8 Oct 2024 11:46:48 -0400 Subject: [PATCH 041/102] fix migrate-config for purelib yaml --- pre_commit/commands/migrate_config.py | 3 ++- tests/commands/migrate_config_test.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/pre_commit/commands/migrate_config.py b/pre_commit/commands/migrate_config.py index ada094fa..c5d47a08 100644 --- a/pre_commit/commands/migrate_config.py +++ b/pre_commit/commands/migrate_config.py @@ -47,7 +47,8 @@ def _migrate_map(contents: str) -> str: def _preserve_style(n: ScalarNode, *, s: str) -> str: - return f'{n.style}{s}{n.style}' + style = n.style or '' + return f'{style}{s}{style}' def _fix_stage(n: ScalarNode) -> str: diff --git a/tests/commands/migrate_config_test.py b/tests/commands/migrate_config_test.py index 9ffae6ee..a517d2f4 100644 --- a/tests/commands/migrate_config_test.py +++ b/tests/commands/migrate_config_test.py @@ -1,10 +1,26 @@ from __future__ import annotations +from unittest import mock + import pytest +import yaml import pre_commit.constants as C from pre_commit.clientlib import InvalidConfigError from pre_commit.commands.migrate_config import migrate_config +from pre_commit.yaml import yaml_compose + + +@pytest.fixture(autouse=True, params=['c', 'pure']) +def switch_pyyaml_impl(request): + if request.param == 'c': + yield + else: + with mock.patch.dict( + yaml_compose.keywords, + {'Loader': yaml.SafeLoader}, + ): + yield def test_migrate_config_normal_format(tmpdir, capsys): From cc4a52241565440ce200666799eef70626457488 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 8 Oct 2024 12:08:49 -0400 Subject: [PATCH 042/102] v4.0.1 --- CHANGELOG.md | 9 +++++++++ setup.cfg | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e4dd3cb..a9b4c8c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +4.0.1 - 2024-10-08 +================== + +### Fixes +- Fix `pre-commit migrate-config` for unquoted deprecated stages names with + purelib `pyyaml`. + - #3324 PR by @asottile. + - pre-commit-ci/issues#234 issue by @lorenzwalthert. + 4.0.0 - 2024-10-05 ================== diff --git a/setup.cfg b/setup.cfg index 70289e1f..6936a1f0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.0.0 +version = 4.0.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 46de4da34e362e8dfa34c08205b662da8ab47788 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 22:30:38 +0000 Subject: [PATCH 043/102] [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.5.0 → v2.7.0](https://github.com/asottile/setup-cfg-fmt/compare/v2.5.0...v2.7.0) - [github.com/asottile/reorder-python-imports: v3.13.0 → v3.14.0](https://github.com/asottile/reorder-python-imports/compare/v3.13.0...v3.14.0) - [github.com/asottile/pyupgrade: v3.17.0 → v3.18.0](https://github.com/asottile/pyupgrade/compare/v3.17.0...v3.18.0) - [github.com/pre-commit/mirrors-mypy: v1.11.2 → v1.12.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.11.2...v1.12.1) --- .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 7bd2611f..33c905cd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,11 +10,11 @@ repos: - id: name-tests-test - id: requirements-txt-fixer - repo: https://github.com/asottile/setup-cfg-fmt - rev: v2.5.0 + rev: v2.7.0 hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder-python-imports - rev: v3.13.0 + rev: v3.14.0 hooks: - id: reorder-python-imports exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/) @@ -24,7 +24,7 @@ repos: hooks: - id: add-trailing-comma - repo: https://github.com/asottile/pyupgrade - rev: v3.17.0 + rev: v3.18.0 hooks: - id: pyupgrade args: [--py39-plus] @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.11.2 + rev: v1.12.1 hooks: - id: mypy additional_dependencies: [types-pyyaml] From 0de4c8028a95c1a7dfd57e772ec11ce3a71834cc Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Mon, 21 Oct 2024 20:35:56 -0400 Subject: [PATCH 044/102] remove unused type ignore --- testing/make-archives | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/testing/make-archives b/testing/make-archives index 251be4a5..eb3f3af8 100755 --- a/testing/make-archives +++ b/testing/make-archives @@ -57,8 +57,7 @@ def make_archive(name: str, repo: str, ref: str, destdir: str) -> str: arcs.sort() with gzip.GzipFile(output_path, 'wb', mtime=0) as gzipf: - # https://github.com/python/typeshed/issues/5491 - with tarfile.open(fileobj=gzipf, mode='w') as tf: # type: ignore + with tarfile.open(fileobj=gzipf, mode='w') as tf: for arcname, abspath in arcs: tf.add( abspath, From 708ca3b581f3fa033d918dd6d5b3794803d4dbb2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 22:56:52 +0000 Subject: [PATCH 045/102] [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.18.0 → v3.19.0](https://github.com/asottile/pyupgrade/compare/v3.18.0...v3.19.0) - [github.com/pre-commit/mirrors-mypy: v1.12.1 → v1.13.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.12.1...v1.13.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 33c905cd..614170ba 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.18.0 + rev: v3.19.0 hooks: - id: pyupgrade args: [--py39-plus] @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.12.1 + rev: v1.13.0 hooks: - id: mypy additional_dependencies: [types-pyyaml] From 85783bdc0ba86c3e772612a44b8825de1d24a6da Mon Sep 17 00:00:00 2001 From: Fredrik Ekre Date: Fri, 1 Nov 2024 15:24:51 +0100 Subject: [PATCH 046/102] Add support for julia hooks This patch adds 2nd class support for hooks using julia as the language. pre-commit will install any dependencies defined in the hooks repo `Project.toml` file, with support for `additional_dependencies` as well. Julia doesn't (yet) have a way to install binaries/scripts so for julia hooks the `entry` value is a (relative) path to a julia script within the hooks repository. When executing a julia hook the (globally installed) julia interpreter is prepended to the entry. Example `.pre-commit-hooks.yaml`: ```yaml - id: foo name: ... language: julia entry: bin/foo.jl --arg1 ``` Example hooks repo: https://github.com/fredrikekre/runic-pre-commit/tree/fe/julia Accompanying pre-commit.com PR: https://github.com/pre-commit/pre-commit.com/pull/998 Fixes #2689. --- pre_commit/all_languages.py | 2 + pre_commit/languages/julia.py | 132 ++++++++++++++++++++++++++++++++++ tests/languages/julia_test.py | 97 +++++++++++++++++++++++++ 3 files changed, 231 insertions(+) create mode 100644 pre_commit/languages/julia.py create mode 100644 tests/languages/julia_test.py diff --git a/pre_commit/all_languages.py b/pre_commit/all_languages.py index f2d11bb6..ba569c37 100644 --- a/pre_commit/all_languages.py +++ b/pre_commit/all_languages.py @@ -10,6 +10,7 @@ from pre_commit.languages import dotnet from pre_commit.languages import fail from pre_commit.languages import golang from pre_commit.languages import haskell +from pre_commit.languages import julia from pre_commit.languages import lua from pre_commit.languages import node from pre_commit.languages import perl @@ -33,6 +34,7 @@ languages: dict[str, Language] = { 'fail': fail, 'golang': golang, 'haskell': haskell, + 'julia': julia, 'lua': lua, 'node': node, 'perl': perl, diff --git a/pre_commit/languages/julia.py b/pre_commit/languages/julia.py new file mode 100644 index 00000000..df91c069 --- /dev/null +++ b/pre_commit/languages/julia.py @@ -0,0 +1,132 @@ +from __future__ import annotations + +import contextlib +import os +import shutil +from collections.abc import Generator +from collections.abc import Sequence + +from pre_commit import lang_base +from pre_commit.envcontext import envcontext +from pre_commit.envcontext import PatchesT +from pre_commit.envcontext import UNSET +from pre_commit.prefix import Prefix +from pre_commit.util import cmd_output_b + +ENVIRONMENT_DIR = 'juliaenv' +health_check = lang_base.basic_health_check +get_default_version = lang_base.basic_get_default_version + + +def run_hook( + prefix: Prefix, + entry: str, + args: Sequence[str], + file_args: Sequence[str], + *, + is_local: bool, + require_serial: bool, + color: bool, +) -> tuple[int, bytes]: + # `entry` is a (hook-repo relative) file followed by (optional) args, e.g. + # `bin/id.jl` or `bin/hook.jl --arg1 --arg2` so we + # 1) shell parse it and join with args with hook_cmd + # 2) prepend the hooks prefix path to the first argument (the file), unless + # it is a local script + # 3) prepend `julia` as the interpreter + + cmd = lang_base.hook_cmd(entry, args) + script = cmd[0] if is_local else prefix.path(cmd[0]) + cmd = ('julia', script, *cmd[1:]) + return lang_base.run_xargs( + cmd, + file_args, + require_serial=require_serial, + color=color, + ) + + +def get_env_patch(target_dir: str, version: str) -> PatchesT: + return ( + ('JULIA_LOAD_PATH', target_dir), + # May be set, remove it to not interfer with LOAD_PATH + ('JULIA_PROJECT', UNSET), + ) + + +@contextlib.contextmanager +def in_env(prefix: Prefix, version: str) -> Generator[None]: + envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) + with envcontext(get_env_patch(envdir, version)): + yield + + +def install_environment( + prefix: Prefix, + version: str, + additional_dependencies: Sequence[str], +) -> None: + envdir = lang_base.environment_dir(prefix, ENVIRONMENT_DIR, version) + with in_env(prefix, version): + # TODO: Support language_version with juliaup similar to rust via + # rustup + # if version != 'system': + # ... + + # Copy Project.toml to hook env if it exist + os.makedirs(envdir, exist_ok=True) + project_names = ('JuliaProject.toml', 'Project.toml') + project_found = False + for project_name in project_names: + project_file = prefix.path(project_name) + if not os.path.isfile(project_file): + continue + shutil.copy(project_file, envdir) + project_found = True + break + + # If no project file was found we create an empty one so that the + # package manager doesn't error + if not project_found: + open(os.path.join(envdir, 'Project.toml'), 'a').close() + + # Copy Manifest.toml to hook env if it exists + manifest_names = ('JuliaManifest.toml', 'Manifest.toml') + for manifest_name in manifest_names: + manifest_file = prefix.path(manifest_name) + if not os.path.isfile(manifest_file): + continue + shutil.copy(manifest_file, envdir) + break + + # Julia code to instantiate the hook environment + julia_code = """ + @assert length(ARGS) > 0 + hook_env = ARGS[1] + deps = join(ARGS[2:end], " ") + + # We prepend @stdlib here so that we can load the package manager even + # though `get_env_patch` limits `JULIA_LOAD_PATH` to just the hook env. + pushfirst!(LOAD_PATH, "@stdlib") + using Pkg + popfirst!(LOAD_PATH) + + # Instantiate the environment shipped with the hook repo. If we have + # additional dependencies we disable precompilation in this step to + # avoid double work. + precompile = isempty(deps) ? "1" : "0" + withenv("JULIA_PKG_PRECOMPILE_AUTO" => precompile) do + Pkg.instantiate() + end + + # Add additional dependencies (with precompilation) + if !isempty(deps) + withenv("JULIA_PKG_PRECOMPILE_AUTO" => "1") do + Pkg.REPLMode.pkgstr("add " * deps) + end + end + """ + cmd_output_b( + 'julia', '-e', julia_code, '--', envdir, *additional_dependencies, + cwd=prefix.prefix_dir, + ) diff --git a/tests/languages/julia_test.py b/tests/languages/julia_test.py new file mode 100644 index 00000000..4ea3c25b --- /dev/null +++ b/tests/languages/julia_test.py @@ -0,0 +1,97 @@ +from __future__ import annotations + +from pre_commit.languages import julia +from testing.language_helpers import run_language +from testing.util import cwd + + +def _make_hook(tmp_path, julia_code): + src_dir = tmp_path.joinpath('src') + src_dir.mkdir() + src_dir.joinpath('main.jl').write_text(julia_code) + tmp_path.joinpath('Project.toml').write_text( + '[deps]\n' + 'Example = "7876af07-990d-54b4-ab0e-23690620f79a"\n', + ) + + +def test_julia_hook(tmp_path): + code = """ + using Example + function main() + println("Hello, world!") + end + main() + """ + _make_hook(tmp_path, code) + expected = (0, b'Hello, world!\n') + assert run_language(tmp_path, julia, 'src/main.jl') == expected + + +def test_julia_hook_manifest(tmp_path): + code = """ + using Example + println(pkgversion(Example)) + """ + _make_hook(tmp_path, code) + + tmp_path.joinpath('Manifest.toml').write_text( + 'manifest_format = "2.0"\n\n' + '[[deps.Example]]\n' + 'git-tree-sha1 = "11820aa9c229fd3833d4bd69e5e75ef4e7273bf1"\n' + 'uuid = "7876af07-990d-54b4-ab0e-23690620f79a"\n' + 'version = "0.5.4"\n', + ) + expected = (0, b'0.5.4\n') + assert run_language(tmp_path, julia, 'src/main.jl') == expected + + +def test_julia_hook_args(tmp_path): + code = """ + function main(argv) + foreach(println, argv) + end + main(ARGS) + """ + _make_hook(tmp_path, code) + expected = (0, b'--arg1\n--arg2\n') + assert run_language( + tmp_path, julia, 'src/main.jl --arg1 --arg2', + ) == expected + + +def test_julia_hook_additional_deps(tmp_path): + code = """ + using TOML + function main() + project_file = Base.active_project() + dict = TOML.parsefile(project_file) + for (k, v) in dict["deps"] + println(k, " = ", v) + end + end + main() + """ + _make_hook(tmp_path, code) + deps = ('TOML=fa267f1f-6049-4f14-aa54-33bafae1ed76',) + ret, out = run_language(tmp_path, julia, 'src/main.jl', deps=deps) + assert ret == 0 + assert b'Example = 7876af07-990d-54b4-ab0e-23690620f79a' in out + assert b'TOML = fa267f1f-6049-4f14-aa54-33bafae1ed76' in out + + +def test_julia_repo_local(tmp_path): + env_dir = tmp_path.joinpath('envdir') + env_dir.mkdir() + local_dir = tmp_path.joinpath('local') + local_dir.mkdir() + local_dir.joinpath('local.jl').write_text( + 'using TOML; foreach(println, ARGS)', + ) + with cwd(local_dir): + deps = ('TOML=fa267f1f-6049-4f14-aa54-33bafae1ed76',) + expected = (0, b'--local-arg1\n--local-arg2\n') + assert run_language( + env_dir, julia, 'local.jl --local-arg1 --local-arg2', + deps=deps, is_local=True, + ) == expected From 109628c5058e6901cc69a1d0dfa3c2a0e0ea14d8 Mon Sep 17 00:00:00 2001 From: AleksaC Date: Thu, 19 Sep 2024 01:01:33 +0200 Subject: [PATCH 047/102] disable automatic toolchain switching for golang hooks --- pre_commit/languages/golang.py | 2 + tests/languages/golang_test.py | 69 ++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/pre_commit/languages/golang.py b/pre_commit/languages/golang.py index 60908796..678c04b1 100644 --- a/pre_commit/languages/golang.py +++ b/pre_commit/languages/golang.py @@ -75,6 +75,7 @@ def get_env_patch(venv: str, version: str) -> PatchesT: return ( ('GOROOT', os.path.join(venv, '.go')), + ('GOTOOLCHAIN', 'local'), ( 'PATH', ( os.path.join(venv, 'bin'), os.pathsep, @@ -145,6 +146,7 @@ def install_environment( env = no_git_env(dict(os.environ, GOPATH=gopath)) env.pop('GOBIN', None) if version != 'system': + env['GOTOOLCHAIN'] = 'local' env['GOROOT'] = os.path.join(env_dir, '.go') env['PATH'] = os.pathsep.join(( os.path.join(env_dir, '.go', 'bin'), os.environ['PATH'], diff --git a/tests/languages/golang_test.py b/tests/languages/golang_test.py index 02e35d71..7fb6ab18 100644 --- a/tests/languages/golang_test.py +++ b/tests/languages/golang_test.py @@ -11,11 +11,13 @@ from pre_commit.commands.install_uninstall import install from pre_commit.envcontext import envcontext from pre_commit.languages import golang from pre_commit.store import _make_local_repo +from pre_commit.util import CalledProcessError from pre_commit.util import cmd_output from testing.fixtures import add_config_to_repo from testing.fixtures import make_config_from_repo from testing.language_helpers import run_language from testing.util import cmd_output_mocked_pre_commit_home +from testing.util import cwd from testing.util import git_commit @@ -165,3 +167,70 @@ def test_during_commit_all(tmp_path, tempdir_factory, store, in_git_dir): fn=cmd_output_mocked_pre_commit_home, tempdir_factory=tempdir_factory, ) + + +def test_automatic_toolchain_switching(tmp_path): + go_mod = '''\ +module toolchain-version-test + +go 1.23.1 +''' + main_go = '''\ +package main + +func main() {} +''' + tmp_path.joinpath('go.mod').write_text(go_mod) + mod_dir = tmp_path.joinpath('toolchain-version-test') + mod_dir.mkdir() + main_file = mod_dir.joinpath('main.go') + main_file.write_text(main_go) + + with pytest.raises(CalledProcessError) as excinfo: + run_language( + path=tmp_path, + language=golang, + version='1.22.0', + exe='golang-version-test', + ) + + assert 'go.mod requires go >= 1.23.1' in excinfo.value.stderr.decode() + + +def test_automatic_toolchain_switching_go_fmt(tmp_path, monkeypatch): + go_mod_hook = '''\ +module toolchain-version-test + +go 1.22.0 +''' + go_mod = '''\ +module toolchain-version-test + +go 1.23.1 +''' + main_go = '''\ +package main + +func main() {} +''' + hook_dir = tmp_path.joinpath('hook') + hook_dir.mkdir() + hook_dir.joinpath('go.mod').write_text(go_mod_hook) + + test_dir = tmp_path.joinpath('test') + test_dir.mkdir() + test_dir.joinpath('go.mod').write_text(go_mod) + main_file = test_dir.joinpath('main.go') + main_file.write_text(main_go) + + with cwd(test_dir): + ret, out = run_language( + path=hook_dir, + language=golang, + version='1.22.0', + exe='go fmt', + file_args=(str(main_file),), + ) + + assert ret == 1 + assert 'go.mod requires go >= 1.23.1' in out.decode() From db85eeed2d114b1fb60cc6c969573fefa23c4fc8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 22:45:24 +0000 Subject: [PATCH 048/102] [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.19.0 → v3.19.1](https://github.com/asottile/pyupgrade/compare/v3.19.0...v3.19.1) - [github.com/pre-commit/mirrors-mypy: v1.13.0 → v1.14.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.13.0...v1.14.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 614170ba..5743224e 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.19.0 + rev: v3.19.1 hooks: - id: pyupgrade args: [--py39-plus] @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.13.0 + rev: v1.14.0 hooks: - id: mypy additional_dependencies: [types-pyyaml] From aa85be934071e7c73fb49e9339e307285a784d16 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 28 Dec 2024 15:43:55 -0500 Subject: [PATCH 049/102] fix docker_image test when ubuntu:22.04 image is not pre-pulled --- tests/languages/docker_image_test.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/languages/docker_image_test.py b/tests/languages/docker_image_test.py index 4e3a8789..4f720600 100644 --- a/tests/languages/docker_image_test.py +++ b/tests/languages/docker_image_test.py @@ -1,10 +1,18 @@ from __future__ import annotations +import pytest + from pre_commit.languages import docker_image +from pre_commit.util import cmd_output_b from testing.language_helpers import run_language from testing.util import xfailif_windows +@pytest.fixture(autouse=True, scope='module') +def _ensure_image_available(): + cmd_output_b('docker', 'run', '--rm', 'ubuntu:22.04', 'echo') + + @xfailif_windows # pragma: win32 no cover def test_docker_image_hook_via_entrypoint(tmp_path): ret = run_language( From 28c3d81bd27fe5e62eead459c1963a582e763bd7 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 28 Dec 2024 15:50:58 -0500 Subject: [PATCH 050/102] update .net tests to use .net 8 .net 6 and 7 were removed from github actions runners --- tests/languages/dotnet_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/languages/dotnet_test.py b/tests/languages/dotnet_test.py index 470c03b2..ee408256 100644 --- a/tests/languages/dotnet_test.py +++ b/tests/languages/dotnet_test.py @@ -27,7 +27,7 @@ def _csproj(tool_name): Exe - net6 + net8 true {tool_name} ./nupkg From 77edad8455e88b403e055d2692c9545085cf3edb Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sat, 28 Dec 2024 16:06:00 -0500 Subject: [PATCH 051/102] install r on ubuntu runners this was removed in ubuntu-24.04 github actions runner --- .github/workflows/languages.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/languages.yaml b/.github/workflows/languages.yaml index 7d50535f..61293a0d 100644 --- a/.github/workflows/languages.yaml +++ b/.github/workflows/languages.yaml @@ -65,6 +65,8 @@ jobs: if: matrix.os == 'windows-latest' && matrix.language == 'perl' - uses: haskell/actions/setup@v2 if: matrix.language == 'haskell' + - uses: r-lib/actions/setup-r@v2 + if: matrix.os == 'ubuntu-latest' && matrix.language == 'r' - name: install deps run: python -mpip install -e . -r requirements-dev.txt 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 052/102] [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 5743224e..4a23da2b 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 053/102] 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 c75a3089..f70d2fdc 100644 --- a/pre_commit/languages/r.py +++ b/pre_commit/languages/r.py @@ -15,27 +15,50 @@ from pre_commit.envcontext import PatchesT 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 10919e4a..9e73129e 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 054/102] 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 a9b4c8c2..408afe68 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 6936a1f0..60d97641 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 055/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/hhatto/autopep8: v2.3.1 → v2.3.2](https://github.com/hhatto/autopep8/compare/v2.3.1...v2.3.2) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4a23da2b..b7362292 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -29,7 +29,7 @@ repos: - id: pyupgrade args: [--py39-plus] - repo: https://github.com/hhatto/autopep8 - rev: v2.3.1 + rev: v2.3.2 hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 From e2210c97e2128703e41cc19e66f24c23b9157f69 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Thu, 30 Jan 2025 14:58:50 -0500 Subject: [PATCH 056/102] upgrade asottile/workflows Committed via https://github.com/asottile/all-repos --- .github/workflows/languages.yaml | 2 +- .github/workflows/main.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/languages.yaml b/.github/workflows/languages.yaml index 61293a0d..fccf2989 100644 --- a/.github/workflows/languages.yaml +++ b/.github/workflows/languages.yaml @@ -36,7 +36,7 @@ jobs: matrix: include: ${{ fromJSON(needs.vars.outputs.languages) }} steps: - - uses: asottile/workflows/.github/actions/fast-checkout@v1.4.0 + - uses: asottile/workflows/.github/actions/fast-checkout@v1.8.1 - uses: actions/setup-python@v4 with: python-version: 3.9 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2355b662..7fda646f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,12 +12,12 @@ concurrency: jobs: main-windows: - uses: asottile/workflows/.github/workflows/tox.yml@v1.6.0 + uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 with: env: '["py39"]' os: windows-latest main-linux: - uses: asottile/workflows/.github/workflows/tox.yml@v1.6.0 + uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 with: env: '["py39", "py310", "py311", "py312"]' os: ubuntu-latest From 4f90a1e88a80dd460f36e21d774d06bf0e73921b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Feb 2025 22:44:01 +0000 Subject: [PATCH 057/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.14.1 → v1.15.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.14.1...v1.15.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b7362292..ead07d89 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.14.1 + rev: v1.15.0 hooks: - id: mypy additional_dependencies: [types-pyyaml] From 94b97e28f7cc7d9bcb536d7a3cf7ef6311e076fd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 21:07:26 +0000 Subject: [PATCH 058/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/PyCQA/flake8: 7.1.1 → 7.1.2](https://github.com/PyCQA/flake8/compare/7.1.1...7.1.2) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ead07d89..b216fbd6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,7 @@ repos: hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 - rev: 7.1.1 + rev: 7.1.2 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy From b7eb412c798424a94ca83c72eed6f97271545dc4 Mon Sep 17 00:00:00 2001 From: Tushar Sadhwani Date: Thu, 13 Mar 2025 17:29:20 +0530 Subject: [PATCH 059/102] fix: crash on ambiguous ref 'HEAD' --- pre_commit/git.py | 2 +- tests/git_test.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pre_commit/git.py b/pre_commit/git.py index 19aac387..2f424f89 100644 --- a/pre_commit/git.py +++ b/pre_commit/git.py @@ -126,7 +126,7 @@ def get_conflicted_files() -> set[str]: merge_diff_filenames = zsplit( cmd_output( 'git', 'diff', '--name-only', '--no-ext-diff', '-z', - '-m', tree_hash, 'HEAD', 'MERGE_HEAD', + '-m', tree_hash, 'HEAD', 'MERGE_HEAD', '--', )[1], ) return set(merge_conflict_filenames) | set(merge_diff_filenames) diff --git a/tests/git_test.py b/tests/git_test.py index 93f5a1c6..02b6ce3a 100644 --- a/tests/git_test.py +++ b/tests/git_test.py @@ -141,6 +141,15 @@ def test_get_conflicted_files_unstaged_files(in_merge_conflict): assert ret == {'conflict_file'} +def test_get_conflicted_files_with_file_named_head(in_merge_conflict): + resolve_conflict() + open('HEAD', 'w').close() + cmd_output('git', 'add', 'HEAD') + + ret = set(git.get_conflicted_files()) + assert ret == {'conflict_file', 'HEAD'} + + MERGE_MSG = b"Merge branch 'foo' into bar\n\nConflicts:\n\tconflict_file\n" OTHER_MERGE_MSG = MERGE_MSG + b'\tother_conflict_file\n' From 3e8d0f5e1c449381272b80241140e985631f9912 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 18 Mar 2025 14:55:24 -0400 Subject: [PATCH 060/102] adjust python default_language_version to prefer versioned exe --- pre_commit/languages/python.py | 34 ++++++++++++----- tests/languages/python_test.py | 67 ++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 10 deletions(-) diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py index 0c4bb62d..88ececce 100644 --- a/pre_commit/languages/python.py +++ b/pre_commit/languages/python.py @@ -75,6 +75,13 @@ def _find_by_py_launcher( return None +def _impl_exe_name() -> str: + if sys.implementation.name == 'cpython': # pragma: cpython cover + return 'python' + else: # pragma: cpython no cover + return sys.implementation.name # pypy mostly + + def _find_by_sys_executable() -> str | None: def _norm(path: str) -> str | None: _, exe = os.path.split(path.lower()) @@ -100,18 +107,25 @@ def _find_by_sys_executable() -> str | None: @functools.lru_cache(maxsize=1) def get_default_version() -> str: # pragma: no cover (platform dependent) - # First attempt from `sys.executable` (or the realpath) - exe = _find_by_sys_executable() - if exe: - return exe + v_major = f'{sys.version_info[0]}' + v_minor = f'{sys.version_info[0]}.{sys.version_info[1]}' - # Next try the `pythonX.X` executable - exe = f'python{sys.version_info[0]}.{sys.version_info[1]}' - if find_executable(exe): - return exe + # attempt the likely implementation exe + for potential in (v_minor, v_major): + exe = f'{_impl_exe_name()}{potential}' + if find_executable(exe): + return exe - if _find_by_py_launcher(exe): - return exe + # next try `sys.executable` (or the realpath) + maybe_exe = _find_by_sys_executable() + if maybe_exe: + return maybe_exe + + # maybe on windows we can find it via py launcher? + if sys.platform == 'win32': # pragma: win32 cover + exe = f'python{v_minor}' + if _find_by_py_launcher(exe): + return exe # We tried! return C.DEFAULT diff --git a/tests/languages/python_test.py b/tests/languages/python_test.py index ab26e14e..565525a4 100644 --- a/tests/languages/python_test.py +++ b/tests/languages/python_test.py @@ -12,6 +12,7 @@ from pre_commit.languages import python from pre_commit.prefix import Prefix from pre_commit.util import make_executable from pre_commit.util import win_exe +from testing.auto_namedtuple import auto_namedtuple from testing.language_helpers import run_language @@ -34,6 +35,72 @@ def test_read_pyvenv_cfg_non_utf8(tmpdir): assert python._read_pyvenv_cfg(pyvenv_cfg) == expected +def _get_default_version( + *, + impl: str, + exe: str, + found: set[str], + version: tuple[int, int], +) -> str: + sys_exe = f'/fake/path/{exe}' + sys_impl = auto_namedtuple(name=impl) + sys_ver = auto_namedtuple(major=version[0], minor=version[1]) + + def find_exe(s): + if s in found: + return f'/fake/path/found/{exe}' + else: + return None + + with ( + mock.patch.object(sys, 'implementation', sys_impl), + mock.patch.object(sys, 'executable', sys_exe), + mock.patch.object(sys, 'version_info', sys_ver), + mock.patch.object(python, 'find_executable', find_exe), + ): + return python.get_default_version.__wrapped__() + + +def test_default_version_sys_executable_found(): + ret = _get_default_version( + impl='cpython', + exe='python3.12', + found={'python3.12'}, + version=(3, 12), + ) + assert ret == 'python3.12' + + +def test_default_version_picks_specific_when_found(): + ret = _get_default_version( + impl='cpython', + exe='python3', + found={'python3', 'python3.12'}, + version=(3, 12), + ) + assert ret == 'python3.12' + + +def test_default_version_picks_pypy_versioned_exe(): + ret = _get_default_version( + impl='pypy', + exe='python', + found={'pypy3.12', 'python3'}, + version=(3, 12), + ) + assert ret == 'pypy3.12' + + +def test_default_version_picks_pypy_unversioned_exe(): + ret = _get_default_version( + impl='pypy', + exe='python', + found={'pypy3', 'python3'}, + version=(3, 12), + ) + assert ret == 'pypy3' + + def test_norm_version_expanduser(): home = os.path.expanduser('~') if sys.platform == 'win32': # pragma: win32 cover From aa48766b888990e7b118d12cf757109d96e65a7e Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 18 Mar 2025 17:34:49 -0400 Subject: [PATCH 061/102] v4.2.0 --- CHANGELOG.md | 13 +++++++++++++ setup.cfg | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 408afe68..b63f4431 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +4.2.0 - 2025-03-18 +================== + +### Features +- For `language: python` first attempt a versioned python executable for + the default language version before consulting a potentially unversioned + `sys.executable`. + - #3430 PR by @asottile. + +### Fixes +- Handle error during conflict detection when a file is named "HEAD" + - #3425 PR by @tusharsadhwani. + 4.1.0 - 2025-01-20 ================== diff --git a/setup.cfg b/setup.cfg index 60d97641..af34452d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.1.0 +version = 4.2.0 description = A framework for managing and maintaining multi-language pre-commit hooks. long_description = file: README.md long_description_content_type = text/markdown From 6d47b8d52bd53320807886edd82b6fb4e1c67089 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 19:43:51 +0000 Subject: [PATCH 062/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/setup-cfg-fmt: v2.7.0 → v2.8.0](https://github.com/asottile/setup-cfg-fmt/compare/v2.7.0...v2.8.0) - [github.com/PyCQA/flake8: 7.1.2 → 7.2.0](https://github.com/PyCQA/flake8/compare/7.1.2...7.2.0) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b216fbd6..a19b44bc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,7 +10,7 @@ repos: - id: name-tests-test - id: requirements-txt-fixer - repo: https://github.com/asottile/setup-cfg-fmt - rev: v2.7.0 + rev: v2.8.0 hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder-python-imports @@ -33,7 +33,7 @@ repos: hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 - rev: 7.1.2 + rev: 7.2.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy From 43592c2a29c587aab7f70046a02ef95893841e67 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 31 Mar 2025 19:44:12 +0000 Subject: [PATCH 063/102] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- setup.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index af34452d..90f49df9 100644 --- a/setup.cfg +++ b/setup.cfg @@ -10,7 +10,6 @@ author_email = asottile@umich.edu license = MIT license_files = LICENSE classifiers = - License :: OSI Approved :: MIT License Programming Language :: Python :: 3 Programming Language :: Python :: 3 :: Only Programming Language :: Python :: Implementation :: CPython From 466f6c4a3939375dc2dc7a2fc34f553c2715d738 Mon Sep 17 00:00:00 2001 From: Matthew Hughes Date: Sun, 13 Apr 2025 11:18:18 +0100 Subject: [PATCH 064/102] Fix permission errors for mounts in rootless docker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By running containers in a rootless docker context as root. This is because user and group IDs are remapped in the user namespaces uses by rootless docker, and it's unlikely that the current user ID will map to the same ID under this remap (see docs[1] for some more details). Specifically, it means ownership of mounted volumes will not be for the current user and trying to write can result in permission errors. This change borrows heavily from an existing PR[2]. The output format of `docker system info` I don't think is documented/guaranteed anywhere, but it should corresponding to the format of a `/info` API request to Docker[3] The added test _hopes_ to avoid regressions in this behaviour, but since tests aren't run in a rootless docker context on the PR checks (and I couldn't find an easy way to make it the case) there's still a risk of regressions sneaking in. Link: https://docs.docker.com/engine/security/rootless/ [1] Link: https://github.com/pre-commit/pre-commit/pull/1484/ [2] Link: https://docs.docker.com/reference/api/engine/version/v1.48/#tag/System/operation/SystemAuth [3] Co-authored-by: Kurt von Laven Co-authored-by: Fabrice Flore-Thébault --- pre_commit/languages/docker.py | 26 +++++++++++++++++++ tests/languages/docker_test.py | 47 ++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 4de1d582..086e874d 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -1,5 +1,6 @@ from __future__ import annotations +import functools import hashlib import json import os @@ -101,7 +102,32 @@ def install_environment( os.mkdir(directory) +@functools.lru_cache(maxsize=1) +def _is_rootless() -> bool: # pragma: win32 no cover + retcode, out, _ = cmd_output_b( + 'docker', 'system', 'info', '--format', '{{ json . }}', + ) + if retcode != 0: + return False + + info = json.loads(out) + try: + return ( + # docker: + # https://docs.docker.com/reference/api/engine/version/v1.48/#tag/System/operation/SystemInfo + 'name=rootless' in info.get('SecurityOptions', ()) or + # podman: + # https://docs.podman.io/en/latest/_static/api.html?version=v5.4#tag/system/operation/SystemInfoLibpod + info['host']['security']['rootless'] + ) + except KeyError: + return False + + def get_docker_user() -> tuple[str, ...]: # pragma: win32 no cover + if _is_rootless(): + return () + try: return ('-u', f'{os.getuid()}:{os.getgid()}') except AttributeError: diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index 836382a8..03235c46 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -62,6 +62,42 @@ def test_docker_fallback_user(): assert docker.get_docker_user() == () +@pytest.fixture(autouse=True) +def _avoid_cache(): + with mock.patch.object( + docker, + '_is_rootless', + docker._is_rootless.__wrapped__, + ): + yield + + +@pytest.mark.parametrize( + 'info_ret', + ( + (0, b'{"SecurityOptions": ["name=rootless","name=cgroupns"]}', b''), + (0, b'{"host": {"security": {"rootless": true}}}', b''), + ), +) +def test_docker_user_rootless(info_ret): + with mock.patch.object(docker, 'cmd_output_b', return_value=info_ret): + assert docker.get_docker_user() == () + + +@pytest.mark.parametrize( + 'info_ret', + ( + (0, b'{"SecurityOptions": ["name=cgroupns"]}', b''), + (0, b'{"host": {"security": {"rootless": false}}}', b''), + (0, b'{"respone_from_some_other_container_engine": true}', b''), + (1, b'', b''), + ), +) +def test_docker_user_non_rootless(info_ret): + with mock.patch.object(docker, 'cmd_output_b', return_value=info_ret): + assert docker.get_docker_user() != () + + def test_in_docker_no_file(): with mock.patch.object(builtins, 'open', side_effect=FileNotFoundError): assert docker._is_in_docker() is False @@ -195,3 +231,14 @@ CMD ["echo", "This is overwritten by the entry"'] ret = run_language(tmp_path, docker, 'echo hello hello world') assert ret == (0, b'hello hello world\n') + + +@xfailif_windows # pragma: win32 no cover +def test_docker_hook_mount_permissions(tmp_path): + dockerfile = '''\ +FROM ubuntu:22.04 +''' + tmp_path.joinpath('Dockerfile').write_text(dockerfile) + + retcode, _ = run_language(tmp_path, docker, 'touch', ('README.md',)) + assert retcode == 0 From 43b426a501e621cc1c837f07b5633cb12525e79b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 19:45:48 +0000 Subject: [PATCH 065/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/reorder-python-imports: v3.14.0 → v3.15.0](https://github.com/asottile/reorder-python-imports/compare/v3.14.0...v3.15.0) - [github.com/asottile/add-trailing-comma: v3.1.0 → v3.2.0](https://github.com/asottile/add-trailing-comma/compare/v3.1.0...v3.2.0) - [github.com/asottile/pyupgrade: v3.19.1 → v3.20.0](https://github.com/asottile/pyupgrade/compare/v3.19.1...v3.20.0) --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a19b44bc..97d1174d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,17 +14,17 @@ repos: hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder-python-imports - rev: v3.14.0 + rev: v3.15.0 hooks: - id: reorder-python-imports exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/) args: [--py39-plus, --add-import, 'from __future__ import annotations'] - repo: https://github.com/asottile/add-trailing-comma - rev: v3.1.0 + rev: v3.2.0 hooks: - id: add-trailing-comma - repo: https://github.com/asottile/pyupgrade - rev: v3.19.1 + rev: v3.20.0 hooks: - id: pyupgrade args: [--py39-plus] From d4f0c6e8a7db7c29177f16fe3e56ab5c9aad7d73 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 19:57:10 +0000 Subject: [PATCH 066/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.15.0 → v1.16.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.15.0...v1.16.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 97d1174d..4ddf3406 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.15.0 + rev: v1.16.0 hooks: - id: mypy additional_dependencies: [types-pyyaml] From d1d5b3d5648d213f8dcb1648eae77b411a27ac05 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 23 Jun 2025 19:55:22 +0000 Subject: [PATCH 067/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/PyCQA/flake8: 7.2.0 → 7.3.0](https://github.com/PyCQA/flake8/compare/7.2.0...7.3.0) - [github.com/pre-commit/mirrors-mypy: v1.16.0 → v1.16.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.16.0...v1.16.1) --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4ddf3406..2dc7f4c1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,11 +33,11 @@ repos: hooks: - id: autopep8 - repo: https://github.com/PyCQA/flake8 - rev: 7.2.0 + rev: 7.3.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.16.0 + rev: v1.16.1 hooks: - id: mypy additional_dependencies: [types-pyyaml] From 4fd4537bc69e6804998d99e4851a9dbe43e91757 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 21 Jul 2025 20:02:20 +0000 Subject: [PATCH 068/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.16.1 → v1.17.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.16.1...v1.17.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2dc7f4c1..3ef94b45 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.16.1 + rev: v1.17.0 hooks: - id: mypy additional_dependencies: [types-pyyaml] From 6f1f433a9cea94a70828ade95931a703c9a9c82b Mon Sep 17 00:00:00 2001 From: Eric Hanson <5846501+ericphanson@users.noreply.github.com> Date: Mon, 21 Jul 2025 18:05:54 +0200 Subject: [PATCH 069/102] Julia language: skip startup.jl file --- pre_commit/languages/julia.py | 5 +++-- tests/languages/julia_test.py | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pre_commit/languages/julia.py b/pre_commit/languages/julia.py index df91c069..7559b5ba 100644 --- a/pre_commit/languages/julia.py +++ b/pre_commit/languages/julia.py @@ -37,7 +37,7 @@ def run_hook( cmd = lang_base.hook_cmd(entry, args) script = cmd[0] if is_local else prefix.path(cmd[0]) - cmd = ('julia', script, *cmd[1:]) + cmd = ('julia', '--startup-file=no', script, *cmd[1:]) return lang_base.run_xargs( cmd, file_args, @@ -127,6 +127,7 @@ def install_environment( end """ cmd_output_b( - 'julia', '-e', julia_code, '--', envdir, *additional_dependencies, + 'julia', '--startup-file=no', '-e', julia_code, '--', envdir, + *additional_dependencies, cwd=prefix.prefix_dir, ) diff --git a/tests/languages/julia_test.py b/tests/languages/julia_test.py index 4ea3c25b..175622d6 100644 --- a/tests/languages/julia_test.py +++ b/tests/languages/julia_test.py @@ -1,5 +1,8 @@ from __future__ import annotations +import os +from unittest import mock + from pre_commit.languages import julia from testing.language_helpers import run_language from testing.util import cwd @@ -28,6 +31,17 @@ def test_julia_hook(tmp_path): assert run_language(tmp_path, julia, 'src/main.jl') == expected +def test_julia_hook_with_startup(tmp_path): + depot_path = tmp_path.joinpath('depot') + depot_path.joinpath('config').mkdir(parents=True) + startup = depot_path.joinpath('config', 'startup.jl') + startup.write_text('error("Startup file used!")\n') + + depo_path_var = f'{depot_path}{os.pathsep}' + with mock.patch.dict(os.environ, {'JULIA_DEPOT_PATH': depo_path_var}): + test_julia_hook(tmp_path) + + def test_julia_hook_manifest(tmp_path): code = """ using Example From c8925a457afb1d6850c8f105671846bae408aae0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 20:31:31 +0000 Subject: [PATCH 070/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.17.0 → v1.17.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.17.0...v1.17.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3ef94b45..da8e24ad 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.17.0 + rev: v1.17.1 hooks: - id: mypy additional_dependencies: [types-pyyaml] From f1cc7a445f1adbfc9ea4072e180fbe3054af669b Mon Sep 17 00:00:00 2001 From: Byoungchan Lee Date: Fri, 8 Aug 2025 17:02:53 +0900 Subject: [PATCH 071/102] Make Dart pre-commit hook compatible with the latest Dart SDKs Dart introduced sound null safety in version 2.12.0, and as of Dart 3, null safety is mandatory. Older Dart SDKs allowed both pre-null safety and null-safe packages, but modern Dart SDKs, where most source code is null-safe, now reject pre-null safety packages. The current `pubspec.yaml` template with `sdk: '>=2.10.0'` is incompatible with recent Dart SDKs, leading to the following error: An unexpected error has occurred: CalledProcessError: command: ('/path/to/dart-sdk/bin/dart', 'pub', 'get') return code: 65 stdout: Resolving dependencies... stderr: The lower bound of "sdk: '>=2.10.0'" must be 2.12.0' or higher to enable null safety. The current Dart SDK (3.8.3) only supports null safety. For details, see https://dart.dev/null-safety To ensure compatibility with the modern Dart ecosystem, this commit updates the minimum Dart SDK version to 2.12.0 or higher, which implicitly supports null safety. Additionally, `testing/get-dart.sh` has been updated to verify that the pre-commit hook functions correctly with the latest Dart versions. --- pre_commit/resources/empty_template_pubspec.yaml | 2 +- testing/get-dart.sh | 2 +- tests/languages/dart_test.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pre_commit/resources/empty_template_pubspec.yaml b/pre_commit/resources/empty_template_pubspec.yaml index 3be6ffe3..8306aeb6 100644 --- a/pre_commit/resources/empty_template_pubspec.yaml +++ b/pre_commit/resources/empty_template_pubspec.yaml @@ -1,4 +1,4 @@ name: pre_commit_empty_pubspec environment: - sdk: '>=2.10.0' + sdk: '>=2.12.0' executables: {} diff --git a/testing/get-dart.sh b/testing/get-dart.sh index 998b9d98..3402c421 100755 --- a/testing/get-dart.sh +++ b/testing/get-dart.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -VERSION=2.13.4 +VERSION=3.8.3 if [ "$OSTYPE" = msys ]; then URL="https://storage.googleapis.com/dart-archive/channels/stable/release/${VERSION}/sdk/dartsdk-windows-x64-release.zip" diff --git a/tests/languages/dart_test.py b/tests/languages/dart_test.py index 5bb5aa68..213d888e 100644 --- a/tests/languages/dart_test.py +++ b/tests/languages/dart_test.py @@ -10,7 +10,7 @@ from testing.language_helpers import run_language def test_dart(tmp_path): pubspec_yaml = '''\ environment: - sdk: '>=2.10.0 <3.0.0' + sdk: '>=2.12.0 <4.0.0' name: hello_world_dart From 2a0bcea7570620416a550362d9b2d2b24eb80dd8 Mon Sep 17 00:00:00 2001 From: Byoungchan Lee Date: Fri, 8 Aug 2025 17:40:30 +0900 Subject: [PATCH 072/102] Downgrade Dart SDK version installed in the CI --- testing/get-dart.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/get-dart.sh b/testing/get-dart.sh index 3402c421..b4545e71 100755 --- a/testing/get-dart.sh +++ b/testing/get-dart.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -euo pipefail -VERSION=3.8.3 +VERSION=2.19.6 if [ "$OSTYPE" = msys ]; then URL="https://storage.googleapis.com/dart-archive/channels/stable/release/${VERSION}/sdk/dartsdk-windows-x64-release.zip" From b74a22d96cca546b8e0bb9f68f1d7d8565205b65 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 9 Aug 2025 14:54:49 -0400 Subject: [PATCH 073/102] v4.3.0 --- CHANGELOG.md | 13 +++++++++++++ setup.cfg | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b63f4431..42a63f78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +4.3.0 - 2025-08-09 +================== + +### Features +- `language: docker` / `language: docker_image`: detect rootless docker. + - #3446 PR by @matthewhughes934. + - #1243 issue by @dkolepp. +- `language: julia`: avoid `startup.jl` when executing hooks. + - #3496 PR by @ericphanson. +- `language: dart`: support latest dart versions which require a higher sdk + lower bound. + - #3507 PR by @bc-lee. + 4.2.0 - 2025-03-18 ================== diff --git a/setup.cfg b/setup.cfg index 90f49df9..9b0e02ad 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.2.0 +version = 4.3.0 description = A framework for managing and maintaining multi-language pre-commit hooks. long_description = file: README.md long_description_content_type = text/markdown From 87a681f8662554ee888a02e162d8772d64eee6cc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 20:46:13 +0000 Subject: [PATCH 074/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v5.0.0 → v6.0.0](https://github.com/pre-commit/pre-commit-hooks/compare/v5.0.0...v6.0.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index da8e24ad..464cfe60 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer From c78f248c60846fa48c9d38b488f3acc0fed96207 Mon Sep 17 00:00:00 2001 From: JulianMaurin Date: Mon, 25 Aug 2025 23:20:07 +0200 Subject: [PATCH 075/102] Add fail-fast argument for run command --- pre_commit/commands/hook_impl.py | 1 + pre_commit/commands/run.py | 3 ++- pre_commit/main.py | 4 ++++ testing/util.py | 2 ++ tests/commands/run_test.py | 13 +++++++++++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/pre_commit/commands/hook_impl.py b/pre_commit/commands/hook_impl.py index 49a80b7b..de5c8f34 100644 --- a/pre_commit/commands/hook_impl.py +++ b/pre_commit/commands/hook_impl.py @@ -106,6 +106,7 @@ def _ns( hook=None, verbose=False, show_diff_on_failure=False, + fail_fast=False, ) diff --git a/pre_commit/commands/run.py b/pre_commit/commands/run.py index 793adbdb..8ab505ff 100644 --- a/pre_commit/commands/run.py +++ b/pre_commit/commands/run.py @@ -298,7 +298,8 @@ def _run_hooks( verbose=args.verbose, use_color=args.color, ) retval |= current_retval - if current_retval and (config['fail_fast'] or hook.fail_fast): + fail_fast = (config['fail_fast'] or hook.fail_fast or args.fail_fast) + if current_retval and fail_fast: break if retval and args.show_diff_on_failure and prior_diff: if args.all_files: diff --git a/pre_commit/main.py b/pre_commit/main.py index 559c927c..fc4531b8 100644 --- a/pre_commit/main.py +++ b/pre_commit/main.py @@ -76,6 +76,10 @@ def _add_run_options(parser: argparse.ArgumentParser) -> None: '--show-diff-on-failure', action='store_true', help='When hooks fail, run `git diff` directly afterward.', ) + parser.add_argument( + '--fail-fast', action='store_true', + help='Stop after the first failing hook.', + ) parser.add_argument( '--hook-stage', choices=clientlib.STAGES, diff --git a/testing/util.py b/testing/util.py index 08d52cbc..1646ccd2 100644 --- a/testing/util.py +++ b/testing/util.py @@ -40,6 +40,7 @@ def run_opts( color=False, verbose=False, hook=None, + fail_fast=False, remote_branch='', local_branch='', from_ref='', @@ -65,6 +66,7 @@ def run_opts( color=color, verbose=verbose, hook=hook, + fail_fast=fail_fast, remote_branch=remote_branch, local_branch=local_branch, from_ref=from_ref, diff --git a/tests/commands/run_test.py b/tests/commands/run_test.py index 50a20f37..e4af1e16 100644 --- a/tests/commands/run_test.py +++ b/tests/commands/run_test.py @@ -1104,6 +1104,19 @@ def test_fail_fast_not_prev_failures(cap_out, store, repo_with_failing_hook): assert printed.count(b'run me!') == 1 +def test_fail_fast_run_arg(cap_out, store, repo_with_failing_hook): + with modify_config() as config: + # More than one hook to demonstrate early exit + config['repos'][0]['hooks'] *= 2 + stage_a_file() + + ret, printed = _do_run( + cap_out, store, repo_with_failing_hook, run_opts(fail_fast=True), + ) + # it should have only run one hook due to the CLI flag + assert printed.count(b'Failing hook') == 1 + + def test_classifier_removes_dne(): classifier = Classifier(('this_file_does_not_exist',)) assert classifier.filenames == [] From e67183040220cd8662b5b886b24841e2d04bac9c Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 6 Sep 2025 14:20:01 -0400 Subject: [PATCH 076/102] store_true does not need default=... --- pre_commit/main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pre_commit/main.py b/pre_commit/main.py index 559c927c..b7ac3dc2 100644 --- a/pre_commit/main.py +++ b/pre_commit/main.py @@ -62,10 +62,10 @@ def _add_hook_type_option(parser: argparse.ArgumentParser) -> None: def _add_run_options(parser: argparse.ArgumentParser) -> None: parser.add_argument('hook', nargs='?', help='A single hook-id to run') - parser.add_argument('--verbose', '-v', action='store_true', default=False) + parser.add_argument('--verbose', '-v', action='store_true') mutex_group = parser.add_mutually_exclusive_group(required=False) mutex_group.add_argument( - '--all-files', '-a', action='store_true', default=False, + '--all-files', '-a', action='store_true', help='Run on all the files in the repo.', ) mutex_group.add_argument( @@ -275,7 +275,7 @@ def main(argv: Sequence[str] | None = None) -> int: ) _add_hook_type_option(install_parser) install_parser.add_argument( - '--allow-missing-config', action='store_true', default=False, + '--allow-missing-config', action='store_true', help=( 'Whether to allow a missing `pre-commit` configuration file ' 'or exit with a failure code.' From 2930ea0fcd481f4c2cbeae0245a8bb748bae905a Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 6 Sep 2025 14:40:20 -0400 Subject: [PATCH 077/102] handle `SecurityOptions: null` in docker response --- pre_commit/languages/docker.py | 2 +- tests/languages/docker_test.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 086e874d..d5ce1eb7 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -115,7 +115,7 @@ def _is_rootless() -> bool: # pragma: win32 no cover return ( # docker: # https://docs.docker.com/reference/api/engine/version/v1.48/#tag/System/operation/SystemInfo - 'name=rootless' in info.get('SecurityOptions', ()) or + 'name=rootless' in (info.get('SecurityOptions') or ()) or # podman: # https://docs.podman.io/en/latest/_static/api.html?version=v5.4#tag/system/operation/SystemInfoLibpod info['host']['security']['rootless'] diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index 03235c46..b830439a 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -89,7 +89,8 @@ def test_docker_user_rootless(info_ret): ( (0, b'{"SecurityOptions": ["name=cgroupns"]}', b''), (0, b'{"host": {"security": {"rootless": false}}}', b''), - (0, b'{"respone_from_some_other_container_engine": true}', b''), + (0, b'{"response_from_some_other_container_engine": true}', b''), + (0, b'{"SecurityOptions": null}', b''), (1, b'', b''), ), ) From ad0d4cd4271cab68ddbf5e5c3386f38320e0ccd2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Sep 2025 20:44:04 +0000 Subject: [PATCH 078/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.17.1 → v1.18.2](https://github.com/pre-commit/mirrors-mypy/compare/v1.17.1...v1.18.2) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 464cfe60..0a24427f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.17.1 + rev: v1.18.2 hooks: - id: mypy additional_dependencies: [types-pyyaml] From f415f6c4d72224363ba794429b25cc3f52e04933 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Thu, 9 Oct 2025 17:44:05 -0400 Subject: [PATCH 079/102] py310+ Committed via https://github.com/asottile/all-repos --- .github/workflows/languages.yaml | 4 ++-- .github/workflows/main.yml | 4 ++-- .pre-commit-config.yaml | 4 ++-- pre_commit/commands/migrate_config.py | 2 +- pre_commit/file_lock.py | 2 +- pre_commit/languages/golang.py | 3 +-- pre_commit/store.py | 2 +- pre_commit/util.py | 2 +- pre_commit/xargs.py | 2 +- setup.cfg | 2 +- 10 files changed, 13 insertions(+), 14 deletions(-) diff --git a/.github/workflows/languages.yaml b/.github/workflows/languages.yaml index fccf2989..be8963ba 100644 --- a/.github/workflows/languages.yaml +++ b/.github/workflows/languages.yaml @@ -21,7 +21,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-python@v4 with: - python-version: 3.9 + python-version: '3.10' - name: install deps run: python -mpip install -e . -r requirements-dev.txt - name: vars @@ -39,7 +39,7 @@ jobs: - uses: asottile/workflows/.github/actions/fast-checkout@v1.8.1 - uses: actions/setup-python@v4 with: - python-version: 3.9 + python-version: '3.10' - run: echo "$CONDA\Scripts" >> "$GITHUB_PATH" shell: bash diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 7fda646f..02b11ae2 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,10 +14,10 @@ jobs: main-windows: uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 with: - env: '["py39"]' + env: '["py310"]' os: windows-latest main-linux: uses: asottile/workflows/.github/workflows/tox.yml@v1.8.1 with: - env: '["py39", "py310", "py311", "py312"]' + env: '["py310", "py311", "py312", "py313"]' os: ubuntu-latest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0a24427f..58b96f76 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,7 +18,7 @@ repos: hooks: - id: reorder-python-imports exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/) - args: [--py39-plus, --add-import, 'from __future__ import annotations'] + args: [--py310-plus, --add-import, 'from __future__ import annotations'] - repo: https://github.com/asottile/add-trailing-comma rev: v3.2.0 hooks: @@ -27,7 +27,7 @@ repos: rev: v3.20.0 hooks: - id: pyupgrade - args: [--py39-plus] + args: [--py310-plus] - repo: https://github.com/hhatto/autopep8 rev: v2.3.2 hooks: diff --git a/pre_commit/commands/migrate_config.py b/pre_commit/commands/migrate_config.py index c5d47a08..b04c53a5 100644 --- a/pre_commit/commands/migrate_config.py +++ b/pre_commit/commands/migrate_config.py @@ -3,7 +3,7 @@ from __future__ import annotations import functools import itertools import textwrap -from typing import Callable +from collections.abc import Callable import cfgv import yaml diff --git a/pre_commit/file_lock.py b/pre_commit/file_lock.py index c840ad8b..6223f869 100644 --- a/pre_commit/file_lock.py +++ b/pre_commit/file_lock.py @@ -3,8 +3,8 @@ from __future__ import annotations import contextlib import errno import sys +from collections.abc import Callable from collections.abc import Generator -from typing import Callable if sys.platform == 'win32': # pragma: no cover (windows) diff --git a/pre_commit/languages/golang.py b/pre_commit/languages/golang.py index 678c04b1..bedbd114 100644 --- a/pre_commit/languages/golang.py +++ b/pre_commit/languages/golang.py @@ -90,8 +90,7 @@ def _infer_go_version(version: str) -> str: if version != C.DEFAULT: return version resp = urllib.request.urlopen('https://go.dev/dl/?mode=json') - # TODO: 3.9+ .removeprefix('go') - return json.load(resp)[0]['version'][2:] + return json.load(resp)[0]['version'].removeprefix('go') def _get_url(version: str) -> str: diff --git a/pre_commit/store.py b/pre_commit/store.py index 1235942c..9e3b4048 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -5,9 +5,9 @@ import logging import os.path import sqlite3 import tempfile +from collections.abc import Callable from collections.abc import Generator from collections.abc import Sequence -from typing import Callable import pre_commit.constants as C from pre_commit import clientlib diff --git a/pre_commit/util.py b/pre_commit/util.py index e199d080..19b1880b 100644 --- a/pre_commit/util.py +++ b/pre_commit/util.py @@ -8,10 +8,10 @@ import shutil import stat import subprocess import sys +from collections.abc import Callable from collections.abc import Generator from types import TracebackType from typing import Any -from typing import Callable from pre_commit import parse_shebang diff --git a/pre_commit/xargs.py b/pre_commit/xargs.py index a1345b58..7c98d167 100644 --- a/pre_commit/xargs.py +++ b/pre_commit/xargs.py @@ -7,12 +7,12 @@ import multiprocessing import os import subprocess import sys +from collections.abc import Callable from collections.abc import Generator from collections.abc import Iterable from collections.abc import MutableMapping from collections.abc import Sequence from typing import Any -from typing import Callable from typing import TypeVar from pre_commit import parse_shebang diff --git a/setup.cfg b/setup.cfg index 9b0e02ad..8fb6e6aa 100644 --- a/setup.cfg +++ b/setup.cfg @@ -23,7 +23,7 @@ install_requires = nodeenv>=0.11.1 pyyaml>=5.1 virtualenv>=20.10.0 -python_requires = >=3.9 +python_requires = >=3.10 [options.packages.find] exclude = From 221637b0cbdfbfe8ca209ba5df0111b08f9d8cda Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 20:38:45 +0000 Subject: [PATCH 080/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/setup-cfg-fmt: v2.8.0 → v3.1.0](https://github.com/asottile/setup-cfg-fmt/compare/v2.8.0...v3.1.0) - [github.com/asottile/reorder-python-imports: v3.15.0 → v3.16.0](https://github.com/asottile/reorder-python-imports/compare/v3.15.0...v3.16.0) - [github.com/asottile/add-trailing-comma: v3.2.0 → v4.0.0](https://github.com/asottile/add-trailing-comma/compare/v3.2.0...v4.0.0) - [github.com/asottile/pyupgrade: v3.20.0 → v3.21.0](https://github.com/asottile/pyupgrade/compare/v3.20.0...v3.21.0) --- .pre-commit-config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 58b96f76..b1623a64 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,21 +10,21 @@ repos: - id: name-tests-test - id: requirements-txt-fixer - repo: https://github.com/asottile/setup-cfg-fmt - rev: v2.8.0 + rev: v3.1.0 hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder-python-imports - rev: v3.15.0 + rev: v3.16.0 hooks: - id: reorder-python-imports exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/) args: [--py310-plus, --add-import, 'from __future__ import annotations'] - repo: https://github.com/asottile/add-trailing-comma - rev: v3.2.0 + rev: v4.0.0 hooks: - id: add-trailing-comma - repo: https://github.com/asottile/pyupgrade - rev: v3.20.0 + rev: v3.21.0 hooks: - id: pyupgrade args: [--py310-plus] From ddfcf4034bc72445497b5e6708205523a9da7ed7 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Thu, 16 Oct 2025 10:23:27 -0400 Subject: [PATCH 081/102] fix deprecated call --- pre_commit/git.py | 2 +- setup.cfg | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/pre_commit/git.py b/pre_commit/git.py index 2f424f89..ec1928f3 100644 --- a/pre_commit/git.py +++ b/pre_commit/git.py @@ -219,7 +219,7 @@ def check_for_cygwin_mismatch() -> None: if is_cygwin_python ^ is_cygwin_git: exe_type = {True: '(cygwin)', False: '(windows)'} - logger.warn( + logger.warning( f'pre-commit has detected a mix of cygwin python / git\n' f'This combination is not supported, it is likely you will ' f'receive an error later in the program.\n' diff --git a/setup.cfg b/setup.cfg index 8fb6e6aa..17c3fe0e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -52,6 +52,7 @@ check_untyped_defs = true disallow_any_generics = true disallow_incomplete_defs = true disallow_untyped_defs = true +enable_error_code = deprecated warn_redundant_casts = true warn_unused_ignores = true From fc33a62f3c55c671cdef8306b6c3dc91d81e2b4a Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Fri, 24 Oct 2025 15:18:07 -0400 Subject: [PATCH 082/102] upgrade rbenv / ruby-build --- pre_commit/resources/rbenv.tar.gz | Bin 32545 -> 31297 bytes pre_commit/resources/ruby-build.tar.gz | Bin 88488 -> 93998 bytes testing/make-archives | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pre_commit/resources/rbenv.tar.gz b/pre_commit/resources/rbenv.tar.gz index 111546e3dd9796511942c278495c21fe1ef947ae..b5df08744c17c6fd950d89e8a5caf6186905dedc 100644 GIT binary patch literal 31297 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 diff --git a/pre_commit/resources/ruby-build.tar.gz b/pre_commit/resources/ruby-build.tar.gz index a4f7eb24fd0a7e4d59cf120014d8b054555b8b0f..5c82c90609384836116acd7df8bbe9f79a4c7a86 100644 GIT binary patch delta 93686 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

8nw4 z!YLMht)2IuEXtMl+j`ze>*Sk5IVF!}MT`FZ`LgYt>TPXH{}Zi`s+o2?o*S}^Y17~O z%|C=#?Egl;kO*emV#Qi{nZteE(%t18uVU467S1e~{%iG}jgu#3mYn=vbbM9Xtf!G| zVHdfLA6aDxyZO&_oGJ2krS&ZqoQpl-sTqO{e$pOqW~ocKxaysg3nz-;ZS%POZ9jtm~{sp2m?mQyLYr z%lzWlQsny#9xR(KaIiU0aZi)xqN!KB=2jQEL{188%yz!Hgk!0s*rUTA-fV5iVPebh zixZq)bWrrh0R-4%aS;w@@w*pm*8aqIOX@`Z*>eM4eVelLj_}==CtWv091`Scy(TE} z=Z;+yA zdWSs~@5w(pYxt%6q+X@Y%K2yCw7qxT)g!R3z$ofw$G^Khn)XWd0hV*i-sn#BdsvpW z?)V^y1l)g>HD5A?EcnY3n=L{p7(8S8iJ zsf8b&?s}?xO84!KyDjhO^C)hjUx=ugP>JE&N33wzC zY_(~}*OF+X+~OEJpAS16{Xb2Z?{-A`=*NGNn-~^xx}4UK(rGAqdF4ah{6*Kcon)H0 z**?GUy?kJt+M~}q4VSuc6s=@m8qw2dQt}tM}{a z>+71fiJ5CIsfwAia`P4)^JfBp6MQuCjZ8+y50c$>nfem~XLxmZ(Pc|TXw@xMP6kLtdE;U~!d z@nn;IoAy~Xk-Jhmb$%#+4m$s=xT*Z))SwM>_B!4^IziN#UFVJXHNBXw*>@)9dJCtz z-ifJy*!1B7Lz%|5Agl5@QAX2zQf|8&zUTNK`GuR?!Ty}ltT>r7y+2pWNC|wDO%t2R ty-P6$W_+)w?oav`J}oRv{@MTds-nA!6j67x`f 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 WV@Cva`~Bztj4D6Ov>9ITG5`ST$-fH# diff --git a/testing/make-archives b/testing/make-archives index eb3f3af8..10f40a3a 100755 --- a/testing/make-archives +++ b/testing/make-archives @@ -16,8 +16,8 @@ from collections.abc import Sequence REPOS = ( - ('rbenv', 'https://github.com/rbenv/rbenv', '38e1fbb'), - ('ruby-build', 'https://github.com/rbenv/ruby-build', 'ed384c8'), + ('rbenv', 'https://github.com/rbenv/rbenv', '10e96bfc'), + ('ruby-build', 'https://github.com/rbenv/ruby-build', '447468b1'), ( 'ruby-download', 'https://github.com/garnieretienne/rvm-download', From 8bbfcf1f82ed7d1970e21a9c0323030805fdba3f Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 8 Nov 2025 13:16:33 -0500 Subject: [PATCH 083/102] remove redundant system spaces test `test_args_with_spaces_and_quotes` also covers this behaviour --- .../system_hook_with_spaces_repo/.pre-commit-hooks.yaml | 5 ----- tests/repository_test.py | 7 ------- 2 files changed, 12 deletions(-) delete mode 100644 testing/resources/system_hook_with_spaces_repo/.pre-commit-hooks.yaml diff --git a/testing/resources/system_hook_with_spaces_repo/.pre-commit-hooks.yaml b/testing/resources/system_hook_with_spaces_repo/.pre-commit-hooks.yaml deleted file mode 100644 index b2c347c1..00000000 --- a/testing/resources/system_hook_with_spaces_repo/.pre-commit-hooks.yaml +++ /dev/null @@ -1,5 +0,0 @@ -- id: system-hook-with-spaces - name: System hook with spaces - entry: bash -c 'echo "Hello World"' - language: system - files: \.sh$ diff --git a/tests/repository_test.py b/tests/repository_test.py index b54c910d..f1559301 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -80,13 +80,6 @@ def _test_hook_repo( assert out == expected -def test_system_hook_with_spaces(tempdir_factory, store): - _test_hook_repo( - tempdir_factory, store, 'system_hook_with_spaces_repo', - 'system-hook-with-spaces', [os.devnull], b'Hello World\n', - ) - - def test_missing_executable(tempdir_factory, store): _test_hook_repo( tempdir_factory, store, 'not_found_exe', From 95eec7500464500d2ca0cc13d0986000508830e5 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 8 Nov 2025 13:33:50 -0500 Subject: [PATCH 084/102] rm python3_hooks_repo --- .pre-commit-config.yaml | 2 +- .../resources/python3_hooks_repo/.pre-commit-hooks.yaml | 6 ------ testing/resources/python3_hooks_repo/py3_hook.py | 8 -------- testing/resources/python3_hooks_repo/setup.py | 8 -------- 4 files changed, 1 insertion(+), 23 deletions(-) delete mode 100644 testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml delete mode 100644 testing/resources/python3_hooks_repo/py3_hook.py delete mode 100644 testing/resources/python3_hooks_repo/setup.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b1623a64..fa077365 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -17,7 +17,7 @@ repos: rev: v3.16.0 hooks: - id: reorder-python-imports - exclude: ^(pre_commit/resources/|testing/resources/python3_hooks_repo/) + exclude: ^pre_commit/resources/ args: [--py310-plus, --add-import, 'from __future__ import annotations'] - repo: https://github.com/asottile/add-trailing-comma rev: v4.0.0 diff --git a/testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml b/testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml deleted file mode 100644 index 2c237009..00000000 --- a/testing/resources/python3_hooks_repo/.pre-commit-hooks.yaml +++ /dev/null @@ -1,6 +0,0 @@ -- id: python3-hook - name: Python 3 Hook - entry: python3-hook - language: python - language_version: python3 - files: \.py$ diff --git a/testing/resources/python3_hooks_repo/py3_hook.py b/testing/resources/python3_hooks_repo/py3_hook.py deleted file mode 100644 index 8c9cda4c..00000000 --- a/testing/resources/python3_hooks_repo/py3_hook.py +++ /dev/null @@ -1,8 +0,0 @@ -import sys - - -def main(): - print(sys.version_info[0]) - print(repr(sys.argv[1:])) - print('Hello World') - return 0 diff --git a/testing/resources/python3_hooks_repo/setup.py b/testing/resources/python3_hooks_repo/setup.py deleted file mode 100644 index 9125dc1d..00000000 --- a/testing/resources/python3_hooks_repo/setup.py +++ /dev/null @@ -1,8 +0,0 @@ -from setuptools import setup - -setup( - name='python3_hook', - version='0.0.0', - py_modules=['py3_hook'], - entry_points={'console_scripts': ['python3-hook = py3_hook:main']}, -) From aa2961c122b4aa834c77e612232c154f9439c388 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 8 Nov 2025 14:31:11 -0500 Subject: [PATCH 085/102] fix missing context in error for stages --- pre_commit/clientlib.py | 9 +++++---- tests/clientlib_test.py | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index c0f736d9..51514bd3 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -116,11 +116,12 @@ class StagesMigrationNoDefault(NamedTuple): if self.key not in dct: return - val = dct[self.key] - cfgv.check_array(cfgv.check_any)(val) + with cfgv.validate_context(f'At key: {self.key}'): + val = dct[self.key] + cfgv.check_array(cfgv.check_any)(val) - val = [transform_stage(v) for v in val] - cfgv.check_array(cfgv.check_one_of(STAGES))(val) + val = [transform_stage(v) for v in val] + cfgv.check_array(cfgv.check_one_of(STAGES))(val) def apply_default(self, dct: dict[str, Any]) -> None: if self.key not in dct: diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py index 7aa84af0..2251abc4 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -309,6 +309,27 @@ def test_validate_optional_sensible_regex_at_top_level(caplog, regex, warning): assert caplog.record_tuples == [('pre_commit', logging.WARNING, warning)] +def test_invalid_stages_error(): + cfg = {'repos': [sample_local_config()]} + cfg['repos'][0]['hooks'][0]['stages'] = ['invalid'] + + with pytest.raises(cfgv.ValidationError) as excinfo: + cfgv.validate(cfg, CONFIG_SCHEMA) + + assert str(excinfo.value) == ( + '\n' + '==> At Config()\n' + '==> At key: repos\n' + "==> At Repository(repo='local')\n" + '==> At key: hooks\n' + "==> At Hook(id='do_not_commit')\n" + # this line was missing due to the custom validator + '==> At key: stages\n' + '==> At index 0\n' + "=====> Expected one of commit-msg, manual, post-checkout, post-commit, post-merge, post-rewrite, pre-commit, pre-merge-commit, pre-push, pre-rebase, prepare-commit-msg but got: 'invalid'" # noqa: E501 + ) + + def test_warning_for_deprecated_stages(caplog): config_obj = sample_local_config() config_obj['hooks'][0]['stages'] = ['commit', 'push'] From 725acc969a28a6bc9a7e2260f035426bc932e8da Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 8 Nov 2025 13:13:18 -0500 Subject: [PATCH 086/102] rename system and script languages to unsupported / unsupported_script --- pre_commit/all_languages.py | 8 ++-- pre_commit/clientlib.py | 47 +++++++++++++++++-- .../languages/{system.py => unsupported.py} | 0 .../{script.py => unsupported_script.py} | 0 tests/clientlib_test.py | 20 ++++++++ tests/languages/system_test.py | 9 ---- ...ipt_test.py => unsupported_script_test.py} | 6 +-- tests/languages/unsupported_test.py | 10 ++++ tests/repository_test.py | 14 +++--- 9 files changed, 88 insertions(+), 26 deletions(-) rename pre_commit/languages/{system.py => unsupported.py} (100%) rename pre_commit/languages/{script.py => unsupported_script.py} (100%) delete mode 100644 tests/languages/system_test.py rename tests/languages/{script_test.py => unsupported_script_test.py} (63%) create mode 100644 tests/languages/unsupported_test.py diff --git a/pre_commit/all_languages.py b/pre_commit/all_languages.py index ba569c37..166bc167 100644 --- a/pre_commit/all_languages.py +++ b/pre_commit/all_languages.py @@ -19,9 +19,9 @@ from pre_commit.languages import python from pre_commit.languages import r from pre_commit.languages import ruby from pre_commit.languages import rust -from pre_commit.languages import script from pre_commit.languages import swift -from pre_commit.languages import system +from pre_commit.languages import unsupported +from pre_commit.languages import unsupported_script languages: dict[str, Language] = { @@ -43,8 +43,8 @@ languages: dict[str, Language] = { 'r': r, 'ruby': ruby, 'rust': rust, - 'script': script, 'swift': swift, - 'system': system, + 'unsupported': unsupported, + 'unsupported_script': unsupported_script, } language_names = sorted(languages) diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index 51514bd3..eb0fd4d6 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -6,6 +6,7 @@ import os.path import re import shlex import sys +from collections.abc import Callable from collections.abc import Sequence from typing import Any from typing import NamedTuple @@ -190,6 +191,42 @@ class DeprecatedDefaultStagesWarning(NamedTuple): raise NotImplementedError +def _translate_language(name: str) -> str: + return { + 'system': 'unsupported', + 'script': 'unsupported_script', + }.get(name, name) + + +class LanguageMigration(NamedTuple): # remove + key: str + check_fn: Callable[[object], None] + + def check(self, dct: dict[str, Any]) -> None: + if self.key not in dct: + return + + with cfgv.validate_context(f'At key: {self.key}'): + self.check_fn(_translate_language(dct[self.key])) + + def apply_default(self, dct: dict[str, Any]) -> None: + if self.key not in dct: + return + + dct[self.key] = _translate_language(dct[self.key]) + + def remove_default(self, dct: dict[str, Any]) -> None: + raise NotImplementedError + + +class LanguageMigrationRequired(LanguageMigration): # replace with Required + def check(self, dct: dict[str, Any]) -> None: + if self.key not in dct: + raise cfgv.ValidationError(f'Missing required key: {self.key}') + + super().check(dct) + + MANIFEST_HOOK_DICT = cfgv.Map( 'Hook', 'id', @@ -203,7 +240,7 @@ MANIFEST_HOOK_DICT = cfgv.Map( cfgv.Required('id', cfgv.check_string), cfgv.Required('name', cfgv.check_string), cfgv.Required('entry', cfgv.check_string), - cfgv.Required('language', cfgv.check_one_of(language_names)), + LanguageMigrationRequired('language', cfgv.check_one_of(language_names)), cfgv.Optional('alias', cfgv.check_string, ''), cfgv.Optional('files', check_string_regex, ''), @@ -368,8 +405,10 @@ META_HOOK_DICT = cfgv.Map( 'Hook', 'id', cfgv.Required('id', cfgv.check_string), cfgv.Required('id', cfgv.check_one_of(tuple(k for k, _ in _meta))), - # language must be system - cfgv.Optional('language', cfgv.check_one_of({'system'}), 'system'), + # language must be `unsupported` + cfgv.Optional( + 'language', cfgv.check_one_of({'unsupported'}), 'unsupported', + ), # entry cannot be overridden NotAllowed('entry', cfgv.check_any), *( @@ -402,8 +441,10 @@ CONFIG_HOOK_DICT = cfgv.Map( for item in MANIFEST_HOOK_DICT.items if item.key != 'id' if item.key != 'stages' + if item.key != 'language' # remove ), StagesMigrationNoDefault('stages', []), + LanguageMigration('language', cfgv.check_one_of(language_names)), # remove *_COMMON_HOOK_WARNINGS, ) LOCAL_HOOK_DICT = cfgv.Map( diff --git a/pre_commit/languages/system.py b/pre_commit/languages/unsupported.py similarity index 100% rename from pre_commit/languages/system.py rename to pre_commit/languages/unsupported.py diff --git a/pre_commit/languages/script.py b/pre_commit/languages/unsupported_script.py similarity index 100% rename from pre_commit/languages/script.py rename to pre_commit/languages/unsupported_script.py diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py index 2251abc4..93c698f7 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -380,6 +380,26 @@ def test_no_warning_for_non_deprecated_default_stages(caplog): assert caplog.record_tuples == [] +def test_unsupported_language_migration(): + cfg = {'repos': [sample_local_config(), sample_local_config()]} + cfg['repos'][0]['hooks'][0]['language'] = 'system' + cfg['repos'][1]['hooks'][0]['language'] = 'script' + + cfgv.validate(cfg, CONFIG_SCHEMA) + ret = cfgv.apply_defaults(cfg, CONFIG_SCHEMA) + + assert ret['repos'][0]['hooks'][0]['language'] == 'unsupported' + assert ret['repos'][1]['hooks'][0]['language'] == 'unsupported_script' + + +def test_unsupported_language_migration_language_required(): + cfg = {'repos': [sample_local_config()]} + del cfg['repos'][0]['hooks'][0]['language'] + + with pytest.raises(cfgv.ValidationError): + cfgv.validate(cfg, CONFIG_SCHEMA) + + @pytest.mark.parametrize( 'manifest_obj', ( diff --git a/tests/languages/system_test.py b/tests/languages/system_test.py deleted file mode 100644 index dcd9cf1e..00000000 --- a/tests/languages/system_test.py +++ /dev/null @@ -1,9 +0,0 @@ -from __future__ import annotations - -from pre_commit.languages import system -from testing.language_helpers import run_language - - -def test_system_language(tmp_path): - expected = (0, b'hello hello world\n') - assert run_language(tmp_path, system, 'echo hello hello world') == expected diff --git a/tests/languages/script_test.py b/tests/languages/unsupported_script_test.py similarity index 63% rename from tests/languages/script_test.py rename to tests/languages/unsupported_script_test.py index a02f615a..b15b67e7 100644 --- a/tests/languages/script_test.py +++ b/tests/languages/unsupported_script_test.py @@ -1,14 +1,14 @@ from __future__ import annotations -from pre_commit.languages import script +from pre_commit.languages import unsupported_script from pre_commit.util import make_executable from testing.language_helpers import run_language -def test_script_language(tmp_path): +def test_unsupported_script_language(tmp_path): exe = tmp_path.joinpath('main') exe.write_text('#!/usr/bin/env bash\necho hello hello world\n') make_executable(exe) expected = (0, b'hello hello world\n') - assert run_language(tmp_path, script, 'main') == expected + assert run_language(tmp_path, unsupported_script, 'main') == expected diff --git a/tests/languages/unsupported_test.py b/tests/languages/unsupported_test.py new file mode 100644 index 00000000..7f8461e0 --- /dev/null +++ b/tests/languages/unsupported_test.py @@ -0,0 +1,10 @@ +from __future__ import annotations + +from pre_commit.languages import unsupported +from testing.language_helpers import run_language + + +def test_unsupported_language(tmp_path): + expected = (0, b'hello hello world\n') + ret = run_language(tmp_path, unsupported, 'echo hello hello world') + assert ret == expected diff --git a/tests/repository_test.py b/tests/repository_test.py index f1559301..b1c7a002 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -17,7 +17,7 @@ from pre_commit.clientlib import CONFIG_SCHEMA from pre_commit.clientlib import load_manifest from pre_commit.hook import Hook from pre_commit.languages import python -from pre_commit.languages import system +from pre_commit.languages import unsupported from pre_commit.prefix import Prefix from pre_commit.repository import _hook_installed from pre_commit.repository import all_hooks @@ -424,7 +424,7 @@ def test_manifest_hooks(tempdir_factory, store): exclude_types=[], files='', id='bash_hook', - language='script', + language='unsupported_script', language_version='default', log_file='', minimum_pre_commit_version='0', @@ -457,7 +457,7 @@ def test_non_installable_hook_error_for_language_version(store, caplog): 'hooks': [{ 'id': 'system-hook', 'name': 'system-hook', - 'language': 'system', + 'language': 'unsupported', 'entry': 'python3 -c "import sys; print(sys.version)"', 'language_version': 'python3.10', }], @@ -469,7 +469,7 @@ def test_non_installable_hook_error_for_language_version(store, caplog): msg, = caplog.messages assert msg == ( 'The hook `system-hook` specifies `language_version` but is using ' - 'language `system` which does not install an environment. ' + 'language `unsupported` which does not install an environment. ' 'Perhaps you meant to use a specific language?' ) @@ -480,7 +480,7 @@ def test_non_installable_hook_error_for_additional_dependencies(store, caplog): 'hooks': [{ 'id': 'system-hook', 'name': 'system-hook', - 'language': 'system', + 'language': 'unsupported', 'entry': 'python3 -c "import sys; print(sys.version)"', 'additional_dependencies': ['astpretty'], }], @@ -492,14 +492,14 @@ def test_non_installable_hook_error_for_additional_dependencies(store, caplog): msg, = caplog.messages assert msg == ( 'The hook `system-hook` specifies `additional_dependencies` but is ' - 'using language `system` which does not install an environment. ' + 'using language `unsupported` which does not install an environment. ' 'Perhaps you meant to use a specific language?' ) def test_args_with_spaces_and_quotes(tmp_path): ret = run_language( - tmp_path, system, + tmp_path, unsupported, f"{shlex.quote(sys.executable)} -c 'import sys; print(sys.argv[1:])'", ('i have spaces', 'and"\'quotes', '$and !this'), ) From f80801d75a429d5eafa1d87e9f88f73b108d1890 Mon Sep 17 00:00:00 2001 From: Radek Hrbacek Date: Fri, 5 Sep 2025 15:01:10 +0200 Subject: [PATCH 087/102] Fix docker-in-docker detection for cgroups v2 --- pre_commit/languages/docker.py | 42 +++--- tests/languages/docker_test.py | 230 +++++++++++++++++++++++++-------- 2 files changed, 202 insertions(+), 70 deletions(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index d5ce1eb7..7f45ac86 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -1,9 +1,11 @@ from __future__ import annotations +import contextlib import functools import hashlib import json import os +import re from collections.abc import Sequence from pre_commit import lang_base @@ -17,31 +19,33 @@ get_default_version = lang_base.basic_get_default_version health_check = lang_base.basic_health_check in_env = lang_base.no_env # no special environment for docker - -def _is_in_docker() -> bool: - try: - with open('/proc/1/cgroup', 'rb') as f: - return b'docker' in f.read() - except FileNotFoundError: - return False +_HOSTNAME_MOUNT_RE = re.compile( + rb""" + /containers + (?:/overlay-containers)? + /([a-z0-9]{64}) + (?:/userdata)? + /hostname + """, + re.VERBOSE, +) -def _get_container_id() -> str: - # It's assumed that we already check /proc/1/cgroup in _is_in_docker. The - # cpuset cgroup controller existed since cgroups were introduced so this - # way of getting the container ID is pretty reliable. - with open('/proc/1/cgroup', 'rb') as f: - for line in f.readlines(): - if line.split(b':')[1] == b'cpuset': - return os.path.basename(line.split(b':')[2]).strip().decode() - raise RuntimeError('Failed to find the container ID in /proc/1/cgroup.') +def _get_container_id() -> str | None: + with contextlib.suppress(FileNotFoundError): + with open('/proc/1/mountinfo', 'rb') as f: + for line in f: + m = _HOSTNAME_MOUNT_RE.search(line) + if m: + return m[1].decode() + + return None def _get_docker_path(path: str) -> str: - if not _is_in_docker(): - return path - container_id = _get_container_id() + if container_id is None: + return path try: _, out, _ = cmd_output_b('docker', 'inspect', container_id) diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index b830439a..e269976f 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -14,40 +14,173 @@ from pre_commit.util import CalledProcessError from testing.language_helpers import run_language from testing.util import xfailif_windows -DOCKER_CGROUP_EXAMPLE = b'''\ -12:hugetlb:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -11:blkio:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -10:freezer:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -9:cpu,cpuacct:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -8:pids:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -7:rdma:/ -6:net_cls,net_prio:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -5:cpuset:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -4:devices:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -3:memory:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -2:perf_event:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -1:name=systemd:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 -0::/system.slice/containerd.service +DOCKER_CGROUPS_V1_MOUNTINFO_EXAMPLE = b'''\ +759 717 0:52 / / rw,relatime master:300 - overlay overlay rw,lowerdir=/var/lib/docker/overlay2/l/PCPE5P5IVGM7CFCPJR353N3ONK:/var/lib/docker/overlay2/l/EQFSDHFAJ333VEMEJD4ZTRIZCB,upperdir=/var/lib/docker/overlay2/0d9f6bf186030d796505b87d6daa92297355e47641e283d3c09d83a7f221e462/diff,workdir=/var/lib/docker/overlay2/0d9f6bf186030d796505b87d6daa92297355e47641e283d3c09d83a7f221e462/work +760 759 0:58 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +761 759 0:59 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +762 761 0:60 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +763 759 0:61 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro +764 763 0:62 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,mode=755,inode64 +765 764 0:29 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/systemd ro,nosuid,nodev,noexec,relatime master:11 - cgroup cgroup rw,xattr,name=systemd +766 764 0:32 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/rdma ro,nosuid,nodev,noexec,relatime master:15 - cgroup cgroup rw,rdma +767 764 0:33 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/cpu,cpuacct ro,nosuid,nodev,noexec,relatime master:16 - cgroup cgroup rw,cpu,cpuacct +768 764 0:34 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/cpuset ro,nosuid,nodev,noexec,relatime master:17 - cgroup cgroup rw,cpuset +769 764 0:35 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/pids ro,nosuid,nodev,noexec,relatime master:18 - cgroup cgroup rw,pids +770 764 0:36 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime master:19 - cgroup cgroup rw,memory +771 764 0:37 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/perf_event ro,nosuid,nodev,noexec,relatime master:20 - cgroup cgroup rw,perf_event +772 764 0:38 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/net_cls,net_prio ro,nosuid,nodev,noexec,relatime master:21 - cgroup cgroup rw,net_cls,net_prio +773 764 0:39 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/blkio ro,nosuid,nodev,noexec,relatime master:22 - cgroup cgroup rw,blkio +774 764 0:40 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/misc ro,nosuid,nodev,noexec,relatime master:23 - cgroup cgroup rw,misc +775 764 0:41 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/hugetlb ro,nosuid,nodev,noexec,relatime master:24 - cgroup cgroup rw,hugetlb +776 764 0:42 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/devices ro,nosuid,nodev,noexec,relatime master:25 - cgroup cgroup rw,devices +777 764 0:43 /docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 /sys/fs/cgroup/freezer ro,nosuid,nodev,noexec,relatime master:26 - cgroup cgroup rw,freezer +778 761 0:57 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +779 761 0:63 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k,inode64 +780 759 8:5 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/resolv.conf /etc/resolv.conf rw,relatime - ext4 /dev/sda5 rw,errors=remount-ro +781 759 8:5 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/hostname /etc/hostname rw,relatime - ext4 /dev/sda5 rw,errors=remount-ro +782 759 8:5 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/hosts /etc/hosts rw,relatime - ext4 /dev/sda5 rw,errors=remount-ro +718 761 0:60 /0 /dev/console rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +719 760 0:58 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +720 760 0:58 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +721 760 0:58 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +722 760 0:58 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +723 760 0:58 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +724 760 0:64 / /proc/asound ro,relatime - tmpfs tmpfs ro,inode64 +725 760 0:65 / /proc/acpi ro,relatime - tmpfs tmpfs ro,inode64 +726 760 0:59 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +727 760 0:59 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +728 760 0:59 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +729 760 0:66 / /proc/scsi ro,relatime - tmpfs tmpfs ro,inode64 +730 763 0:67 / /sys/firmware ro,relatime - tmpfs tmpfs ro,inode64 +731 763 0:68 / /sys/devices/virtual/powercap ro,relatime - tmpfs tmpfs ro,inode64 +''' # noqa: E501 + +DOCKER_CGROUPS_V2_MOUNTINFO_EXAMPLE = b'''\ +721 386 0:45 / / rw,relatime master:218 - overlay overlay rw,lowerdir=/var/lib/docker/overlay2/l/QHZ7OM7P4AQD3XLG274ZPWAJCV:/var/lib/docker/overlay2/l/5RFG6SZWVGOG2NKEYXJDQCQYX5,upperdir=/var/lib/docker/overlay2/e4ad859fc5d4791932b9b976052f01fb0063e01de3cef916e40ae2121f6a166e/diff,workdir=/var/lib/docker/overlay2/e4ad859fc5d4791932b9b976052f01fb0063e01de3cef916e40ae2121f6a166e/work,nouserxattr +722 721 0:48 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +723 721 0:50 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +724 723 0:51 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +725 721 0:52 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro +726 725 0:26 / /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup rw,nsdelegate,memory_recursiveprot +727 723 0:47 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +728 723 0:53 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k,inode64 +729 721 8:3 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/resolv.conf /etc/resolv.conf rw,relatime - ext4 /dev/sda3 rw,errors=remount-ro +730 721 8:3 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/hostname /etc/hostname rw,relatime - ext4 /dev/sda3 rw,errors=remount-ro +731 721 8:3 /var/lib/docker/containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/hosts /etc/hosts rw,relatime - ext4 /dev/sda3 rw,errors=remount-ro +387 723 0:51 /0 /dev/console rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666 +388 722 0:48 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +389 722 0:48 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +525 722 0:48 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +526 722 0:48 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +571 722 0:48 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +572 722 0:57 / /proc/asound ro,relatime - tmpfs tmpfs ro,inode64 +575 722 0:58 / /proc/acpi ro,relatime - tmpfs tmpfs ro,inode64 +576 722 0:50 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +577 722 0:50 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +578 722 0:50 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,inode64 +579 722 0:59 / /proc/scsi ro,relatime - tmpfs tmpfs ro,inode64 +580 725 0:60 / /sys/firmware ro,relatime - tmpfs tmpfs ro,inode64 +''' # noqa: E501 + +PODMAN_CGROUPS_V1_MOUNTINFO_EXAMPLE = b'''\ +1200 915 0:57 / / rw,relatime - overlay overlay rw,lowerdir=/home/asottile/.local/share/containers/storage/overlay/l/ZWAU3VY3ZHABQJRBUAFPBX7R5D,upperdir=/home/asottile/.local/share/containers/storage/overlay/72504ef163fda63838930450553b7306412ccad139a007626732b3dc43af5200/diff,workdir=/home/asottile/.local/share/containers/storage/overlay/72504ef163fda63838930450553b7306412ccad139a007626732b3dc43af5200/work,volatile,userxattr +1204 1200 0:62 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +1205 1200 0:63 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,uid=1000,gid=1000,inode64 +1206 1200 0:64 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs rw +1207 1205 0:65 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=100004,mode=620,ptmxmode=666 +1208 1205 0:61 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +1209 1200 0:53 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/.containerenv /run/.containerenv rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=814036k,mode=700,uid=1000,gid=1000,inode64 +1210 1200 0:53 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/resolv.conf /etc/resolv.conf rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=814036k,mode=700,uid=1000,gid=1000,inode64 +1211 1200 0:53 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/hosts /etc/hosts rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=814036k,mode=700,uid=1000,gid=1000,inode64 +1212 1205 0:56 / /dev/shm rw,relatime - tmpfs shm rw,size=64000k,uid=1000,gid=1000,inode64 +1213 1200 0:53 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/hostname /etc/hostname rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=814036k,mode=700,uid=1000,gid=1000,inode64 +1214 1206 0:66 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs cgroup rw,size=1024k,uid=1000,gid=1000,inode64 +1215 1214 0:43 / /sys/fs/cgroup/freezer ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,freezer +1216 1214 0:42 /user.slice /sys/fs/cgroup/devices ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,devices +1217 1214 0:41 / /sys/fs/cgroup/hugetlb ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,hugetlb +1218 1214 0:40 / /sys/fs/cgroup/misc ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,misc +1219 1214 0:39 / /sys/fs/cgroup/blkio ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,blkio +1220 1214 0:38 / /sys/fs/cgroup/net_cls,net_prio ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,net_cls,net_prio +1221 1214 0:37 / /sys/fs/cgroup/perf_event ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,perf_event +1222 1214 0:36 /user.slice/user-1000.slice/user@1000.service /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,memory +1223 1214 0:35 /user.slice/user-1000.slice/user@1000.service /sys/fs/cgroup/pids ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,pids +1224 1214 0:34 / /sys/fs/cgroup/cpuset ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpuset +1225 1214 0:33 / /sys/fs/cgroup/cpu,cpuacct ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,cpu,cpuacct +1226 1214 0:32 / /sys/fs/cgroup/rdma ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,rdma +1227 1214 0:29 /user.slice/user-1000.slice/user@1000.service/apps.slice/apps-org.gnome.Terminal.slice/vte-spawn-0c50448e-b395-4d76-8b92-379f16e5066f.scope /sys/fs/cgroup/systemd ro,nosuid,nodev,noexec,relatime - cgroup cgroup rw,xattr,name=systemd +1228 1205 0:5 /null /dev/null rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1229 1205 0:5 /zero /dev/zero rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1230 1205 0:5 /full /dev/full rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1231 1205 0:5 /tty /dev/tty rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1232 1205 0:5 /random /dev/random rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1233 1205 0:5 /urandom /dev/urandom rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1234 1204 0:67 / /proc/acpi ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +1235 1204 0:5 /null /proc/kcore rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1236 1204 0:5 /null /proc/keys rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1237 1204 0:5 /null /proc/timer_list rw,nosuid,noexec,relatime - devtmpfs udev rw,size=4031656k,nr_inodes=1007914,mode=755,inode64 +1238 1204 0:68 / /proc/scsi ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +1239 1206 0:69 / /sys/firmware ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +1240 1206 0:70 / /sys/dev/block ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +1241 1204 0:62 /asound /proc/asound ro,relatime - proc proc rw +1242 1204 0:62 /bus /proc/bus ro,relatime - proc proc rw +1243 1204 0:62 /fs /proc/fs ro,relatime - proc proc rw +1244 1204 0:62 /irq /proc/irq ro,relatime - proc proc rw +1245 1204 0:62 /sys /proc/sys ro,relatime - proc proc rw +1256 1204 0:62 /sysrq-trigger /proc/sysrq-trigger ro,relatime - proc proc rw +916 1205 0:65 /0 /dev/console rw,relatime - devpts devpts rw,gid=100004,mode=620,ptmxmode=666 +''' # noqa: E501 + +PODMAN_CGROUPS_V2_MOUNTINFO_EXAMPLE = b'''\ +685 690 0:63 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/resolv.conf /etc/resolv.conf rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=1637624k,nr_inodes=409406,mode=700,uid=1000,gid=1000,inode64 +686 690 0:63 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/hosts /etc/hosts rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=1637624k,nr_inodes=409406,mode=700,uid=1000,gid=1000,inode64 +687 692 0:50 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=64000k,uid=1000,gid=1000,inode64 +688 690 0:63 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/.containerenv /run/.containerenv rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=1637624k,nr_inodes=409406,mode=700,uid=1000,gid=1000,inode64 +689 690 0:63 /containers/overlay-containers/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7/userdata/hostname /etc/hostname rw,nosuid,nodev,relatime - tmpfs tmpfs rw,size=1637624k,nr_inodes=409406,mode=700,uid=1000,gid=1000,inode64 +690 546 0:55 / / rw,relatime - overlay overlay rw,lowerdir=/home/asottile/.local/share/containers/storage/overlay/l/NPOHYOD3PI3YW6TQSGBOVOUSK6,upperdir=/home/asottile/.local/share/containers/storage/overlay/565c206fb79f876ffd5f069b8bd7a97fb5e47d5d07396b0c395a4ed6725d4a8e/diff,workdir=/home/asottile/.local/share/containers/storage/overlay/565c206fb79f876ffd5f069b8bd7a97fb5e47d5d07396b0c395a4ed6725d4a8e/work,redirect_dir=nofollow,uuid=on,volatile,userxattr +691 690 0:59 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw +692 690 0:61 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755,uid=1000,gid=1000,inode64 +693 690 0:62 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs rw +694 692 0:66 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=100004,mode=620,ptmxmode=666 +695 692 0:58 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw +696 693 0:28 / /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup2 rw,nsdelegate,memory_recursiveprot +698 692 0:6 /null /dev/null rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +699 692 0:6 /zero /dev/zero rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +700 692 0:6 /full /dev/full rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +701 692 0:6 /tty /dev/tty rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +702 692 0:6 /random /dev/random rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +703 692 0:6 /urandom /dev/urandom rw,nosuid,noexec,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +704 691 0:67 / /proc/acpi ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +705 691 0:6 /null /proc/kcore ro,nosuid,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +706 691 0:6 /null /proc/keys ro,nosuid,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +707 691 0:6 /null /proc/latency_stats ro,nosuid,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +708 691 0:6 /null /proc/timer_list ro,nosuid,relatime - devtmpfs udev rw,size=8147812k,nr_inodes=2036953,mode=755,inode64 +709 691 0:68 / /proc/scsi ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +710 693 0:69 / /sys/firmware ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +711 693 0:70 / /sys/dev/block ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +712 693 0:71 / /sys/devices/virtual/powercap ro,relatime - tmpfs tmpfs rw,size=0k,uid=1000,gid=1000,inode64 +713 691 0:59 /asound /proc/asound ro,nosuid,nodev,noexec,relatime - proc proc rw +714 691 0:59 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw +715 691 0:59 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw +716 691 0:59 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw +717 691 0:59 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw +718 691 0:59 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw +547 692 0:66 /0 /dev/console rw,relatime - devpts devpts rw,gid=100004,mode=620,ptmxmode=666 ''' # noqa: E501 # The ID should match the above cgroup example. CONTAINER_ID = 'c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7' # noqa: E501 -NON_DOCKER_CGROUP_EXAMPLE = b'''\ -12:perf_event:/ -11:hugetlb:/ -10:devices:/ -9:blkio:/ -8:rdma:/ -7:cpuset:/ -6:cpu,cpuacct:/ -5:freezer:/ -4:memory:/ -3:pids:/ -2:net_cls,net_prio:/ -1:name=systemd:/init.scope -0::/init.scope -''' +NON_DOCKER_MOUNTINFO_EXAMPLE = b'''\ +21 27 0:19 / /sys rw,nosuid,nodev,noexec,relatime shared:7 - sysfs sysfs rw +22 27 0:20 / /proc rw,nosuid,nodev,noexec,relatime shared:14 - proc proc rw +23 27 0:5 / /dev rw,nosuid,relatime shared:2 - devtmpfs udev rw,size=10219484k,nr_inodes=2554871,mode=755,inode64 +24 23 0:21 / /dev/pts rw,nosuid,noexec,relatime shared:3 - devpts devpts rw,gid=5,mode=620,ptmxmode=000 +25 27 0:22 / /run rw,nosuid,nodev,noexec,relatime shared:5 - tmpfs tmpfs rw,size=2047768k,mode=755,inode64 +27 1 8:2 / / rw,relatime shared:1 - ext4 /dev/sda2 rw,errors=remount-ro +28 21 0:6 / /sys/kernel/security rw,nosuid,nodev,noexec,relatime shared:8 - securityfs securityfs rw +29 23 0:24 / /dev/shm rw,nosuid,nodev shared:4 - tmpfs tmpfs rw,inode64 +30 25 0:25 / /run/lock rw,nosuid,nodev,noexec,relatime shared:6 - tmpfs tmpfs rw,size=5120k,inode64 +''' # noqa: E501 def test_docker_fallback_user(): @@ -99,9 +232,9 @@ def test_docker_user_non_rootless(info_ret): assert docker.get_docker_user() != () -def test_in_docker_no_file(): +def test_container_id_no_file(): with mock.patch.object(builtins, 'open', side_effect=FileNotFoundError): - assert docker._is_in_docker() is False + assert docker._get_container_id() is None def _mock_open(data): @@ -113,38 +246,33 @@ def _mock_open(data): ) -def test_in_docker_docker_in_file(): - with _mock_open(DOCKER_CGROUP_EXAMPLE): - assert docker._is_in_docker() is True - - -def test_in_docker_docker_not_in_file(): - with _mock_open(NON_DOCKER_CGROUP_EXAMPLE): - assert docker._is_in_docker() is False +def test_container_id_not_in_file(): + with _mock_open(NON_DOCKER_MOUNTINFO_EXAMPLE): + assert docker._get_container_id() is None def test_get_container_id(): - with _mock_open(DOCKER_CGROUP_EXAMPLE): + with _mock_open(DOCKER_CGROUPS_V1_MOUNTINFO_EXAMPLE): + assert docker._get_container_id() == CONTAINER_ID + with _mock_open(DOCKER_CGROUPS_V2_MOUNTINFO_EXAMPLE): + assert docker._get_container_id() == CONTAINER_ID + with _mock_open(PODMAN_CGROUPS_V1_MOUNTINFO_EXAMPLE): + assert docker._get_container_id() == CONTAINER_ID + with _mock_open(PODMAN_CGROUPS_V2_MOUNTINFO_EXAMPLE): assert docker._get_container_id() == CONTAINER_ID -def test_get_container_id_failure(): - with _mock_open(b''), pytest.raises(RuntimeError): - docker._get_container_id() - - def test_get_docker_path_not_in_docker_returns_same(): - with mock.patch.object(docker, '_is_in_docker', return_value=False): + with _mock_open(b''): assert docker._get_docker_path('abc') == 'abc' @pytest.fixture def in_docker(): - with mock.patch.object(docker, '_is_in_docker', return_value=True): - with mock.patch.object( - docker, '_get_container_id', return_value=CONTAINER_ID, - ): - yield + with mock.patch.object( + docker, '_get_container_id', return_value=CONTAINER_ID, + ): + yield def _linux_commonpath(): From 17cf8864737af2ce75c73839a0cdedc26ce50598 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 8 Nov 2025 16:11:43 -0500 Subject: [PATCH 088/102] v4.4.0 --- CHANGELOG.md | 28 ++++++++++++++++++++++++++-- setup.cfg | 2 +- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 42a63f78..b27af5e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,27 @@ +4.4.0 - 2025-11-08 +================== + +### Features +- Add `--fail-fast` option to `pre-commit run`. + - #3528 PR by @JulianMaurin. +- Upgrade `ruby-build` / `rbenv`. + - #3566 PR by @asottile. + - #3565 issue by @MRigal. +- Add `language: unsupported` / `language: unsupported_script` as aliases + for `language: system` / `language: script` (which will eventually be + deprecated). + - #3577 PR by @asottile. +- Add support docker-in-docker detection for cgroups v2. + - #3535 PR by @br-rhrbacek. + - #3360 issue by @JasonAlt. + +### Fixes +- Handle when docker gives `SecurityOptions: null`. + - #3537 PR by @asottile. + - #3514 issue by @jenstroeger. +- Fix error context for invalid `stages` in `.pre-commit-config.yaml`. + - #3576 PR by @asottile. + 4.3.0 - 2025-08-09 ================== @@ -71,7 +95,7 @@ - #3315 PR by @asottile. - #2732 issue by @asottile. -### Migrating +### Updating - `language: python_venv` has been removed -- use `language: python` instead. - #3320 PR by @asottile. - #2734 issue by @asottile. @@ -159,7 +183,7 @@ - Use `time.monotonic()` for more accurate hook timing. - #3024 PR by @adamchainz. -### Migrating +### Updating - Require npm 6.x+ for `language: node` hooks. - #2996 PR by @RoelAdriaans. - #1983 issue by @henryiii. diff --git a/setup.cfg b/setup.cfg index 17c3fe0e..be031c3e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.3.0 +version = 4.4.0 description = A framework for managing and maintaining multi-language pre-commit hooks. long_description = file: README.md long_description_content_type = text/markdown From d5c273a2ba0c712659640e9487adb38bd7da68f6 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 9 Nov 2025 16:57:40 -0500 Subject: [PATCH 089/102] refactor gc into store this will make refactoring this easier later and limits the api surface of Store --- pre_commit/commands/gc.py | 82 +-------------------------------- pre_commit/store.py | 96 +++++++++++++++++++++++++++++++-------- tests/commands/gc_test.py | 9 ++-- tests/store_test.py | 25 +++++++--- 4 files changed, 101 insertions(+), 111 deletions(-) diff --git a/pre_commit/commands/gc.py b/pre_commit/commands/gc.py index 6892e097..d1941e4b 100644 --- a/pre_commit/commands/gc.py +++ b/pre_commit/commands/gc.py @@ -1,89 +1,9 @@ from __future__ import annotations -import os.path -from typing import Any - -import pre_commit.constants as C from pre_commit import output -from pre_commit.clientlib import InvalidConfigError -from pre_commit.clientlib import InvalidManifestError -from pre_commit.clientlib import load_config -from pre_commit.clientlib import load_manifest -from pre_commit.clientlib import LOCAL -from pre_commit.clientlib import META from pre_commit.store import Store -def _mark_used_repos( - store: Store, - all_repos: dict[tuple[str, str], str], - unused_repos: set[tuple[str, str]], - repo: dict[str, Any], -) -> None: - if repo['repo'] == META: - return - elif repo['repo'] == LOCAL: - for hook in repo['hooks']: - deps = hook.get('additional_dependencies') - unused_repos.discard(( - store.db_repo_name(repo['repo'], deps), C.LOCAL_REPO_VERSION, - )) - else: - key = (repo['repo'], repo['rev']) - path = all_repos.get(key) - # can't inspect manifest if it isn't cloned - if path is None: - return - - try: - manifest = load_manifest(os.path.join(path, C.MANIFEST_FILE)) - except InvalidManifestError: - return - else: - unused_repos.discard(key) - by_id = {hook['id']: hook for hook in manifest} - - for hook in repo['hooks']: - if hook['id'] not in by_id: - continue - - deps = hook.get( - 'additional_dependencies', - by_id[hook['id']]['additional_dependencies'], - ) - unused_repos.discard(( - store.db_repo_name(repo['repo'], deps), repo['rev'], - )) - - -def _gc_repos(store: Store) -> int: - configs = store.select_all_configs() - repos = store.select_all_repos() - - # delete config paths which do not exist - dead_configs = [p for p in configs if not os.path.exists(p)] - live_configs = [p for p in configs if os.path.exists(p)] - - all_repos = {(repo, ref): path for repo, ref, path in repos} - unused_repos = set(all_repos) - for config_path in live_configs: - try: - config = load_config(config_path) - except InvalidConfigError: - dead_configs.append(config_path) - continue - else: - for repo in config['repos']: - _mark_used_repos(store, all_repos, unused_repos, repo) - - store.delete_configs(dead_configs) - for db_repo_name, ref in unused_repos: - store.delete_repo(db_repo_name, ref, all_repos[(db_repo_name, ref)]) - return len(unused_repos) - - def gc(store: Store) -> int: - with store.exclusive_lock(): - repos_removed = _gc_repos(store) - output.write_line(f'{repos_removed} repo(s) removed.') + output.write_line(f'{store.gc()} repo(s) removed.') return 0 diff --git a/pre_commit/store.py b/pre_commit/store.py index 9e3b4048..34c5f0d9 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -8,6 +8,7 @@ import tempfile from collections.abc import Callable from collections.abc import Generator from collections.abc import Sequence +from typing import Any import pre_commit.constants as C from pre_commit import clientlib @@ -96,7 +97,7 @@ class Store: ' PRIMARY KEY (repo, ref)' ');', ) - self._create_config_table(db) + self._create_configs_table(db) # Atomic file move os.replace(tmpfile, self.db_path) @@ -215,7 +216,7 @@ class Store: 'local', C.LOCAL_REPO_VERSION, deps, _make_local_repo, ) - def _create_config_table(self, db: sqlite3.Connection) -> None: + def _create_configs_table(self, db: sqlite3.Connection) -> None: db.executescript( 'CREATE TABLE IF NOT EXISTS configs (' ' path TEXT NOT NULL,' @@ -232,28 +233,83 @@ class Store: return with self.connect() as db: # TODO: eventually remove this and only create in _create - self._create_config_table(db) + self._create_configs_table(db) db.execute('INSERT OR IGNORE INTO configs VALUES (?)', (path,)) - def select_all_configs(self) -> list[str]: - with self.connect() as db: - self._create_config_table(db) - rows = db.execute('SELECT path FROM configs').fetchall() - return [path for path, in rows] + def _mark_used_repos( + self, + all_repos: dict[tuple[str, str], str], + unused_repos: set[tuple[str, str]], + repo: dict[str, Any], + ) -> None: + if repo['repo'] == clientlib.META: + return + elif repo['repo'] == clientlib.LOCAL: + for hook in repo['hooks']: + deps = hook.get('additional_dependencies') + unused_repos.discard(( + self.db_repo_name(repo['repo'], deps), + C.LOCAL_REPO_VERSION, + )) + else: + key = (repo['repo'], repo['rev']) + path = all_repos.get(key) + # can't inspect manifest if it isn't cloned + if path is None: + return - def delete_configs(self, configs: list[str]) -> None: - with self.connect() as db: - rows = [(path,) for path in configs] - db.executemany('DELETE FROM configs WHERE path = ?', rows) + try: + manifest = clientlib.load_manifest( + os.path.join(path, C.MANIFEST_FILE), + ) + except clientlib.InvalidManifestError: + return + else: + unused_repos.discard(key) + by_id = {hook['id']: hook for hook in manifest} - def select_all_repos(self) -> list[tuple[str, str, str]]: - with self.connect() as db: - return db.execute('SELECT repo, ref, path from repos').fetchall() + for hook in repo['hooks']: + if hook['id'] not in by_id: + continue - def delete_repo(self, db_repo_name: str, ref: str, path: str) -> None: - with self.connect() as db: - db.execute( + deps = hook.get( + 'additional_dependencies', + by_id[hook['id']]['additional_dependencies'], + ) + unused_repos.discard(( + self.db_repo_name(repo['repo'], deps), repo['rev'], + )) + + def gc(self) -> int: + with self.exclusive_lock(), self.connect() as db: + self._create_configs_table(db) + + repos = db.execute('SELECT repo, ref, path FROM repos').fetchall() + all_repos = {(repo, ref): path for repo, ref, path in repos} + unused_repos = set(all_repos) + + configs_rows = db.execute('SELECT path FROM configs').fetchall() + configs = [path for path, in configs_rows] + + dead_configs = [] + for config_path in configs: + try: + config = clientlib.load_config(config_path) + except clientlib.InvalidConfigError: + dead_configs.append(config_path) + continue + else: + for repo in config['repos']: + self._mark_used_repos(all_repos, unused_repos, repo) + + paths = [(path,) for path in dead_configs] + db.executemany('DELETE FROM configs WHERE path = ?', paths) + + db.executemany( 'DELETE FROM repos WHERE repo = ? and ref = ?', - (db_repo_name, ref), + sorted(unused_repos), ) - rmtree(path) + for k in unused_repos: + rmtree(all_repos[k]) + + return len(unused_repos) diff --git a/tests/commands/gc_test.py b/tests/commands/gc_test.py index 95113ed5..85e66977 100644 --- a/tests/commands/gc_test.py +++ b/tests/commands/gc_test.py @@ -19,11 +19,13 @@ from testing.util import git_commit def _repo_count(store): - return len(store.select_all_repos()) + with store.connect() as db: + return db.execute('SELECT COUNT(1) FROM repos').fetchone()[0] def _config_count(store): - return len(store.select_all_configs()) + with store.connect() as db: + return db.execute('SELECT COUNT(1) FROM configs').fetchone()[0] def _remove_config_assert_cleared(store, cap_out): @@ -153,7 +155,8 @@ def test_invalid_manifest_gcd(tempdir_factory, store, in_git_dir, cap_out): install_hooks(C.CONFIG_FILE, store) # we'll "break" the manifest to simulate an old version clone - (_, _, path), = store.select_all_repos() + with store.connect() as db: + path, = db.execute('SELECT path FROM repos').fetchone() os.remove(os.path.join(path, C.MANIFEST_FILE)) assert _config_count(store) == 1 diff --git a/tests/store_test.py b/tests/store_test.py index 7d4dffb0..4b04a8e7 100644 --- a/tests/store_test.py +++ b/tests/store_test.py @@ -22,6 +22,17 @@ from testing.util import git_commit from testing.util import xfailif_windows +def _select_all_configs(store: Store) -> list[str]: + with store.connect() as db: + rows = db.execute('SELECT * FROM configs').fetchall() + return [path for path, in rows] + + +def _select_all_repos(store: Store) -> list[tuple[str, str, str]]: + with store.connect() as db: + return db.execute('SELECT repo, ref, path FROM repos').fetchall() + + def test_our_session_fixture_works(): """There's a session fixture which makes `Store` invariantly raise to prevent writing to the home directory. @@ -91,7 +102,7 @@ def test_clone(store, tempdir_factory, caplog): assert git.head_rev(ret) == rev # Assert there's an entry in the sqlite db for this - assert store.select_all_repos() == [(path, rev, ret)] + assert _select_all_repos(store) == [(path, rev, ret)] def test_warning_for_deprecated_stages_on_init(store, tempdir_factory, caplog): @@ -217,7 +228,7 @@ def test_clone_shallow_failure_fallback_to_complete( assert git.head_rev(ret) == rev # Assert there's an entry in the sqlite db for this - assert store.select_all_repos() == [(path, rev, ret)] + assert _select_all_repos(store) == [(path, rev, ret)] def test_clone_tag_not_on_mainline(store, tempdir_factory): @@ -265,7 +276,7 @@ def test_mark_config_as_used(store, tmpdir): with tmpdir.as_cwd(): f = tmpdir.join('f').ensure() store.mark_config_used('f') - assert store.select_all_configs() == [f.strpath] + assert _select_all_configs(store) == [f.strpath] def test_mark_config_as_used_idempotent(store, tmpdir): @@ -275,7 +286,7 @@ def test_mark_config_as_used_idempotent(store, tmpdir): def test_mark_config_as_used_does_not_exist(store): store.mark_config_used('f') - assert store.select_all_configs() == [] + assert _select_all_configs(store) == [] def _simulate_pre_1_14_0(store): @@ -283,9 +294,9 @@ def _simulate_pre_1_14_0(store): db.executescript('DROP TABLE configs') -def test_select_all_configs_roll_forward(store): +def test_gc_roll_forward(store): _simulate_pre_1_14_0(store) - assert store.select_all_configs() == [] + assert store.gc() == 0 def test_mark_config_as_used_roll_forward(store, tmpdir): @@ -314,7 +325,7 @@ def test_mark_config_as_used_readonly(tmpdir): assert store.readonly # should be skipped due to readonly store.mark_config_used(str(cfg)) - assert store.select_all_configs() == [] + assert _select_all_configs(store) == [] def test_clone_with_recursive_submodules(store, tmp_path): From 063229aee77ba2da3e9ed5c8217070b4128234fd Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Nov 2025 20:59:54 +0000 Subject: [PATCH 090/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/pyupgrade: v3.21.0 → v3.21.1](https://github.com/asottile/pyupgrade/compare/v3.21.0...v3.21.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fa077365..e47d56ca 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ repos: hooks: - id: add-trailing-comma - repo: https://github.com/asottile/pyupgrade - rev: v3.21.0 + rev: v3.21.1 hooks: - id: pyupgrade args: [--py310-plus] From 66278a9a0b69a69fde820d2b85a7e198eae52981 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Wed, 19 Nov 2025 14:29:50 -0500 Subject: [PATCH 091/102] move logic for gc back to commands.gc --- pre_commit/commands/gc.py | 91 ++++++++++++++++++++++++++++++++++++++- pre_commit/store.py | 80 ---------------------------------- tests/commands/gc_test.py | 8 ++++ tests/store_test.py | 13 +----- 4 files changed, 100 insertions(+), 92 deletions(-) diff --git a/pre_commit/commands/gc.py b/pre_commit/commands/gc.py index d1941e4b..975d5e4c 100644 --- a/pre_commit/commands/gc.py +++ b/pre_commit/commands/gc.py @@ -1,9 +1,98 @@ from __future__ import annotations +import os.path +from typing import Any + +import pre_commit.constants as C from pre_commit import output +from pre_commit.clientlib import InvalidConfigError +from pre_commit.clientlib import InvalidManifestError +from pre_commit.clientlib import load_config +from pre_commit.clientlib import load_manifest +from pre_commit.clientlib import LOCAL +from pre_commit.clientlib import META from pre_commit.store import Store +from pre_commit.util import rmtree + + +def _mark_used_repos( + store: Store, + all_repos: dict[tuple[str, str], str], + unused_repos: set[tuple[str, str]], + repo: dict[str, Any], +) -> None: + if repo['repo'] == META: + return + elif repo['repo'] == LOCAL: + for hook in repo['hooks']: + deps = hook.get('additional_dependencies') + unused_repos.discard(( + store.db_repo_name(repo['repo'], deps), + C.LOCAL_REPO_VERSION, + )) + else: + key = (repo['repo'], repo['rev']) + path = all_repos.get(key) + # can't inspect manifest if it isn't cloned + if path is None: + return + + try: + manifest = load_manifest(os.path.join(path, C.MANIFEST_FILE)) + except InvalidManifestError: + return + else: + unused_repos.discard(key) + by_id = {hook['id']: hook for hook in manifest} + + for hook in repo['hooks']: + if hook['id'] not in by_id: + continue + + deps = hook.get( + 'additional_dependencies', + by_id[hook['id']]['additional_dependencies'], + ) + unused_repos.discard(( + store.db_repo_name(repo['repo'], deps), repo['rev'], + )) + + +def _gc(store: Store) -> int: + with store.exclusive_lock(), store.connect() as db: + store._create_configs_table(db) + + repos = db.execute('SELECT repo, ref, path FROM repos').fetchall() + all_repos = {(repo, ref): path for repo, ref, path in repos} + unused_repos = set(all_repos) + + configs_rows = db.execute('SELECT path FROM configs').fetchall() + configs = [path for path, in configs_rows] + + dead_configs = [] + for config_path in configs: + try: + config = load_config(config_path) + except InvalidConfigError: + dead_configs.append(config_path) + continue + else: + for repo in config['repos']: + _mark_used_repos(store, all_repos, unused_repos, repo) + + paths = [(path,) for path in dead_configs] + db.executemany('DELETE FROM configs WHERE path = ?', paths) + + db.executemany( + 'DELETE FROM repos WHERE repo = ? and ref = ?', + sorted(unused_repos), + ) + for k in unused_repos: + rmtree(all_repos[k]) + + return len(unused_repos) def gc(store: Store) -> int: - output.write_line(f'{store.gc()} repo(s) removed.') + output.write_line(f'{_gc(store)} repo(s) removed.') return 0 diff --git a/pre_commit/store.py b/pre_commit/store.py index 34c5f0d9..dc90c051 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -8,7 +8,6 @@ import tempfile from collections.abc import Callable from collections.abc import Generator from collections.abc import Sequence -from typing import Any import pre_commit.constants as C from pre_commit import clientlib @@ -18,7 +17,6 @@ from pre_commit.util import CalledProcessError from pre_commit.util import clean_path_on_failure from pre_commit.util import cmd_output_b from pre_commit.util import resource_text -from pre_commit.util import rmtree logger = logging.getLogger('pre_commit') @@ -235,81 +233,3 @@ class Store: # TODO: eventually remove this and only create in _create self._create_configs_table(db) db.execute('INSERT OR IGNORE INTO configs VALUES (?)', (path,)) - - def _mark_used_repos( - self, - all_repos: dict[tuple[str, str], str], - unused_repos: set[tuple[str, str]], - repo: dict[str, Any], - ) -> None: - if repo['repo'] == clientlib.META: - return - elif repo['repo'] == clientlib.LOCAL: - for hook in repo['hooks']: - deps = hook.get('additional_dependencies') - unused_repos.discard(( - self.db_repo_name(repo['repo'], deps), - C.LOCAL_REPO_VERSION, - )) - else: - key = (repo['repo'], repo['rev']) - path = all_repos.get(key) - # can't inspect manifest if it isn't cloned - if path is None: - return - - try: - manifest = clientlib.load_manifest( - os.path.join(path, C.MANIFEST_FILE), - ) - except clientlib.InvalidManifestError: - return - else: - unused_repos.discard(key) - by_id = {hook['id']: hook for hook in manifest} - - for hook in repo['hooks']: - if hook['id'] not in by_id: - continue - - deps = hook.get( - 'additional_dependencies', - by_id[hook['id']]['additional_dependencies'], - ) - unused_repos.discard(( - self.db_repo_name(repo['repo'], deps), repo['rev'], - )) - - def gc(self) -> int: - with self.exclusive_lock(), self.connect() as db: - self._create_configs_table(db) - - repos = db.execute('SELECT repo, ref, path FROM repos').fetchall() - all_repos = {(repo, ref): path for repo, ref, path in repos} - unused_repos = set(all_repos) - - configs_rows = db.execute('SELECT path FROM configs').fetchall() - configs = [path for path, in configs_rows] - - dead_configs = [] - for config_path in configs: - try: - config = clientlib.load_config(config_path) - except clientlib.InvalidConfigError: - dead_configs.append(config_path) - continue - else: - for repo in config['repos']: - self._mark_used_repos(all_repos, unused_repos, repo) - - paths = [(path,) for path in dead_configs] - db.executemany('DELETE FROM configs WHERE path = ?', paths) - - db.executemany( - 'DELETE FROM repos WHERE repo = ? and ref = ?', - sorted(unused_repos), - ) - for k in unused_repos: - rmtree(all_repos[k]) - - return len(unused_repos) diff --git a/tests/commands/gc_test.py b/tests/commands/gc_test.py index 85e66977..992b02f3 100644 --- a/tests/commands/gc_test.py +++ b/tests/commands/gc_test.py @@ -165,3 +165,11 @@ def test_invalid_manifest_gcd(tempdir_factory, store, in_git_dir, cap_out): assert _config_count(store) == 1 assert _repo_count(store) == 0 assert cap_out.get().splitlines()[-1] == '1 repo(s) removed.' + + +def test_gc_pre_1_14_roll_forward(store, cap_out): + with store.connect() as db: # simulate pre-1.14.0 + db.executescript('DROP TABLE configs') + + assert not gc(store) + assert cap_out.get() == '0 repo(s) removed.\n' diff --git a/tests/store_test.py b/tests/store_test.py index 4b04a8e7..13f198ea 100644 --- a/tests/store_test.py +++ b/tests/store_test.py @@ -289,18 +289,9 @@ def test_mark_config_as_used_does_not_exist(store): assert _select_all_configs(store) == [] -def _simulate_pre_1_14_0(store): - with store.connect() as db: - db.executescript('DROP TABLE configs') - - -def test_gc_roll_forward(store): - _simulate_pre_1_14_0(store) - assert store.gc() == 0 - - def test_mark_config_as_used_roll_forward(store, tmpdir): - _simulate_pre_1_14_0(store) + with store.connect() as db: # simulate pre-1.14.0 + db.executescript('DROP TABLE configs') test_mark_config_as_used(store, tmpdir) From 844dacc168d68a32553ecf8a99178ab395fdb11e Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Wed, 19 Nov 2025 14:57:01 -0500 Subject: [PATCH 092/102] add forward-compat error message --- pre_commit/clientlib.py | 11 ++++++++++- tests/clientlib_test.py | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index eb0fd4d6..51f14d26 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -270,10 +270,19 @@ class InvalidManifestError(FatalError): pass +def _load_manifest_forward_compat(contents: str) -> object: + obj = yaml_load(contents) + if isinstance(obj, dict): + check_min_version('5') + raise AssertionError('unreachable') + else: + return obj + + load_manifest = functools.partial( cfgv.load_from_filename, schema=MANIFEST_SCHEMA, - load_strategy=yaml_load, + load_strategy=_load_manifest_forward_compat, exc_tp=InvalidManifestError, ) diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py index 93c698f7..2c42b80c 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -12,6 +12,8 @@ from pre_commit.clientlib import CONFIG_HOOK_DICT from pre_commit.clientlib import CONFIG_REPO_DICT from pre_commit.clientlib import CONFIG_SCHEMA from pre_commit.clientlib import DEFAULT_LANGUAGE_VERSION +from pre_commit.clientlib import InvalidManifestError +from pre_commit.clientlib import load_manifest from pre_commit.clientlib import MANIFEST_HOOK_DICT from pre_commit.clientlib import MANIFEST_SCHEMA from pre_commit.clientlib import META_HOOK_DICT @@ -588,3 +590,18 @@ def test_config_hook_stages_defaulting(): 'id': 'fake-hook', 'stages': ['commit-msg', 'pre-push', 'pre-commit', 'pre-merge-commit'], } + + +def test_manifest_v5_forward_compat(tmp_path): + manifest = tmp_path.joinpath('.pre-commit-hooks.yaml') + manifest.write_text('hooks: {}') + + with pytest.raises(InvalidManifestError) as excinfo: + load_manifest(manifest) + assert str(excinfo.value) == ( + f'\n' + f'==> File {manifest}\n' + f'=====> \n' + f'=====> pre-commit version 5 is required but version {C.VERSION} ' + f'is installed. Perhaps run `pip install --upgrade pre-commit`.' + ) From 8d34f95308fc4c14dea3d3e90153acfdaf55e2de Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Fri, 21 Nov 2025 15:09:41 -0500 Subject: [PATCH 093/102] use ExitStack instead of start + stop --- tests/main_test.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/main_test.py b/tests/main_test.py index 945349fa..325792d8 100644 --- a/tests/main_test.py +++ b/tests/main_test.py @@ -1,6 +1,7 @@ from __future__ import annotations import argparse +import contextlib import os.path from unittest import mock @@ -97,11 +98,9 @@ CMDS = tuple(fn.replace('_', '-') for fn in FNS) @pytest.fixture def mock_commands(): - mcks = {fn: mock.patch.object(main, fn).start() for fn in FNS} - ret = auto_namedtuple(**mcks) - yield ret - for mck in ret: - mck.stop() + with contextlib.ExitStack() as ctx: + mcks = {f: ctx.enter_context(mock.patch.object(main, f)) for f in FNS} + yield auto_namedtuple(**mcks) @pytest.fixture From bdf68790b78158268bbc8482f76491a61d75809a Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Fri, 21 Nov 2025 16:38:55 -0500 Subject: [PATCH 094/102] add pre-commit hazmat --- pre_commit/commands/hazmat.py | 95 +++++++++++++++++++++++++++++++++ pre_commit/lang_base.py | 6 ++- pre_commit/main.py | 10 +++- tests/commands/hazmat_test.py | 99 +++++++++++++++++++++++++++++++++++ tests/lang_base_test.py | 12 +++++ tests/main_test.py | 12 +++++ tests/repository_test.py | 11 ++++ 7 files changed, 243 insertions(+), 2 deletions(-) create mode 100644 pre_commit/commands/hazmat.py create mode 100644 tests/commands/hazmat_test.py diff --git a/pre_commit/commands/hazmat.py b/pre_commit/commands/hazmat.py new file mode 100644 index 00000000..01b27ce6 --- /dev/null +++ b/pre_commit/commands/hazmat.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +import argparse +import subprocess +from collections.abc import Sequence + +from pre_commit.parse_shebang import normalize_cmd + + +def add_parsers(parser: argparse.ArgumentParser) -> None: + subparsers = parser.add_subparsers(dest='tool') + + cd_parser = subparsers.add_parser( + 'cd', help='cd to a subdir and run the command', + ) + cd_parser.add_argument('subdir') + cd_parser.add_argument('cmd', nargs=argparse.REMAINDER) + + ignore_exit_code_parser = subparsers.add_parser( + 'ignore-exit-code', help='run the command but ignore the exit code', + ) + ignore_exit_code_parser.add_argument('cmd', nargs=argparse.REMAINDER) + + n1_parser = subparsers.add_parser( + 'n1', help='run the command once per filename', + ) + n1_parser.add_argument('cmd', nargs=argparse.REMAINDER) + + +def _cmd_filenames(cmd: tuple[str, ...]) -> tuple[ + tuple[str, ...], + tuple[str, ...], +]: + for idx, val in enumerate(reversed(cmd)): + if val == '--': + split = len(cmd) - idx + break + else: + raise SystemExit('hazmat entry must end with `--`') + + return cmd[:split - 1], cmd[split:] + + +def cd(subdir: str, cmd: tuple[str, ...]) -> int: + cmd, filenames = _cmd_filenames(cmd) + + prefix = f'{subdir}/' + new_filenames = [] + for filename in filenames: + if not filename.startswith(prefix): + raise SystemExit(f'unexpected file without {prefix=}: {filename}') + else: + new_filenames.append(filename.removeprefix(prefix)) + + cmd = normalize_cmd(cmd) + return subprocess.call((*cmd, *new_filenames), cwd=subdir) + + +def ignore_exit_code(cmd: tuple[str, ...]) -> int: + cmd = normalize_cmd(cmd) + subprocess.call(cmd) + return 0 + + +def n1(cmd: tuple[str, ...]) -> int: + cmd, filenames = _cmd_filenames(cmd) + cmd = normalize_cmd(cmd) + ret = 0 + for filename in filenames: + ret |= subprocess.call((*cmd, filename)) + return ret + + +def impl(args: argparse.Namespace) -> int: + args.cmd = tuple(args.cmd) + if args.tool == 'cd': + return cd(args.subdir, args.cmd) + elif args.tool == 'ignore-exit-code': + return ignore_exit_code(args.cmd) + elif args.tool == 'n1': + return n1(args.cmd) + else: + raise NotImplementedError(f'unexpected tool: {args.tool}') + + +def main(argv: Sequence[str] | None = None) -> int: + parser = argparse.ArgumentParser() + add_parsers(parser) + args = parser.parse_args(argv) + + return impl(args) + + +if __name__ == '__main__': + raise SystemExit(main()) diff --git a/pre_commit/lang_base.py b/pre_commit/lang_base.py index 95be7b9b..198e9365 100644 --- a/pre_commit/lang_base.py +++ b/pre_commit/lang_base.py @@ -5,6 +5,7 @@ import os import random import re import shlex +import sys from collections.abc import Generator from collections.abc import Sequence from typing import Any @@ -171,7 +172,10 @@ def run_xargs( def hook_cmd(entry: str, args: Sequence[str]) -> tuple[str, ...]: - return (*shlex.split(entry), *args) + cmd = shlex.split(entry) + if cmd[:2] == ['pre-commit', 'hazmat']: + cmd = [sys.executable, '-m', 'pre_commit.commands.hazmat', *cmd[2:]] + return (*cmd, *args) def basic_run_hook( diff --git a/pre_commit/main.py b/pre_commit/main.py index c33fbfda..0c3eefda 100644 --- a/pre_commit/main.py +++ b/pre_commit/main.py @@ -10,6 +10,7 @@ import pre_commit.constants as C from pre_commit import clientlib from pre_commit import git from pre_commit.color import add_color_option +from pre_commit.commands import hazmat from pre_commit.commands.autoupdate import autoupdate from pre_commit.commands.clean import clean from pre_commit.commands.gc import gc @@ -41,7 +42,7 @@ os.environ.pop('__PYVENV_LAUNCHER__', None) os.environ.pop('PYTHONEXECUTABLE', None) COMMANDS_NO_GIT = { - 'clean', 'gc', 'init-templatedir', 'sample-config', + 'clean', 'gc', 'hazmat', 'init-templatedir', 'sample-config', 'validate-config', 'validate-manifest', } @@ -245,6 +246,11 @@ def main(argv: Sequence[str] | None = None) -> int: _add_cmd('gc', help='Clean unused cached repos.') + hazmat_parser = _add_cmd( + 'hazmat', help='Composable tools for rare use in hook `entry`.', + ) + hazmat.add_parsers(hazmat_parser) + init_templatedir_parser = _add_cmd( 'init-templatedir', help=( @@ -389,6 +395,8 @@ def main(argv: Sequence[str] | None = None) -> int: return clean(store) elif args.command == 'gc': return gc(store) + elif args.command == 'hazmat': + return hazmat.impl(args) elif args.command == 'hook-impl': return hook_impl( store, diff --git a/tests/commands/hazmat_test.py b/tests/commands/hazmat_test.py new file mode 100644 index 00000000..df957e36 --- /dev/null +++ b/tests/commands/hazmat_test.py @@ -0,0 +1,99 @@ +from __future__ import annotations + +import sys + +import pytest + +from pre_commit.commands.hazmat import _cmd_filenames +from pre_commit.commands.hazmat import main +from testing.util import cwd + + +def test_cmd_filenames_no_dash_dash(): + with pytest.raises(SystemExit) as excinfo: + _cmd_filenames(('no', 'dashdash', 'here')) + msg, = excinfo.value.args + assert msg == 'hazmat entry must end with `--`' + + +def test_cmd_filenames_no_filenames(): + cmd, filenames = _cmd_filenames(('hello', 'world', '--')) + assert cmd == ('hello', 'world') + assert filenames == () + + +def test_cmd_filenames_some_filenames(): + cmd, filenames = _cmd_filenames(('hello', 'world', '--', 'f1', 'f2')) + assert cmd == ('hello', 'world') + assert filenames == ('f1', 'f2') + + +def test_cmd_filenames_multiple_dashdash(): + cmd, filenames = _cmd_filenames(('hello', '--', 'arg', '--', 'f1', 'f2')) + assert cmd == ('hello', '--', 'arg') + assert filenames == ('f1', 'f2') + + +def test_cd_unexpected_filename(): + with pytest.raises(SystemExit) as excinfo: + main(('cd', 'subdir', 'cmd', '--', 'subdir/1', 'not-subdir/2')) + msg, = excinfo.value.args + assert msg == "unexpected file without prefix='subdir/': not-subdir/2" + + +def _norm(out): + return out.replace('\r\n', '\n') + + +def test_cd(tmp_path, capfd): + subdir = tmp_path.joinpath('subdir') + subdir.mkdir() + subdir.joinpath('a').write_text('a') + subdir.joinpath('b').write_text('b') + + with cwd(tmp_path): + ret = main(( + 'cd', 'subdir', + sys.executable, '-c', + 'import os; print(os.getcwd());' + 'import sys; [print(open(f).read()) for f in sys.argv[1:]]', + '--', + 'subdir/a', 'subdir/b', + )) + + assert ret == 0 + out, err = capfd.readouterr() + assert _norm(out) == f'{subdir}\na\nb\n' + assert err == '' + + +def test_ignore_exit_code(capfd): + ret = main(( + 'ignore-exit-code', sys.executable, '-c', 'raise SystemExit("bye")', + )) + assert ret == 0 + out, err = capfd.readouterr() + assert out == '' + assert _norm(err) == 'bye\n' + + +def test_n1(capfd): + ret = main(( + 'n1', sys.executable, '-c', 'import sys; print(sys.argv[1:])', + '--', + 'foo', 'bar', 'baz', + )) + assert ret == 0 + out, err = capfd.readouterr() + assert _norm(out) == "['foo']\n['bar']\n['baz']\n" + assert err == '' + + +def test_n1_some_error_code(): + ret = main(( + 'n1', sys.executable, '-c', + 'import sys; raise SystemExit(sys.argv[1] == "error")', + '--', + 'ok', 'error', 'ok', + )) + assert ret == 1 diff --git a/tests/lang_base_test.py b/tests/lang_base_test.py index da289aef..9fac83da 100644 --- a/tests/lang_base_test.py +++ b/tests/lang_base_test.py @@ -164,3 +164,15 @@ def test_basic_run_hook(tmp_path): assert ret == 0 out = out.replace(b'\r\n', b'\n') assert out == b'hi hello file file file\n' + + +def test_hook_cmd(): + assert lang_base.hook_cmd('echo hi', ()) == ('echo', 'hi') + + +def test_hook_cmd_hazmat(): + ret = lang_base.hook_cmd('pre-commit hazmat cd a echo -- b', ()) + assert ret == ( + sys.executable, '-m', 'pre_commit.commands.hazmat', + 'cd', 'a', 'echo', '--', 'b', + ) diff --git a/tests/main_test.py b/tests/main_test.py index 945349fa..eb9ea18d 100644 --- a/tests/main_test.py +++ b/tests/main_test.py @@ -8,6 +8,7 @@ import pytest import pre_commit.constants as C from pre_commit import main +from pre_commit.commands import hazmat from pre_commit.errors import FatalError from pre_commit.util import cmd_output from testing.auto_namedtuple import auto_namedtuple @@ -158,6 +159,17 @@ def test_all_cmds(command, mock_commands, mock_store_dir): assert_only_one_mock_called(mock_commands) +def test_hazmat(mock_store_dir): + with mock.patch.object(hazmat, 'impl') as mck: + main.main(('hazmat', 'cd', 'subdir', '--', 'cmd', '--', 'f1', 'f2')) + assert mck.call_count == 1 + (arg,), dct = mck.call_args + assert dct == {} + assert arg.tool == 'cd' + assert arg.subdir == 'subdir' + assert arg.cmd == ['cmd', '--', 'f1', 'f2'] + + def test_try_repo(mock_store_dir): with mock.patch.object(main, 'try_repo') as patch: main.main(('try-repo', '.')) diff --git a/tests/repository_test.py b/tests/repository_test.py index b1c7a002..5d71c3e4 100644 --- a/tests/repository_test.py +++ b/tests/repository_test.py @@ -506,3 +506,14 @@ def test_args_with_spaces_and_quotes(tmp_path): expected = b"['i have spaces', 'and\"\\'quotes', '$and !this']\n" assert ret == (0, expected) + + +def test_hazmat(tmp_path): + ret = run_language( + tmp_path, unsupported, + f'pre-commit hazmat ignore-exit-code {shlex.quote(sys.executable)} ' + f"-c 'import sys; raise SystemExit(sys.argv[1:])'", + ('f1', 'f2'), + ) + expected = b"['f1', 'f2']\n" + assert ret == (0, expected) From 1af6c8fa9502336c6977c2ff3e79185bd97a6e57 Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 22 Nov 2025 16:02:16 -0500 Subject: [PATCH 095/102] v4.5.0 --- CHANGELOG.md | 7 +++++++ setup.cfg | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b27af5e7..1434728d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +4.5.0 - 2025-11-22 +================== + +### Features +- Add `pre-commit hazmat`. + - #3585 PR by @asottile. + 4.4.0 - 2025-11-08 ================== diff --git a/setup.cfg b/setup.cfg index be031c3e..00c71759 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.4.0 +version = 4.5.0 description = A framework for managing and maintaining multi-language pre-commit hooks. long_description = file: README.md long_description_content_type = text/markdown From 8ea2b790d817088444b2328ff6cfe6742260070f Mon Sep 17 00:00:00 2001 From: anthony sottile Date: Sat, 22 Nov 2025 16:06:27 -0500 Subject: [PATCH 096/102] remove sha256 file from zipapp script github displays the checksum for us now! --- testing/zipapp/make | 3 --- 1 file changed, 3 deletions(-) diff --git a/testing/zipapp/make b/testing/zipapp/make index 165046f6..43bb4373 100755 --- a/testing/zipapp/make +++ b/testing/zipapp/make @@ -107,9 +107,6 @@ def main() -> int: shebang = '/usr/bin/env python3' zipapp.create_archive(tmpdir, filename, interpreter=shebang) - with open(f'{filename}.sha256sum', 'w') as f: - subprocess.check_call(('sha256sum', filename), stdout=f) - return 0 From 465192d7de58d569776eaaa818c94cb2b962d436 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 20:53:38 +0000 Subject: [PATCH 097/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/pyupgrade: v3.21.1 → v3.21.2](https://github.com/asottile/pyupgrade/compare/v3.21.1...v3.21.2) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e47d56ca..50893030 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,7 +24,7 @@ repos: hooks: - id: add-trailing-comma - repo: https://github.com/asottile/pyupgrade - rev: v3.21.1 + rev: v3.21.2 hooks: - id: pyupgrade args: [--py310-plus] From 48953556d06f8cdb4248002c1a0044e69e0916b3 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 21:05:15 +0000 Subject: [PATCH 098/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.18.2 → v1.19.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.18.2...v1.19.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 50893030..cedeae5e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.18.2 + rev: v1.19.0 hooks: - id: mypy additional_dependencies: [types-pyyaml] From c251e6b6d011b3b262339dc8e109de29b0ff8db1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 20:48:45 +0000 Subject: [PATCH 099/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/mirrors-mypy: v1.19.0 → v1.19.1](https://github.com/pre-commit/mirrors-mypy/compare/v1.19.0...v1.19.1) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cedeae5e..83ff03f3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -37,7 +37,7 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.19.0 + rev: v1.19.1 hooks: - id: mypy additional_dependencies: [types-pyyaml] From 51592eececd13b99c40ec477ad8f810799147227 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 16 Dec 2025 15:45:01 -0500 Subject: [PATCH 100/102] fix python local template when artifact dirs are present --- pre_commit/resources/empty_template_setup.py | 2 +- tests/languages/python_test.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/pre_commit/resources/empty_template_setup.py b/pre_commit/resources/empty_template_setup.py index ef05eef8..e8b1ff02 100644 --- a/pre_commit/resources/empty_template_setup.py +++ b/pre_commit/resources/empty_template_setup.py @@ -1,4 +1,4 @@ from setuptools import setup -setup(name='pre-commit-placeholder-package', version='0.0.0') +setup(name='pre-commit-placeholder-package', version='0.0.0', py_modules=[]) diff --git a/tests/languages/python_test.py b/tests/languages/python_test.py index 565525a4..593634b7 100644 --- a/tests/languages/python_test.py +++ b/tests/languages/python_test.py @@ -10,6 +10,8 @@ import pre_commit.constants as C from pre_commit.envcontext import envcontext from pre_commit.languages import python from pre_commit.prefix import Prefix +from pre_commit.store import _make_local_repo +from pre_commit.util import cmd_output_b from pre_commit.util import make_executable from pre_commit.util import win_exe from testing.auto_namedtuple import auto_namedtuple @@ -351,3 +353,15 @@ def test_python_hook_weird_setup_cfg(tmp_path): ret = run_language(tmp_path, python, 'socks', [os.devnull]) assert ret == (0, f'[{os.devnull!r}]\nhello hello\n'.encode()) + + +def test_local_repo_with_other_artifacts(tmp_path): + cmd_output_b('git', 'init', tmp_path) + _make_local_repo(str(tmp_path)) + # pretend a rust install also ran here + tmp_path.joinpath('target').mkdir() + + ret, out = run_language(tmp_path, python, 'python --version') + + assert ret == 0 + assert out.startswith(b'Python ') From 8a0630ca1aa7f6d5665effe674ebe2022af17919 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 16 Dec 2025 16:13:56 -0500 Subject: [PATCH 101/102] v4.5.1 --- CHANGELOG.md | 7 +++++++ setup.cfg | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1434728d..879ae073 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +4.5.1 - 2025-12-16 +================== + +### Fixes +- Fix `language: python` with `repo: local` without `additional_dependencies`. + - #3597 PR by @asottile. + 4.5.0 - 2025-11-22 ================== diff --git a/setup.cfg b/setup.cfg index 00c71759..a95ee447 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pre_commit -version = 4.5.0 +version = 4.5.1 description = A framework for managing and maintaining multi-language pre-commit hooks. long_description = file: README.md long_description_content_type = text/markdown From 37a879e65ee00d8375d12f053ef76e0024a0ed55 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 20:26:26 +0000 Subject: [PATCH 102/102] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/setup-cfg-fmt: v3.1.0 → v3.2.0](https://github.com/asottile/setup-cfg-fmt/compare/v3.1.0...v3.2.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 83ff03f3..3654066f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,7 +10,7 @@ repos: - id: name-tests-test - id: requirements-txt-fixer - repo: https://github.com/asottile/setup-cfg-fmt - rev: v3.1.0 + rev: v3.2.0 hooks: - id: setup-cfg-fmt - repo: https://github.com/asottile/reorder-python-imports