@@ -72,11 +72,20 @@ def transform_stage(stage: str) -> str:
7272 return _STAGES .get (stage , stage )
7373
7474
75- MINIMAL_MANIFEST_SCHEMA = cfgv .Array (
76- cfgv .Map (
77- 'Hook' , 'id' ,
78- cfgv .Required ('id' , cfgv .check_string ),
79- cfgv .Optional ('stages' , cfgv .check_array (cfgv .check_string ), []),
75+ _MINIMAL_MANIFEST_SCHEMA = cfgv .Map (
76+ 'Manifest' , None ,
77+ cfgv .RequiredRecurse (
78+ 'hooks' ,
79+ cfgv .KeyValueMap (
80+ 'Hooks' ,
81+ cfgv .check_string ,
82+ cfgv .Map (
83+ 'Hook' , None ,
84+ cfgv .Optional (
85+ 'stages' , cfgv .check_array (cfgv .check_string ), [],
86+ ),
87+ ),
88+ ),
8089 ),
8190)
8291
@@ -85,16 +94,16 @@ def warn_for_stages_on_repo_init(repo: str, directory: str) -> None:
8594 try :
8695 manifest = cfgv .load_from_filename (
8796 os .path .join (directory , C .MANIFEST_FILE ),
88- schema = MINIMAL_MANIFEST_SCHEMA ,
89- load_strategy = yaml_load ,
97+ schema = _MINIMAL_MANIFEST_SCHEMA ,
98+ load_strategy = _load_manifest_backward_compat ,
9099 exc_tp = InvalidManifestError ,
91100 )
92101 except InvalidManifestError :
93102 return # they'll get a better error message when it actually loads!
94103
95104 legacy_stages = {} # sorted set
96- for hook in manifest :
97- for stage in hook . get ( 'stages' , ()) :
105+ for hook in manifest [ 'hooks' ]. values () :
106+ for stage in hook [ 'stages' ] :
98107 if stage in _STAGES :
99108 legacy_stages [stage ] = True
100109
@@ -228,7 +237,7 @@ def check(self, dct: dict[str, Any]) -> None:
228237
229238
230239MANIFEST_HOOK_DICT = cfgv .Map (
231- 'Hook' , 'id' ,
240+ 'Hook' , None ,
232241
233242 # check first in case it uses some newer, incompatible feature
234243 cfgv .Optional (
@@ -237,7 +246,6 @@ def check(self, dct: dict[str, Any]) -> None:
237246 '0' ,
238247 ),
239248
240- cfgv .Required ('id' , cfgv .check_string ),
241249 cfgv .Required ('name' , cfgv .check_string ),
242250 cfgv .Required ('entry' , cfgv .check_string ),
243251 LanguageMigrationRequired ('language' , cfgv .check_one_of (language_names )),
@@ -263,26 +271,46 @@ def check(self, dct: dict[str, Any]) -> None:
263271 StagesMigration ('stages' , []),
264272 cfgv .Optional ('verbose' , cfgv .check_bool , False ),
265273)
266- MANIFEST_SCHEMA = cfgv .Array (MANIFEST_HOOK_DICT )
274+
275+
276+ MANIFEST_SCHEMA = cfgv .Map (
277+ 'Manifest' , None ,
278+
279+ # check first in case it uses some newer, incompatible feature
280+ cfgv .Optional (
281+ 'minimum_pre_commit_version' ,
282+ cfgv .check_and (cfgv .check_string , check_min_version ),
283+ '0' ,
284+ ),
285+ cfgv .RequiredRecurse (
286+ 'hooks' ,
287+ cfgv .KeyValueMap ('Hooks' , cfgv .check_string , MANIFEST_HOOK_DICT ),
288+ ),
289+ )
267290
268291
269292class InvalidManifestError (FatalError ):
270293 pass
271294
272295
273- def _load_manifest_forward_compat (contents : str ) -> object :
296+ _MINIMAL_LEGACY_MANIFEST_SCHEMA = cfgv .Array (
297+ cfgv .Map ('Hook' , 'id' , cfgv .Required ('id' , cfgv .check_string )),
298+ )
299+
300+
301+ def _load_manifest_backward_compat (contents : str ) -> object :
274302 obj = yaml_load (contents )
275- if isinstance (obj , dict ):
276- check_min_version ( '5' )
277- raise AssertionError ( 'unreachable' )
303+ if isinstance (obj , list ):
304+ cfgv . validate ( obj , _MINIMAL_LEGACY_MANIFEST_SCHEMA )
305+ return { 'hooks' : { hook . pop ( 'id' ): hook for hook in obj }}
278306 else :
279307 return obj
280308
281309
282310load_manifest = functools .partial (
283311 cfgv .load_from_filename ,
284312 schema = MANIFEST_SCHEMA ,
285- load_strategy = _load_manifest_forward_compat ,
313+ load_strategy = _load_manifest_backward_compat ,
286314 exc_tp = InvalidManifestError ,
287315)
288316
@@ -448,7 +476,6 @@ def check(self, dct: dict[str, Any]) -> None:
448476 * (
449477 cfgv .OptionalNoDefault (item .key , item .check_fn )
450478 for item in MANIFEST_HOOK_DICT .items
451- if item .key != 'id'
452479 if item .key != 'stages'
453480 if item .key != 'language' # remove
454481 ),
@@ -459,6 +486,7 @@ def check(self, dct: dict[str, Any]) -> None:
459486LOCAL_HOOK_DICT = cfgv .Map (
460487 'Hook' , 'id' ,
461488
489+ cfgv .Required ('id' , cfgv .check_string ),
462490 * MANIFEST_HOOK_DICT .items ,
463491 * _COMMON_HOOK_WARNINGS ,
464492)
0 commit comments