1
1
"""Generate pre-commit hooks for Java and Python projects.
2
2
3
3
This script scans a repository for Java and Python projects and generates appropriate
4
- pre-commit hooks for linting and formatting.
4
+ pre-commit hooks for linting and formatting. It also merges in additional hooks from
5
+ an override file.
5
6
"""
6
7
7
8
import os
@@ -138,8 +139,9 @@ def _get_relative_path(self, path: Path) -> str:
138
139
class HookGenerator :
139
140
"""Generate pre-commit hooks for projects."""
140
141
141
- def __init__ (self , projects : list [Project ]):
142
+ def __init__ (self , projects : list [Project ], override_file : str = None ):
142
143
self .projects = projects
144
+ self .override_file = override_file
143
145
144
146
def generate_config (self ) -> dict :
145
147
"""Generate the complete pre-commit config."""
@@ -151,7 +153,32 @@ def generate_config(self) -> dict:
151
153
else : # ProjectType.JAVA
152
154
hooks .append (self ._generate_spotless_hook (project ))
153
155
154
- return {"repos" : [{"repo" : "local" , "hooks" : hooks }]}
156
+ config = {"repos" : [{"repo" : "local" , "hooks" : hooks }]}
157
+
158
+ # Merge override hooks if they exist
159
+ if self .override_file and os .path .exists (self .override_file ):
160
+ try :
161
+ with open (self .override_file , 'r' ) as f :
162
+ override_config = yaml .safe_load (f )
163
+
164
+ if override_config and 'repos' in override_config :
165
+ for override_repo in override_config ['repos' ]:
166
+ matching_repo = next (
167
+ (repo for repo in config ['repos' ]
168
+ if repo ['repo' ] == override_repo ['repo' ]),
169
+ None
170
+ )
171
+
172
+ if matching_repo :
173
+ matching_repo ['hooks' ].extend (override_repo .get ('hooks' , []))
174
+ else :
175
+ config ['repos' ].append (override_repo )
176
+
177
+ print (f"Merged additional hooks from { self .override_file } " )
178
+ except Exception as e :
179
+ print (f"Warning: Error reading override file { self .override_file } : { e } " )
180
+
181
+ return config
155
182
156
183
def _generate_lint_fix_hook (self , project : Project ) -> dict :
157
184
"""Generate a lint-fix hook for Python projects."""
@@ -208,6 +235,7 @@ def write_yaml_with_spaces(file_path: str, data: dict):
208
235
209
236
def main ():
210
237
root_dir = os .path .abspath (os .curdir )
238
+ override_file = ".github/scripts/pre-commit-override.yaml"
211
239
212
240
# Find projects
213
241
finder = ProjectFinder (root_dir )
@@ -226,12 +254,12 @@ def main():
226
254
print (f" - { project .path } " )
227
255
228
256
# Generate and write config
229
- generator = HookGenerator (projects )
257
+ generator = HookGenerator (projects , override_file )
230
258
config = generator .generate_config ()
231
259
write_yaml_with_spaces (".pre-commit-config.yaml" , config )
232
260
233
261
print ("\n Generated .pre-commit-config.yaml" )
234
262
235
263
236
264
if __name__ == "__main__" :
237
- main ()
265
+ main ()
0 commit comments