mirror of
https://github.com/pre-commit/pre-commit.git
synced 2026-01-14 21:10:27 -06:00
86 lines
2.5 KiB
Python
86 lines
2.5 KiB
Python
import contextlib
|
|
import sys
|
|
from typing import IO
|
|
from typing import Optional
|
|
from typing import Union
|
|
|
|
from pre_commit import color
|
|
from pre_commit import five
|
|
|
|
|
|
def get_hook_message(
|
|
start: str,
|
|
postfix: str = '',
|
|
end_msg: Optional[str] = None,
|
|
end_len: int = 0,
|
|
end_color: Optional[str] = None,
|
|
use_color: Optional[bool] = None,
|
|
cols: int = 80,
|
|
) -> str:
|
|
"""Prints a message for running a hook.
|
|
|
|
This currently supports three approaches:
|
|
|
|
# Print `start` followed by dots, leaving 6 characters at the end
|
|
>>> print_hook_message('start', end_len=6)
|
|
start...............................................................
|
|
|
|
# Print `start` followed by dots with the end message colored if coloring
|
|
# is specified and a newline afterwards
|
|
>>> print_hook_message(
|
|
'start',
|
|
end_msg='end',
|
|
end_color=color.RED,
|
|
use_color=True,
|
|
)
|
|
start...................................................................end
|
|
|
|
# Print `start` followed by dots, followed by the `postfix` message
|
|
# uncolored, followed by the `end_msg` colored if specified and a newline
|
|
# afterwards
|
|
>>> print_hook_message(
|
|
'start',
|
|
postfix='postfix ',
|
|
end_msg='end',
|
|
end_color=color.RED,
|
|
use_color=True,
|
|
)
|
|
start...........................................................postfix end
|
|
"""
|
|
if end_len:
|
|
assert end_msg is None, end_msg
|
|
return start + '.' * (cols - len(start) - end_len - 1)
|
|
else:
|
|
assert end_msg is not None
|
|
assert end_color is not None
|
|
assert use_color is not None
|
|
return '{}{}{}{}\n'.format(
|
|
start,
|
|
'.' * (cols - len(start) - len(postfix) - len(end_msg) - 1),
|
|
postfix,
|
|
color.format_color(end_msg, end_color, use_color),
|
|
)
|
|
|
|
|
|
def write(s: str, stream: IO[bytes] = sys.stdout.buffer) -> None:
|
|
stream.write(five.to_bytes(s))
|
|
stream.flush()
|
|
|
|
|
|
def write_line(
|
|
s: Union[None, str, bytes] = None,
|
|
stream: IO[bytes] = sys.stdout.buffer,
|
|
logfile_name: Optional[str] = None,
|
|
) -> None:
|
|
with contextlib.ExitStack() as exit_stack:
|
|
output_streams = [stream]
|
|
if logfile_name:
|
|
stream = exit_stack.enter_context(open(logfile_name, 'ab'))
|
|
output_streams.append(stream)
|
|
|
|
for output_stream in output_streams:
|
|
if s is not None:
|
|
output_stream.write(five.to_bytes(s))
|
|
output_stream.write(b'\n')
|
|
output_stream.flush()
|