mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-02-17 00:04:42 +04:00
parent
4bd6529c05
commit
f21257cdba
15 changed files with 69 additions and 31 deletions
|
|
@ -110,16 +110,25 @@ def _run_single_hook(classifier, hook, args, skips, cols, use_color):
|
||||||
|
|
||||||
# Print the hook and the dots first in case the hook takes hella long to
|
# Print the hook and the dots first in case the hook takes hella long to
|
||||||
# run.
|
# run.
|
||||||
output.write(
|
msg, num_dots = get_hook_message(
|
||||||
get_hook_message(
|
|
||||||
_hook_msg_start(hook, args.verbose), end_len=6, cols=cols,
|
_hook_msg_start(hook, args.verbose), end_len=6, cols=cols,
|
||||||
),
|
|
||||||
)
|
)
|
||||||
|
output.write(msg)
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
dots_printed = [0]
|
||||||
|
|
||||||
|
def progress(perc):
|
||||||
|
dots_to_print = int(round(num_dots * perc))
|
||||||
|
|
||||||
|
sys.stdout.write('.' * (dots_to_print - dots_printed[0]))
|
||||||
|
sys.stdout.flush()
|
||||||
|
|
||||||
|
dots_printed[0] = dots_to_print
|
||||||
|
|
||||||
diff_before = cmd_output_b('git', 'diff', '--no-ext-diff', retcode=None)
|
diff_before = cmd_output_b('git', 'diff', '--no-ext-diff', retcode=None)
|
||||||
filenames = tuple(filenames) if hook.pass_filenames else ()
|
filenames = tuple(filenames) if hook.pass_filenames else ()
|
||||||
retcode, out = hook.run(filenames, use_color)
|
retcode, out = hook.run(filenames, use_color, progress)
|
||||||
diff_after = cmd_output_b('git', 'diff', '--no-ext-diff', retcode=None)
|
diff_after = cmd_output_b('git', 'diff', '--no-ext-diff', retcode=None)
|
||||||
|
|
||||||
file_modifications = diff_before != diff_after
|
file_modifications = diff_before != diff_after
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ from pre_commit.languages import system
|
||||||
# version - A version specified in the hook configuration or 'default'.
|
# version - A version specified in the hook configuration or 'default'.
|
||||||
# """
|
# """
|
||||||
#
|
#
|
||||||
# def run_hook(hook, file_args, color):
|
# def run_hook(hook, file_args, color, progress):
|
||||||
# """Runs a hook and returns the returncode and output of running that
|
# """Runs a hook and returns the returncode and output of running that
|
||||||
# hook.
|
# hook.
|
||||||
#
|
#
|
||||||
|
|
@ -46,6 +46,7 @@ from pre_commit.languages import system
|
||||||
# hook - `Hook`
|
# hook - `Hook`
|
||||||
# file_args - The files to be run
|
# file_args - The files to be run
|
||||||
# color - whether the hook should be given a pty (when supported)
|
# color - whether the hook should be given a pty (when supported)
|
||||||
|
# progress - report progress as a float percentage
|
||||||
#
|
#
|
||||||
# Returns:
|
# Returns:
|
||||||
# (returncode, output)
|
# (returncode, output)
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@ def docker_cmd(): # pragma: windows no cover
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def run_hook(hook, file_args, color): # pragma: windows no cover
|
def run_hook(hook, file_args, color, progress): # pragma: windows no cover
|
||||||
assert_docker_available()
|
assert_docker_available()
|
||||||
# Rebuild the docker image in case it has gone missing, as many people do
|
# Rebuild the docker image in case it has gone missing, as many people do
|
||||||
# automated cleanup of docker images.
|
# automated cleanup of docker images.
|
||||||
|
|
@ -106,4 +106,6 @@ def run_hook(hook, file_args, color): # pragma: windows no cover
|
||||||
|
|
||||||
entry_tag = ('--entrypoint', entry_exe, docker_tag(hook.prefix))
|
entry_tag = ('--entrypoint', entry_exe, docker_tag(hook.prefix))
|
||||||
cmd = docker_cmd() + entry_tag + cmd_rest
|
cmd = docker_cmd() + entry_tag + cmd_rest
|
||||||
return helpers.run_xargs(hook, cmd, file_args, color=color)
|
return helpers.run_xargs(
|
||||||
|
hook, cmd, file_args, color=color, progress=progress,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,9 @@ healthy = helpers.basic_healthy
|
||||||
install_environment = helpers.no_install
|
install_environment = helpers.no_install
|
||||||
|
|
||||||
|
|
||||||
def run_hook(hook, file_args, color): # pragma: windows no cover
|
def run_hook(hook, file_args, color, progress): # pragma: windows no cover
|
||||||
assert_docker_available()
|
assert_docker_available()
|
||||||
cmd = docker_cmd() + hook.cmd
|
cmd = docker_cmd() + hook.cmd
|
||||||
return helpers.run_xargs(hook, cmd, file_args, color=color)
|
return helpers.run_xargs(
|
||||||
|
hook, cmd, file_args, color=color, progress=progress,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -81,6 +81,8 @@ def install_environment(prefix, version, additional_dependencies):
|
||||||
rmtree(pkgdir)
|
rmtree(pkgdir)
|
||||||
|
|
||||||
|
|
||||||
def run_hook(hook, file_args, color):
|
def run_hook(hook, file_args, color, progress):
|
||||||
with in_env(hook.prefix):
|
with in_env(hook.prefix):
|
||||||
return helpers.run_xargs(hook, hook.cmd, file_args, color=color)
|
return helpers.run_xargs(
|
||||||
|
hook, hook.cmd, file_args, color=color, progress=progress,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,8 @@ def install_environment(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def run_hook(hook, file_args, color): # pragma: windows no cover
|
def run_hook(hook, file_args, color, progress): # pragma: windows no cover
|
||||||
with in_env(hook.prefix, hook.language_version):
|
with in_env(hook.prefix, hook.language_version):
|
||||||
return helpers.run_xargs(hook, hook.cmd, file_args, color=color)
|
return helpers.run_xargs(
|
||||||
|
hook, hook.cmd, file_args, color=color, progress=progress,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -151,9 +151,11 @@ def py_interface(_dir, _make_venv):
|
||||||
)
|
)
|
||||||
return retcode == 0
|
return retcode == 0
|
||||||
|
|
||||||
def run_hook(hook, file_args, color):
|
def run_hook(hook, file_args, color, progress):
|
||||||
with in_env(hook.prefix, hook.language_version):
|
with in_env(hook.prefix, hook.language_version):
|
||||||
return helpers.run_xargs(hook, hook.cmd, file_args, color=color)
|
return helpers.run_xargs(
|
||||||
|
hook, hook.cmd, file_args, color=color, progress=progress,
|
||||||
|
)
|
||||||
|
|
||||||
def install_environment(prefix, version, additional_dependencies):
|
def install_environment(prefix, version, additional_dependencies):
|
||||||
additional_dependencies = tuple(additional_dependencies)
|
additional_dependencies = tuple(additional_dependencies)
|
||||||
|
|
|
||||||
|
|
@ -124,6 +124,8 @@ def install_environment(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def run_hook(hook, file_args, color): # pragma: windows no cover
|
def run_hook(hook, file_args, color, progress): # pragma: windows no cover
|
||||||
with in_env(hook.prefix, hook.language_version):
|
with in_env(hook.prefix, hook.language_version):
|
||||||
return helpers.run_xargs(hook, hook.cmd, file_args, color=color)
|
return helpers.run_xargs(
|
||||||
|
hook, hook.cmd, file_args, color=color, progress=progress,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,8 @@ def install_environment(prefix, version, additional_dependencies):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def run_hook(hook, file_args, color):
|
def run_hook(hook, file_args, color, progress):
|
||||||
with in_env(hook.prefix):
|
with in_env(hook.prefix):
|
||||||
return helpers.run_xargs(hook, hook.cmd, file_args, color=color)
|
return helpers.run_xargs(
|
||||||
|
hook, hook.cmd, file_args, color=color, progress=progress,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,9 @@ healthy = helpers.basic_healthy
|
||||||
install_environment = helpers.no_install
|
install_environment = helpers.no_install
|
||||||
|
|
||||||
|
|
||||||
def run_hook(hook, file_args, color):
|
def run_hook(hook, file_args, color, progress):
|
||||||
cmd = hook.cmd
|
cmd = hook.cmd
|
||||||
cmd = (hook.prefix.path(cmd[0]),) + cmd[1:]
|
cmd = (hook.prefix.path(cmd[0]),) + cmd[1:]
|
||||||
return helpers.run_xargs(hook, cmd, file_args, color=color)
|
return helpers.run_xargs(
|
||||||
|
hook, cmd, file_args, color=color, progress=progress,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,8 @@ def install_environment(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def run_hook(hook, file_args, color): # pragma: windows no cover
|
def run_hook(hook, file_args, color, progress): # pragma: windows no cover
|
||||||
with in_env(hook.prefix):
|
with in_env(hook.prefix):
|
||||||
return helpers.run_xargs(hook, hook.cmd, file_args, color=color)
|
return helpers.run_xargs(
|
||||||
|
hook, hook.cmd, file_args, color=color, progress=progress,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -9,5 +9,7 @@ healthy = helpers.basic_healthy
|
||||||
install_environment = helpers.no_install
|
install_environment = helpers.no_install
|
||||||
|
|
||||||
|
|
||||||
def run_hook(hook, file_args, color):
|
def run_hook(hook, file_args, color, progress):
|
||||||
return helpers.run_xargs(hook, hook.cmd, file_args, color=color)
|
return helpers.run_xargs(
|
||||||
|
hook, hook.cmd, file_args, color=color, progress=progress,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,10 @@ def get_hook_message(
|
||||||
)
|
)
|
||||||
|
|
||||||
if end_len:
|
if end_len:
|
||||||
return start + '.' * (cols - len(start) - end_len - 1)
|
num_dots = cols - len(start) - end_len - 1
|
||||||
|
if end_msg is None:
|
||||||
|
return start, num_dots
|
||||||
|
return start + '.' * num_dots
|
||||||
else:
|
else:
|
||||||
return '{}{}{}{}\n'.format(
|
return '{}{}{}{}\n'.format(
|
||||||
start,
|
start,
|
||||||
|
|
|
||||||
|
|
@ -100,9 +100,9 @@ class Hook(collections.namedtuple('Hook', ('src', 'prefix') + _KEYS)):
|
||||||
# Write our state to indicate we're installed
|
# Write our state to indicate we're installed
|
||||||
_write_state(self.prefix, venv, _state(self.additional_dependencies))
|
_write_state(self.prefix, venv, _state(self.additional_dependencies))
|
||||||
|
|
||||||
def run(self, file_args, color):
|
def run(self, file_args, color, progress):
|
||||||
lang = languages[self.language]
|
lang = languages[self.language]
|
||||||
return lang.run_hook(self, file_args, color)
|
return lang.run_hook(self, file_args, color, progress)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create(cls, src, prefix, dct):
|
def create(cls, src, prefix, dct):
|
||||||
|
|
|
||||||
|
|
@ -112,6 +112,7 @@ def xargs(cmd, varargs, **kwargs):
|
||||||
color = kwargs.pop('color', False)
|
color = kwargs.pop('color', False)
|
||||||
negate = kwargs.pop('negate', False)
|
negate = kwargs.pop('negate', False)
|
||||||
target_concurrency = kwargs.pop('target_concurrency', 1)
|
target_concurrency = kwargs.pop('target_concurrency', 1)
|
||||||
|
progress = kwargs.pop('progress', lambda _: None)
|
||||||
max_length = kwargs.pop('_max_length', _get_platform_max_length())
|
max_length = kwargs.pop('_max_length', _get_platform_max_length())
|
||||||
cmd_fn = cmd_output_p if color else cmd_output_b
|
cmd_fn = cmd_output_p if color else cmd_output_b
|
||||||
retcode = 0
|
retcode = 0
|
||||||
|
|
@ -125,15 +126,17 @@ def xargs(cmd, varargs, **kwargs):
|
||||||
partitions = partition(cmd, varargs, target_concurrency, max_length)
|
partitions = partition(cmd, varargs, target_concurrency, max_length)
|
||||||
|
|
||||||
def run_cmd_partition(run_cmd):
|
def run_cmd_partition(run_cmd):
|
||||||
return cmd_fn(
|
ret = cmd_fn(
|
||||||
*run_cmd, retcode=None, stderr=subprocess.STDOUT, **kwargs
|
*run_cmd, retcode=None, stderr=subprocess.STDOUT, **kwargs
|
||||||
)
|
)
|
||||||
|
return ret, len(run_cmd) - len(cmd)
|
||||||
|
|
||||||
threads = min(len(partitions), target_concurrency)
|
threads = min(len(partitions), target_concurrency)
|
||||||
with _thread_mapper(threads) as thread_map:
|
with _thread_mapper(threads) as thread_map:
|
||||||
results = thread_map(run_cmd_partition, partitions)
|
results = thread_map(run_cmd_partition, partitions)
|
||||||
|
|
||||||
for proc_retcode, proc_out, _ in results:
|
total_processed = 0
|
||||||
|
for (proc_retcode, proc_out, _), processed in results:
|
||||||
# This is *slightly* too clever so I'll explain it.
|
# This is *slightly* too clever so I'll explain it.
|
||||||
# First the xor boolean table:
|
# First the xor boolean table:
|
||||||
# T | F |
|
# T | F |
|
||||||
|
|
@ -146,5 +149,7 @@ def xargs(cmd, varargs, **kwargs):
|
||||||
# code. Otherwise, the returncode is unchanged.
|
# code. Otherwise, the returncode is unchanged.
|
||||||
retcode |= bool(proc_retcode) ^ negate
|
retcode |= bool(proc_retcode) ^ negate
|
||||||
stdout += proc_out
|
stdout += proc_out
|
||||||
|
total_processed += processed
|
||||||
|
progress(float(total_processed) / len(varargs))
|
||||||
|
|
||||||
return retcode, stdout
|
return retcode, stdout
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue