From d3b4f737b92eeae041d1125a42897075a1816f35 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Fri, 31 Dec 2021 17:31:12 -0800 Subject: [PATCH] forbid overriding `entry` for meta hooks --- pre_commit/clientlib.py | 9 +++++++++ tests/clientlib_test.py | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/pre_commit/clientlib.py b/pre_commit/clientlib.py index b8f23689..47ebd54f 100644 --- a/pre_commit/clientlib.py +++ b/pre_commit/clientlib.py @@ -251,12 +251,21 @@ _meta = ( ), ) + +class NotAllowed(cfgv.OptionalNoDefault): + def check(self, dct: Dict[str, Any]) -> None: + if self.key in dct: + raise cfgv.ValidationError(f'{self.key!r} cannot be overridden') + + META_HOOK_DICT = cfgv.Map( 'Hook', 'id', cfgv.Required('id', cfgv.check_string), cfgv.Required('id', cfgv.check_one_of(tuple(k for k, _ in _meta))), # language must be system cfgv.Optional('language', cfgv.check_one_of({'system'}), 'system'), + # entry cannot be overridden + NotAllowed('entry', cfgv.check_any), *( # default to the hook definition for the meta hooks cfgv.ConditionalOptional(key, cfgv.check_any, value, 'id', hook_id) diff --git a/tests/clientlib_test.py b/tests/clientlib_test.py index a2be51b6..39a37168 100644 --- a/tests/clientlib_test.py +++ b/tests/clientlib_test.py @@ -423,6 +423,13 @@ def test_migrate_to_sha_ok(): {'repo': 'meta', 'hooks': [{'id': 'identity', 'language': 'python'}]}, # name override must be string {'repo': 'meta', 'hooks': [{'id': 'identity', 'name': False}]}, + pytest.param( + { + 'repo': 'meta', + 'hooks': [{'id': 'identity', 'entry': 'echo hi'}], + }, + id='cannot override entry for meta hooks', + ), ), ) def test_meta_hook_invalid(config_repo):