Skip to content

Commit 4f5cb99

Browse files
authored
Merge pull request pre-commit#1544 from pre-commit/wip_warning_on_old_config_style
warn on old list-style configuration
2 parents e384c18 + 6851059 commit 4f5cb99

File tree

4 files changed

+59
-40
lines changed

4 files changed

+59
-40
lines changed

pre_commit/clientlib.py

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212
from identify.identify import ALL_TAGS
1313

1414
import pre_commit.constants as C
15+
from pre_commit.color import add_color_option
1516
from pre_commit.error_handler import FatalError
1617
from pre_commit.languages.all import all_languages
18+
from pre_commit.logging_handler import logging_handler
1719
from pre_commit.util import parse_version
1820
from pre_commit.util import yaml_load
1921

@@ -43,6 +45,7 @@ def _make_argparser(filenames_help: str) -> argparse.ArgumentParser:
4345
parser = argparse.ArgumentParser()
4446
parser.add_argument('filenames', nargs='*', help=filenames_help)
4547
parser.add_argument('-V', '--version', action='version', version=C.VERSION)
48+
add_color_option(parser)
4649
return parser
4750

4851

@@ -92,14 +95,16 @@ class InvalidManifestError(FatalError):
9295
def validate_manifest_main(argv: Optional[Sequence[str]] = None) -> int:
9396
parser = _make_argparser('Manifest filenames.')
9497
args = parser.parse_args(argv)
95-
ret = 0
96-
for filename in args.filenames:
97-
try:
98-
load_manifest(filename)
99-
except InvalidManifestError as e:
100-
print(e)
101-
ret = 1
102-
return ret
98+
99+
with logging_handler(args.color):
100+
ret = 0
101+
for filename in args.filenames:
102+
try:
103+
load_manifest(filename)
104+
except InvalidManifestError as e:
105+
print(e)
106+
ret = 1
107+
return ret
103108

104109

105110
LOCAL = 'local'
@@ -290,7 +295,11 @@ class InvalidConfigError(FatalError):
290295
def ordered_load_normalize_legacy_config(contents: str) -> Dict[str, Any]:
291296
data = yaml_load(contents)
292297
if isinstance(data, list):
293-
# TODO: Once happy, issue a deprecation warning and instructions
298+
logger.warning(
299+
'normalizing pre-commit configuration to a top-level map. '
300+
'support for top level list will be removed in a future version. '
301+
'run: `pre-commit migrate-config` to automatically fix this.',
302+
)
294303
return {'repos': data}
295304
else:
296305
return data
@@ -307,11 +316,13 @@ def ordered_load_normalize_legacy_config(contents: str) -> Dict[str, Any]:
307316
def validate_config_main(argv: Optional[Sequence[str]] = None) -> int:
308317
parser = _make_argparser('Config filenames.')
309318
args = parser.parse_args(argv)
310-
ret = 0
311-
for filename in args.filenames:
312-
try:
313-
load_config(filename)
314-
except InvalidConfigError as e:
315-
print(e)
316-
ret = 1
317-
return ret
319+
320+
with logging_handler(args.color):
321+
ret = 0
322+
for filename in args.filenames:
323+
try:
324+
load_config(filename)
325+
except InvalidConfigError as e:
326+
print(e)
327+
ret = 1
328+
return ret

pre_commit/color.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import argparse
12
import os
23
import sys
34

@@ -95,3 +96,12 @@ def use_color(setting: str) -> bool:
9596
os.getenv('TERM') != 'dumb'
9697
)
9798
)
99+
100+
101+
def add_color_option(parser: argparse.ArgumentParser) -> None:
102+
parser.add_argument(
103+
'--color', default=os.environ.get('PRE_COMMIT_COLOR', 'auto'),
104+
type=use_color,
105+
metavar='{' + ','.join(COLOR_CHOICES) + '}',
106+
help='Whether to use color in output. Defaults to `%(default)s`.',
107+
)

pre_commit/main.py

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
from typing import Union
99

1010
import pre_commit.constants as C
11-
from pre_commit import color
1211
from pre_commit import git
12+
from pre_commit.color import add_color_option
1313
from pre_commit.commands.autoupdate import autoupdate
1414
from pre_commit.commands.clean import clean
1515
from pre_commit.commands.gc import gc
@@ -41,15 +41,6 @@
4141
COMMANDS_NO_GIT = {'clean', 'gc', 'init-templatedir', 'sample-config'}
4242

4343

