summaryrefslogtreecommitdiffstats
path: root/pre_commit
diff options
context:
space:
mode:
Diffstat (limited to 'pre_commit')
-rw-r--r--pre_commit/clientlib.py22
-rw-r--r--pre_commit/commands/autoupdate.py2
-rw-r--r--pre_commit/commands/hook_impl.py2
-rw-r--r--pre_commit/commands/run.py10
-rw-r--r--pre_commit/commands/validate_config.py2
-rw-r--r--pre_commit/commands/validate_manifest.py2
-rw-r--r--pre_commit/envcontext.py9
-rw-r--r--pre_commit/error_handler.py2
-rw-r--r--pre_commit/file_lock.py2
-rw-r--r--pre_commit/git.py2
-rw-r--r--pre_commit/hook.py2
-rw-r--r--pre_commit/lang_base.py4
-rw-r--r--pre_commit/languages/conda.py4
-rw-r--r--pre_commit/languages/coursier.py4
-rw-r--r--pre_commit/languages/dart.py4
-rw-r--r--pre_commit/languages/docker.py2
-rw-r--r--pre_commit/languages/docker_image.py2
-rw-r--r--pre_commit/languages/dotnet.py4
-rw-r--r--pre_commit/languages/fail.py2
-rw-r--r--pre_commit/languages/golang.py4
-rw-r--r--pre_commit/languages/haskell.py4
-rw-r--r--pre_commit/languages/lua.py4
-rw-r--r--pre_commit/languages/node.py4
-rw-r--r--pre_commit/languages/perl.py4
-rw-r--r--pre_commit/languages/pygrep.py4
-rw-r--r--pre_commit/languages/python.py10
-rw-r--r--pre_commit/languages/r.py4
-rw-r--r--pre_commit/languages/ruby.py7
-rw-r--r--pre_commit/languages/rust.py6
-rw-r--r--pre_commit/languages/script.py2
-rw-r--r--pre_commit/languages/swift.py4
-rw-r--r--pre_commit/logging_handler.py2
-rw-r--r--pre_commit/main.py2
-rw-r--r--pre_commit/meta_hooks/check_hooks_apply.py2
-rw-r--r--pre_commit/meta_hooks/check_useless_excludes.py4
-rw-r--r--pre_commit/meta_hooks/identity.py2
-rw-r--r--pre_commit/parse_shebang.py2
-rw-r--r--pre_commit/repository.py12
-rw-r--r--pre_commit/staged_files_only.py2
-rw-r--r--pre_commit/store.py4
-rw-r--r--pre_commit/util.py51
-rw-r--r--pre_commit/xargs.py8
42 files changed, 121 insertions, 110 deletions
diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py
index d0651ca..a49465e 100644
--- a/pre_commit/clientlib.py
+++ b/pre_commit/clientlib.py
@@ -5,9 +5,9 @@ import logging
import re
import shlex
import sys
+from collections.abc import Sequence
from typing import Any
from typing import NamedTuple
-from typing import Sequence
import cfgv
from identify.identify import ALL_TAGS
@@ -102,6 +102,13 @@ class StagesMigration(StagesMigrationNoDefault):
MANIFEST_HOOK_DICT = cfgv.Map(
'Hook', 'id',
+ # check first in case it uses some newer, incompatible feature
+ cfgv.Optional(
+ 'minimum_pre_commit_version',
+ cfgv.check_and(cfgv.check_string, check_min_version),
+ '0',
+ ),
+
cfgv.Required('id', cfgv.check_string),
cfgv.Required('name', cfgv.check_string),
cfgv.Required('entry', cfgv.check_string),
@@ -124,7 +131,6 @@ MANIFEST_HOOK_DICT = cfgv.Map(
cfgv.Optional('description', cfgv.check_string, ''),
cfgv.Optional('language_version', cfgv.check_string, C.DEFAULT),
cfgv.Optional('log_file', cfgv.check_string, ''),
- cfgv.Optional('minimum_pre_commit_version', cfgv.check_string, '0'),
cfgv.Optional('require_serial', cfgv.check_bool, False),
StagesMigration('stages', []),
cfgv.Optional('verbose', cfgv.check_bool, False),
@@ -345,6 +351,13 @@ DEFAULT_LANGUAGE_VERSION = cfgv.Map(
CONFIG_SCHEMA = cfgv.Map(
'Config', None,
+ # check first in case it uses some newer, incompatible feature
+ cfgv.Optional(
+ 'minimum_pre_commit_version',
+ cfgv.check_and(cfgv.check_string, check_min_version),
+ '0',
+ ),
+
cfgv.RequiredRecurse('repos', cfgv.Array(CONFIG_REPO_DICT)),
cfgv.Optional(
'default_install_hook_types',
@@ -358,11 +371,6 @@ CONFIG_SCHEMA = cfgv.Map(
cfgv.Optional('files', check_string_regex, ''),
cfgv.Optional('exclude', check_string_regex, '^$'),
cfgv.Optional('fail_fast', cfgv.check_bool, False),
- cfgv.Optional(
- 'minimum_pre_commit_version',
- cfgv.check_and(cfgv.check_string, check_min_version),
- '0',
- ),
cfgv.WarnAdditionalKeys(
(
'repos',
diff --git a/pre_commit/commands/autoupdate.py b/pre_commit/commands/autoupdate.py
index e7725fd..aa0c5e2 100644
--- a/pre_commit/commands/autoupdate.py
+++ b/pre_commit/commands/autoupdate.py
@@ -4,9 +4,9 @@ import concurrent.futures
import os.path
import re
import tempfile
+from collections.abc import Sequence
from typing import Any
from typing import NamedTuple
-from typing import Sequence
import pre_commit.constants as C
from pre_commit import git
diff --git a/pre_commit/commands/hook_impl.py b/pre_commit/commands/hook_impl.py
index dab2135..49a80b7 100644
--- a/pre_commit/commands/hook_impl.py
+++ b/pre_commit/commands/hook_impl.py
@@ -4,7 +4,7 @@ import argparse
import os.path
import subprocess
import sys
-from typing import Sequence
+from collections.abc import Sequence
from pre_commit.commands.run import run
from pre_commit.envcontext import envcontext
diff --git a/pre_commit/commands/run.py b/pre_commit/commands/run.py
index 41ba4ec..076f16d 100644
--- a/pre_commit/commands/run.py
+++ b/pre_commit/commands/run.py
@@ -9,11 +9,11 @@ import re
import subprocess
import time
import unicodedata
+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 Generator
-from typing import Iterable
-from typing import MutableMapping
-from typing import Sequence
from identify.identify import tags_from_path
@@ -74,7 +74,7 @@ class Classifier:
def __init__(self, filenames: Iterable[str]) -> None:
self.filenames = [f for f in filenames if os.path.lexists(f)]
- @functools.lru_cache(maxsize=None)
+ @functools.cache
def _types_for_file(self, filename: str) -> set[str]:
return tags_from_path(filename)
diff --git a/pre_commit/commands/validate_config.py b/pre_commit/commands/validate_config.py
index 24bd313..b3de635 100644
--- a/pre_commit/commands/validate_config.py
+++ b/pre_commit/commands/validate_config.py
@@ -1,6 +1,6 @@
from __future__ import annotations
-from typing import Sequence
+from collections.abc import Sequence
from pre_commit import clientlib
diff --git a/pre_commit/commands/validate_manifest.py b/pre_commit/commands/validate_manifest.py
index 419031a..8493c6e 100644
--- a/pre_commit/commands/validate_manifest.py
+++ b/pre_commit/commands/validate_manifest.py
@@ -1,6 +1,6 @@
from __future__ import annotations
-from typing import Sequence
+from collections.abc import Sequence
from pre_commit import clientlib
diff --git a/pre_commit/envcontext.py b/pre_commit/envcontext.py
index 4f59560..1f816ce 100644
--- a/pre_commit/envcontext.py
+++ b/pre_commit/envcontext.py
@@ -3,10 +3,9 @@ from __future__ import annotations
import contextlib
import enum
import os
-from typing import Generator
-from typing import MutableMapping
+from collections.abc import Generator
+from collections.abc import MutableMapping
from typing import NamedTuple
-from typing import Tuple
from typing import Union
_Unset = enum.Enum('_Unset', 'UNSET')
@@ -18,9 +17,9 @@ class Var(NamedTuple):
default: str = ''
-SubstitutionT = Tuple[Union[str, Var], ...]
+SubstitutionT = tuple[Union[str, Var], ...]
ValueT = Union[str, _Unset, SubstitutionT]
-PatchesT = Tuple[Tuple[str, ValueT], ...]
+PatchesT = tuple[tuple[str, ValueT], ...]
def format_env(parts: SubstitutionT, env: MutableMapping[str, str]) -> str:
diff --git a/pre_commit/error_handler.py b/pre_commit/error_handler.py
index d740ee3..73e608b 100644
--- a/pre_commit/error_handler.py
+++ b/pre_commit/error_handler.py
@@ -5,7 +5,7 @@ import functools
import os.path
import sys
import traceback
-from typing import Generator
+from collections.abc import Generator
from typing import IO
import pre_commit.constants as C
diff --git a/pre_commit/file_lock.py b/pre_commit/file_lock.py
index f67a586..d3dafb4 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 Generator
from typing import Callable
-from typing import Generator
if sys.platform == 'win32': # pragma: no cover (windows)
diff --git a/pre_commit/git.py b/pre_commit/git.py
index 333dc7b..19aac38 100644
--- a/pre_commit/git.py
+++ b/pre_commit/git.py
@@ -3,7 +3,7 @@ from __future__ import annotations
import logging
import os.path
import sys
-from typing import Mapping
+from collections.abc import Mapping
from pre_commit.errors import FatalError
from pre_commit.util import CalledProcessError
diff --git a/pre_commit/hook.py b/pre_commit/hook.py
index 6d436ca..309cd5b 100644
--- a/pre_commit/hook.py
+++ b/pre_commit/hook.py
@@ -1,9 +1,9 @@
from __future__ import annotations
import logging
+from collections.abc import Sequence
from typing import Any
from typing import NamedTuple
-from typing import Sequence
from pre_commit.prefix import Prefix
diff --git a/pre_commit/lang_base.py b/pre_commit/lang_base.py
index 4a993ea..5303948 100644
--- a/pre_commit/lang_base.py
+++ b/pre_commit/lang_base.py
@@ -5,12 +5,12 @@ import os
import random
import re
import shlex
+from collections.abc import Generator
+from collections.abc import Sequence
from typing import Any
from typing import ContextManager
-from typing import Generator
from typing import NoReturn
from typing import Protocol
-from typing import Sequence
import pre_commit.constants as C
from pre_commit import parse_shebang
diff --git a/pre_commit/languages/conda.py b/pre_commit/languages/conda.py
index 41c355e..80b3e15 100644
--- a/pre_commit/languages/conda.py
+++ b/pre_commit/languages/conda.py
@@ -3,8 +3,8 @@ from __future__ import annotations
import contextlib
import os
import sys
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext
diff --git a/pre_commit/languages/coursier.py b/pre_commit/languages/coursier.py
index 9c5fbfe..6558bf6 100644
--- a/pre_commit/languages/coursier.py
+++ b/pre_commit/languages/coursier.py
@@ -2,8 +2,8 @@ from __future__ import annotations
import contextlib
import os.path
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext
diff --git a/pre_commit/languages/dart.py b/pre_commit/languages/dart.py
index e8539ca..129ac59 100644
--- a/pre_commit/languages/dart.py
+++ b/pre_commit/languages/dart.py
@@ -4,8 +4,8 @@ import contextlib
import os.path
import shutil
import tempfile
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext
diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py
index 8e53ca9..2632851 100644
--- a/pre_commit/languages/docker.py
+++ b/pre_commit/languages/docker.py
@@ -3,7 +3,7 @@ from __future__ import annotations
import hashlib
import json
import os
-from typing import Sequence
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.prefix import Prefix
diff --git a/pre_commit/languages/docker_image.py b/pre_commit/languages/docker_image.py
index 26f006e..a1a2c16 100644
--- a/pre_commit/languages/docker_image.py
+++ b/pre_commit/languages/docker_image.py
@@ -1,6 +1,6 @@
from __future__ import annotations
-from typing import Sequence
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.languages.docker import docker_cmd
diff --git a/pre_commit/languages/dotnet.py b/pre_commit/languages/dotnet.py
index e9568f2..e1202c4 100644
--- a/pre_commit/languages/dotnet.py
+++ b/pre_commit/languages/dotnet.py
@@ -6,8 +6,8 @@ import re
import tempfile
import xml.etree.ElementTree
import zipfile
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext
diff --git a/pre_commit/languages/fail.py b/pre_commit/languages/fail.py
index a8ec6a5..6ac4d76 100644
--- a/pre_commit/languages/fail.py
+++ b/pre_commit/languages/fail.py
@@ -1,6 +1,6 @@
from __future__ import annotations
-from typing import Sequence
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.prefix import Prefix
diff --git a/pre_commit/languages/golang.py b/pre_commit/languages/golang.py
index bea91e9..4c13d8f 100644
--- a/pre_commit/languages/golang.py
+++ b/pre_commit/languages/golang.py
@@ -12,11 +12,11 @@ import tempfile
import urllib.error
import urllib.request
import zipfile
+from collections.abc import Generator
+from collections.abc import Sequence
from typing import ContextManager
-from typing import Generator
from typing import IO
from typing import Protocol
-from typing import Sequence
import pre_commit.constants as C
from pre_commit import lang_base
diff --git a/pre_commit/languages/haskell.py b/pre_commit/languages/haskell.py
index 76442eb..c6945c8 100644
--- a/pre_commit/languages/haskell.py
+++ b/pre_commit/languages/haskell.py
@@ -2,8 +2,8 @@ from __future__ import annotations
import contextlib
import os.path
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext
diff --git a/pre_commit/languages/lua.py b/pre_commit/languages/lua.py
index 12d0661..a475ec9 100644
--- a/pre_commit/languages/lua.py
+++ b/pre_commit/languages/lua.py
@@ -3,8 +3,8 @@ from __future__ import annotations
import contextlib
import os
import sys
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext
diff --git a/pre_commit/languages/node.py b/pre_commit/languages/node.py
index 3e22dc7..d49c0e3 100644
--- a/pre_commit/languages/node.py
+++ b/pre_commit/languages/node.py
@@ -4,8 +4,8 @@ import contextlib
import functools
import os
import sys
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
import pre_commit.constants as C
from pre_commit import lang_base
diff --git a/pre_commit/languages/perl.py b/pre_commit/languages/perl.py
index 2a7f162..61b1d11 100644
--- a/pre_commit/languages/perl.py
+++ b/pre_commit/languages/perl.py
@@ -3,8 +3,8 @@ from __future__ import annotations
import contextlib
import os
import shlex
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext
diff --git a/pre_commit/languages/pygrep.py b/pre_commit/languages/pygrep.py
index ec55560..72a9345 100644
--- a/pre_commit/languages/pygrep.py
+++ b/pre_commit/languages/pygrep.py
@@ -3,9 +3,9 @@ from __future__ import annotations
import argparse
import re
import sys
+from collections.abc import Sequence
+from re import Pattern
from typing import NamedTuple
-from typing import Pattern
-from typing import Sequence
from pre_commit import lang_base
from pre_commit import output
diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py
index 3ef3436..9f4bf69 100644
--- a/pre_commit/languages/python.py
+++ b/pre_commit/languages/python.py
@@ -4,8 +4,8 @@ import contextlib
import functools
import os
import sys
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
import pre_commit.constants as C
from pre_commit import lang_base
@@ -24,7 +24,7 @@ ENVIRONMENT_DIR = 'py_env'
run_hook = lang_base.basic_run_hook
-@functools.lru_cache(maxsize=None)
+@functools.cache
def _version_info(exe: str) -> str:
prog = 'import sys;print(".".join(str(p) for p in sys.version_info))'
try:
@@ -65,7 +65,7 @@ def _find_by_py_launcher(
version: str,
) -> str | None: # pragma: no cover (windows only)
if version.startswith('python'):
- num = version[len('python'):]
+ num = version.removeprefix('python')
cmd = ('py', f'-{num}', '-c', 'import sys; print(sys.executable)')
env = dict(os.environ, PYTHONIOENCODING='UTF-8')
try:
@@ -124,7 +124,7 @@ def _sys_executable_matches(version: str) -> bool:
return False
try:
- info = tuple(int(p) for p in version[len('python'):].split('.'))
+ info = tuple(int(p) for p in version.removeprefix('python').split('.'))
except ValueError:
return False
diff --git a/pre_commit/languages/r.py b/pre_commit/languages/r.py
index 6feb065..93b62bd 100644
--- a/pre_commit/languages/r.py
+++ b/pre_commit/languages/r.py
@@ -6,8 +6,8 @@ import shlex
import shutil
import tempfile
import textwrap
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext
diff --git a/pre_commit/languages/ruby.py b/pre_commit/languages/ruby.py
index c88269f..0438ae0 100644
--- a/pre_commit/languages/ruby.py
+++ b/pre_commit/languages/ruby.py
@@ -6,9 +6,9 @@ import importlib.resources
import os.path
import shutil
import tarfile
-from typing import Generator
+from collections.abc import Generator
+from collections.abc import Sequence
from typing import IO
-from typing import Sequence
import pre_commit.constants as C
from pre_commit import lang_base
@@ -25,7 +25,8 @@ run_hook = lang_base.basic_run_hook
def _resource_bytesio(filename: str) -> IO[bytes]:
- return importlib.resources.open_binary('pre_commit.resources', filename)
+ files = importlib.resources.files('pre_commit.resources')
+ return files.joinpath(filename).open('rb')
@functools.lru_cache(maxsize=1)
diff --git a/pre_commit/languages/rust.py b/pre_commit/languages/rust.py
index 7eec0e7..7b04d6c 100644
--- a/pre_commit/languages/rust.py
+++ b/pre_commit/languages/rust.py
@@ -7,8 +7,8 @@ import shutil
import sys
import tempfile
import urllib.request
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
import pre_commit.constants as C
from pre_commit import lang_base
@@ -134,7 +134,7 @@ def install_environment(
packages_to_install: set[tuple[str, ...]] = {('--path', '.')}
for cli_dep in cli_deps:
- cli_dep = cli_dep[len('cli:'):]
+ cli_dep = cli_dep.removeprefix('cli:')
package, _, crate_version = cli_dep.partition(':')
if crate_version != '':
packages_to_install.add((package, '--version', crate_version))
diff --git a/pre_commit/languages/script.py b/pre_commit/languages/script.py
index 89a3ab2..1eaa1e2 100644
--- a/pre_commit/languages/script.py
+++ b/pre_commit/languages/script.py
@@ -1,6 +1,6 @@
from __future__ import annotations
-from typing import Sequence
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.prefix import Prefix
diff --git a/pre_commit/languages/swift.py b/pre_commit/languages/swift.py
index f16bb04..f7bfe84 100644
--- a/pre_commit/languages/swift.py
+++ b/pre_commit/languages/swift.py
@@ -2,8 +2,8 @@ from __future__ import annotations
import contextlib
import os
-from typing import Generator
-from typing import Sequence
+from collections.abc import Generator
+from collections.abc import Sequence
from pre_commit import lang_base
from pre_commit.envcontext import envcontext
diff --git a/pre_commit/logging_handler.py b/pre_commit/logging_handler.py
index 1b68fc7..cd33953 100644
--- a/pre_commit/logging_handler.py
+++ b/pre_commit/logging_handler.py
@@ -2,7 +2,7 @@ from __future__ import annotations
import contextlib
import logging
-from typing import Generator
+from collections.abc import Generator
from pre_commit import color
from pre_commit import output
diff --git a/pre_commit/main.py b/pre_commit/main.py
index 9dfce2c..18c978a 100644
--- a/pre_commit/main.py
+++ b/pre_commit/main.py
@@ -4,7 +4,7 @@ import argparse
import logging
import os
import sys
-from typing import Sequence
+from collections.abc import Sequence
import pre_commit.constants as C
from pre_commit import clientlib
diff --git a/pre_commit/meta_hooks/check_hooks_apply.py b/pre_commit/meta_hooks/check_hooks_apply.py
index 7f491a2..84c142b 100644
--- a/pre_commit/meta_hooks/check_hooks_apply.py
+++ b/pre_commit/meta_hooks/check_hooks_apply.py
@@ -1,7 +1,7 @@
from __future__ import annotations
import argparse
-from typing import Sequence
+from collections.abc import Sequence
import pre_commit.constants as C
from pre_commit import git
diff --git a/pre_commit/meta_hooks/check_useless_excludes.py b/pre_commit/meta_hooks/check_useless_excludes.py
index 8b0c106..664251a 100644
--- a/pre_commit/meta_hooks/check_useless_excludes.py
+++ b/pre_commit/meta_hooks/check_useless_excludes.py
@@ -2,8 +2,8 @@ from __future__ import annotations
import argparse
import re
-from typing import Iterable
-from typing import Sequence
+from collections.abc import Iterable
+from collections.abc import Sequence
from cfgv import apply_defaults
diff --git a/pre_commit/meta_hooks/identity.py b/pre_commit/meta_hooks/identity.py
index 72ee440..3e20bbc 100644
--- a/pre_commit/meta_hooks/identity.py
+++ b/pre_commit/meta_hooks/identity.py
@@ -1,7 +1,7 @@
from __future__ import annotations
import sys
-from typing import Sequence
+from collections.abc import Sequence
from pre_commit import output
diff --git a/pre_commit/parse_shebang.py b/pre_commit/parse_shebang.py
index 3ee04e8..043a9b5 100644
--- a/pre_commit/parse_shebang.py
+++ b/pre_commit/parse_shebang.py
@@ -1,7 +1,7 @@
from __future__ import annotations
import os.path
-from typing import Mapping
+from collections.abc import Mapping
from typing import NoReturn
from identify.identify import parse_shebang_from_file
diff --git a/pre_commit/repository.py b/pre_commit/repository.py
index 040f238..aa84185 100644
--- a/pre_commit/repository.py
+++ b/pre_commit/repository.py
@@ -4,15 +4,14 @@ import json
import logging
import os
import shlex
+from collections.abc import Sequence
from typing import Any
-from typing import Sequence
import pre_commit.constants as C
from pre_commit.all_languages import languages
from pre_commit.clientlib import load_manifest
from pre_commit.clientlib import LOCAL
from pre_commit.clientlib import META
-from pre_commit.clientlib import parse_version
from pre_commit.hook import Hook
from pre_commit.lang_base import environment_dir
from pre_commit.prefix import Prefix
@@ -124,15 +123,6 @@ def _hook(
for dct in rest:
ret.update(dct)
- version = ret['minimum_pre_commit_version']
- if parse_version(version) > parse_version(C.VERSION):
- logger.error(
- f'The hook `{ret["id"]}` requires pre-commit version {version} '
- f'but version {C.VERSION} is installed. '
- f'Perhaps run `pip install --upgrade pre-commit`.',
- )
- exit(1)
-
lang = ret['language']
if ret['language_version'] == C.DEFAULT:
ret['language_version'] = root_config['default_language_version'][lang]
diff --git a/pre_commit/staged_files_only.py b/pre_commit/staged_files_only.py
index 8812356..fd28e1c 100644
--- a/pre_commit/staged_files_only.py
+++ b/pre_commit/staged_files_only.py
@@ -4,7 +4,7 @@ import contextlib
import logging
import os.path
import time
-from typing import Generator
+from collections.abc import Generator
from pre_commit import git
from pre_commit.errors import FatalError
diff --git a/pre_commit/store.py b/pre_commit/store.py
index 487e3e7..84bc09a 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 Generator
+from collections.abc import Sequence
from typing import Callable
-from typing import Generator
-from typing import Sequence
import pre_commit.constants as C
from pre_commit import file_lock
diff --git a/pre_commit/util.py b/pre_commit/util.py
index 4f8e835..b3682d4 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 Generator
from types import TracebackType
from typing import Any
from typing import Callable
-from typing import Generator
from pre_commit import parse_shebang
@@ -36,7 +36,8 @@ def clean_path_on_failure(path: str) -> Generator[None, None, None]:
def resource_text(filename: str) -> str:
- return importlib.resources.read_text('pre_commit.resources', filename)
+ files = importlib.resources.files('pre_commit.resources')
+ return files.joinpath(filename).read_text()
def make_executable(filename: str) -> None:
@@ -201,24 +202,36 @@ else: # pragma: no cover
cmd_output_p = cmd_output_b
-def rmtree(path: str) -> None:
- """On windows, rmtree fails for readonly dirs."""
- def handle_remove_readonly(
- func: Callable[..., Any],
- path: str,
- exc: tuple[type[OSError], OSError, TracebackType],
+def _handle_readonly(
+ func: Callable[[str], object],
+ path: str,
+ exc: OSError,
+) -> None:
+ if (
+ func in (os.rmdir, os.remove, os.unlink) and
+ exc.errno in {errno.EACCES, errno.EPERM}
+ ):
+ for p in (path, os.path.dirname(path)):
+ os.chmod(p, os.stat(p).st_mode | stat.S_IWUSR)
+ func(path)
+ else:
+ raise
+
+
+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],
) -> None:
- excvalue = exc[1]
- if (
- func in (os.rmdir, os.remove, os.unlink) and
- excvalue.errno in {errno.EACCES, errno.EPERM}
- ):
- for p in (path, os.path.dirname(path)):
- os.chmod(p, os.stat(p).st_mode | stat.S_IWUSR)
- func(path)
- else:
- raise
- shutil.rmtree(path, ignore_errors=False, onerror=handle_remove_readonly)
+ return _handle_readonly(func, path, excinfo[1])
+
+ def rmtree(path: str) -> None:
+ shutil.rmtree(path, ignore_errors=False, onerror=_handle_readonly_old)
+else: # pragma: >=3.12 cover
+ def rmtree(path: str) -> None:
+ """On windows, rmtree fails for readonly dirs."""
+ shutil.rmtree(path, ignore_errors=False, onexc=_handle_readonly)
def win_exe(s: str) -> str:
diff --git a/pre_commit/xargs.py b/pre_commit/xargs.py
index a7493c0..22580f5 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 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 Generator
-from typing import Iterable
-from typing import MutableMapping
-from typing import Sequence
from typing import TypeVar
from pre_commit import parse_shebang