@@ -99,6 +99,32 @@ def apply_default(self, dct: dict[str, Any]) -> None:
9999 super ().apply_default (dct )
100100
101101
102+ class DeprecatedStagesWarning (NamedTuple ):
103+ key : str
104+
105+ def check (self , dct : dict [str , Any ]) -> None :
106+ if self .key not in dct :
107+ return
108+
109+ val = dct [self .key ]
110+ cfgv .check_array (cfgv .check_any )(val )
111+
112+ legacy_stages = [stage for stage in val if stage in _STAGES ]
113+ if legacy_stages :
114+ logger .warning (
115+ f'hook id `{ dct ["id" ]} ` uses deprecated stage names '
116+ f'({ ", " .join (legacy_stages )} ) which will be removed in a '
117+ f'future version. '
118+ f'run: `pre-commit migrate-config` to automatically fix this.' ,
119+ )
120+
121+ def apply_default (self , dct : dict [str , Any ]) -> None :
122+ pass
123+
124+ def remove_default (self , dct : dict [str , Any ]) -> None :
125+ raise NotImplementedError
126+
127+
102128MANIFEST_HOOK_DICT = cfgv .Map (
103129 'Hook' , 'id' ,
104130
@@ -267,6 +293,12 @@ def check(self, dct: dict[str, Any]) -> None:
267293 raise cfgv .ValidationError (f'{ self .key !r} cannot be overridden' )
268294
269295
296+ _COMMON_HOOK_WARNINGS = (
297+ OptionalSensibleRegexAtHook ('files' , cfgv .check_string ),
298+ OptionalSensibleRegexAtHook ('exclude' , cfgv .check_string ),
299+ DeprecatedStagesWarning ('stages' ),
300+ )
301+
270302META_HOOK_DICT = cfgv .Map (
271303 'Hook' , 'id' ,
272304 cfgv .Required ('id' , cfgv .check_string ),
@@ -289,8 +321,7 @@ def check(self, dct: dict[str, Any]) -> None:
289321 item
290322 for item in MANIFEST_HOOK_DICT .items
291323 ),
292- OptionalSensibleRegexAtHook ('files' , cfgv .check_string ),
293- OptionalSensibleRegexAtHook ('exclude' , cfgv .check_string ),
324+ * _COMMON_HOOK_WARNINGS ,
294325)
295326CONFIG_HOOK_DICT = cfgv .Map (
296327 'Hook' , 'id' ,
@@ -308,16 +339,13 @@ def check(self, dct: dict[str, Any]) -> None:
308339 if item .key != 'stages'
309340 ),
310341 StagesMigrationNoDefault ('stages' , []),
311- OptionalSensibleRegexAtHook ('files' , cfgv .check_string ),
312- OptionalSensibleRegexAtHook ('exclude' , cfgv .check_string ),
342+ * _COMMON_HOOK_WARNINGS ,
313343)
314344LOCAL_HOOK_DICT = cfgv .Map (
315345 'Hook' , 'id' ,
316346
317347 * MANIFEST_HOOK_DICT .items ,
318-
319- OptionalSensibleRegexAtHook ('files' , cfgv .check_string ),
320- OptionalSensibleRegexAtHook ('exclude' , cfgv .check_string ),
348+ * _COMMON_HOOK_WARNINGS ,
321349)
322350CONFIG_REPO_DICT = cfgv .Map (
323351 'Repository' , 'repo' ,
0 commit comments