44-
def _add_color_option(parser: argparse.ArgumentParser) -> None:
45-
parser.add_argument(
46-
'--color', default=os.environ.get('PRE_COMMIT_COLOR', 'auto'),
47-
type=color.use_color,
48-
metavar='{' + ','.join(color.COLOR_CHOICES) + '}',
49-
help='Whether to use color in output. Defaults to `%(default)s`.',
50-
)
51-
52-
5344
def _add_config_option(parser: argparse.ArgumentParser) -> None:
5445
parser.add_argument(
5546
'-c', '--config', default=C.CONFIG_FILE,
@@ -195,7 +186,7 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
195186
'autoupdate',
196187
help="Auto-update pre-commit config to the latest repos' versions.",
197188
)
198-
_add_color_option(autoupdate_parser)
189+
add_color_option(autoupdate_parser)
199190
_add_config_option(autoupdate_parser)
200191
autoupdate_parser.add_argument(
201192
'--bleeding-edge', action='store_true',
@@ -216,11 +207,11 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
216207
clean_parser = subparsers.add_parser(
217208
'clean', help='Clean out pre-commit files.',
218209
)
219-
_add_color_option(clean_parser)
210+
add_color_option(clean_parser)
220211
_add_config_option(clean_parser)
221212

222213
hook_impl_parser = subparsers.add_parser('hook-impl')
223-
_add_color_option(hook_impl_parser)
214+
add_color_option(hook_impl_parser)
224215
_add_config_option(hook_impl_parser)
225216
hook_impl_parser.add_argument('--hook-type')
226217
hook_impl_parser.add_argument('--hook-dir')
@@ -230,7 +221,7 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
230221
hook_impl_parser.add_argument(dest='rest', nargs=argparse.REMAINDER)
231222

232223
gc_parser = subparsers.add_parser('gc', help='Clean unused cached repos.')
233-
_add_color_option(gc_parser)
224+
add_color_option(gc_parser)
234225
_add_config_option(gc_parser)
235226

236227
init_templatedir_parser = subparsers.add_parser(
@@ -240,7 +231,7 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
240231
'`git config init.templateDir`.'
241232
),
242233
)
243-
_add_color_option(init_templatedir_parser)
234+
add_color_option(init_templatedir_parser)
244235
_add_config_option(init_templatedir_parser)
245236
init_templatedir_parser.add_argument(
246237
'directory', help='The directory in which to write the hook script.',
@@ -256,7 +247,7 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
256247
install_parser = subparsers.add_parser(
257248
'install', help='Install the pre-commit script.',
258249
)
259-
_add_color_option(install_parser)
250+
add_color_option(install_parser)
260251
_add_config_option(install_parser)
261252
install_parser.add_argument(
262253
'-f', '--overwrite', action='store_true',
@@ -286,32 +277,32 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
286277
'useful.'
287278
),
288279
)
289-
_add_color_option(install_hooks_parser)
280+
add_color_option(install_hooks_parser)
290281
_add_config_option(install_hooks_parser)
291282

292283
migrate_config_parser = subparsers.add_parser(
293284
'migrate-config',
294285
help='Migrate list configuration to new map configuration.',
295286
)
296-
_add_color_option(migrate_config_parser)
287+
add_color_option(migrate_config_parser)
297288
_add_config_option(migrate_config_parser)
298289

299290
run_parser = subparsers.add_parser('run', help='Run hooks.')
300-
_add_color_option(run_parser)
291+
add_color_option(run_parser)
301292
_add_config_option(run_parser)
302293
_add_run_options(run_parser)
303294

304295
sample_config_parser = subparsers.add_parser(
305296
'sample-config', help=f'Produce a sample {C.CONFIG_FILE} file',
306297
)
307-
_add_color_option(sample_config_parser)
298+
add_color_option(sample_config_parser)
308299
_add_config_option(sample_config_parser)
309300

310301
try_repo_parser = subparsers.add_parser(
311302
'try-repo',
312303
help='Try the hooks in a repository, useful for developing new hooks.',
313304
)
314-
_add_color_option(try_repo_parser)
305+
add_color_option(try_repo_parser)
315306
_add_config_option(try_repo_parser)
316307
try_repo_parser.add_argument(
317308
'repo', help='Repository to source hooks from.',
@@ -328,7 +319,7 @@ def main(argv: Optional[Sequence[str]] = None) -> int:
328319
uninstall_parser = subparsers.add_parser(
329320
'uninstall', help='Uninstall the pre-commit script.',
330321
)
331-
_add_color_option(uninstall_parser)
322+
add_color_option(uninstall_parser)
332323
_add_config_option(uninstall_parser)
333324
_add_hook_type_option(uninstall_parser)
334325

tests/clientlib_test.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ def test_check_type_tag_failures(value):
3030
check_type_tag(value)
3131

3232

33+
def test_check_type_tag_success():
34+
check_type_tag('file')
35+
36+
3337
@pytest.mark.parametrize(
3438
('config_obj', 'expected'), (
3539
(
@@ -110,15 +114,18 @@ def test_validate_config_main_ok():
110114
assert not validate_config_main(('.pre-commit-config.yaml',))
111115

112116

113-
def test_validate_config_old_list_format_ok(tmpdir):
117+
def test_validate_config_old_list_format_ok(tmpdir, cap_out):
114118
f = tmpdir.join('cfg.yaml')
115119
f.write('- {repo: meta, hooks: [{id: identity}]}')
116120
assert not validate_config_main((f.strpath,))
121+
start = '[WARNING] normalizing pre-commit configuration to a top-level map'
122+
assert cap_out.get().startswith(start)
117123

118124

119125
def test_validate_warn_on_unknown_keys_at_repo_level(tmpdir, caplog):
120126
f = tmpdir.join('cfg.yaml')
121127
f.write(
128+
'repos:\n'
122129
'- repo: https://gitlab.com/pycqa/flake8\n'
123130
' rev: 3.7.7\n'
124131
' hooks:\n'

0 commit comments

Comments
 (0)