Skip to content

Commit b1a9209

Browse files
committed
extended warning if globs are used instead of regex to top level
1 parent 7432acc commit b1a9209

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

pre_commit/clientlib.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ def check(self, dct: Dict[str, Any]) -> None:
132132
)
133133

134134

135-
class OptionalSensibleRegex(cfgv.OptionalNoDefault):
135+
class OptionalSensibleRegexAtHook(cfgv.OptionalNoDefault):
136136
def check(self, dct: Dict[str, Any]) -> None:
137137
super().check(dct)
138138

@@ -144,6 +144,17 @@ def check(self, dct: Dict[str, Any]) -> None:
144144
)
145145

146146

147+
class OptionalSensibleRegexAtTop(cfgv.OptionalNoDefault):
148+
def check(self, dct: Dict[str, Any]) -> None:
149+
super().check(dct)
150+
151+
if '/*' in dct.get(self.key, ''):
152+
logger.warning(
153+
f'The top-level {self.key!r} field is a regex, not a glob -- '
154+
f"matching '/*' probably isn't what you want here",
155+
)
156+
157+
147158
class MigrateShaToRev:
148159
key = 'rev'
149160

@@ -259,8 +270,8 @@ def warn_unknown_keys_repo(
259270
for item in MANIFEST_HOOK_DICT.items
260271
if item.key != 'id'
261272
),
262-
OptionalSensibleRegex('files', cfgv.check_string),
263-
OptionalSensibleRegex('exclude', cfgv.check_string),
273+
OptionalSensibleRegexAtHook('files', cfgv.check_string),
274+
OptionalSensibleRegexAtHook('exclude', cfgv.check_string),
264275
)
265276
CONFIG_REPO_DICT = cfgv.Map(
266277
'Repository', 'repo',
@@ -329,6 +340,8 @@ def warn_unknown_keys_repo(
329340
),
330341
warn_unknown_keys_root,
331342
),
343+
OptionalSensibleRegexAtTop('files', cfgv.check_string),
344+
OptionalSensibleRegexAtTop('exclude', cfgv.check_string),
332345

333346
# do not warn about configuration for pre-commit.ci
334347
cfgv.OptionalNoDefault('ci', cfgv.check_type(dict)),

tests/clientlib_test.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ def test_warn_mutable_rev_conditional():
244244
cfgv.validate(config_obj, CONFIG_REPO_DICT)
245245

246246

247-
def test_validate_optional_sensible_regex(caplog):
247+
def test_validate_optional_sensible_regex_at_hook_level(caplog):
248248
config_obj = {
249249
'id': 'flake8',
250250
'files': 'dir/*.py',
@@ -261,6 +261,23 @@ def test_validate_optional_sensible_regex(caplog):
261261
]
262262

263263

264+
def test_validate_optional_sensible_regex_at_top_level(caplog):
265+
config_obj = {
266+
'files': 'dir/*.py',
267+
'repos': [],
268+
}
269+
cfgv.validate(config_obj, CONFIG_SCHEMA)
270+
271+
assert caplog.record_tuples == [
272+
(
273+
'pre_commit',
274+
logging.WARNING,
275+
"The top-level 'files' field is a regex, not a glob -- matching "
276+
"'/*' probably isn't what you want here",
277+
),
278+
]
279+
280+
264281
@pytest.mark.parametrize('fn', (validate_config_main, validate_manifest_main))
265282
def test_mains_not_ok(tmpdir, fn):
266283
not_yaml = tmpdir.join('f.notyaml')

0 commit comments

Comments
 (0)