mirror of
https://github.com/pre-commit/pre-commit-hooks.git
synced 2025-08-14 09:27:21 +08:00

The --enforce-all option when provided ensures that all files passed on the command line are checked against the size limit. Default behaviour remains unchanged.
71 lines
1.8 KiB
Python
71 lines
1.8 KiB
Python
import argparse
|
|
import json
|
|
import math
|
|
import os
|
|
from typing import Optional
|
|
from typing import Sequence
|
|
from typing import Set
|
|
|
|
from pre_commit_hooks.util import added_files
|
|
from pre_commit_hooks.util import CalledProcessError
|
|
from pre_commit_hooks.util import cmd_output
|
|
|
|
|
|
def lfs_files() -> Set[str]:
|
|
try:
|
|
# Introduced in git-lfs 2.2.0, first working in 2.2.1
|
|
lfs_ret = cmd_output('git', 'lfs', 'status', '--json')
|
|
except CalledProcessError: # pragma: no cover (with git-lfs)
|
|
lfs_ret = '{"files":{}}'
|
|
|
|
return set(json.loads(lfs_ret)['files'])
|
|
|
|
|
|
def find_large_added_files(
|
|
filenames: Sequence[str],
|
|
maxkb: int,
|
|
*,
|
|
enforce_all: bool = False,
|
|
) -> int:
|
|
# Find all added files that are also in the list of files pre-commit tells
|
|
# us about
|
|
retv = 0
|
|
filenames_filtered = set(filenames) - lfs_files()
|
|
if not enforce_all:
|
|
filenames_filtered &= added_files()
|
|
|
|
for filename in filenames_filtered:
|
|
kb = int(math.ceil(os.stat(filename).st_size / 1024))
|
|
if kb > maxkb:
|
|
print(f'{filename} ({kb} KB) exceeds {maxkb} KB.')
|
|
retv = 1
|
|
|
|
return retv
|
|
|
|
|
|
def main(argv: Optional[Sequence[str]] = None) -> int:
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
'filenames', nargs='*',
|
|
help='Filenames pre-commit believes are changed.',
|
|
)
|
|
parser.add_argument(
|
|
'--enforce-all', action='store_true',
|
|
help='Enforce all files are checked, not just staged files.',
|
|
)
|
|
parser.add_argument(
|
|
'--maxkb', type=int, default=500,
|
|
help='Maxmimum allowable KB for added files',
|
|
)
|
|
args = parser.parse_args(argv)
|
|
|
|
return find_large_added_files(
|
|
args.filenames,
|
|
args.maxkb,
|
|
enforce_all=args.enforce_all,
|
|
)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
exit(main())
|