@@ -144,3 +144,187 @@ fn maturin_dev_dependency_installer(project_info: &ProjectInfo) -> Result<()> {
144144 bail ! ( "No Python project manager provided for PyO3 project" ) ;
145145 }
146146}
147+
148+ pub fn update_precommit_hooks ( project_info : & ProjectInfo ) -> Result < ( ) > {
149+ match project_info. project_manager {
150+ ProjectManager :: Uv => uv_precommit_autoupdate ( project_info) ?,
151+ ProjectManager :: Poetry => poetry_precommit_autoupdate ( project_info) ?,
152+ ProjectManager :: Setuptools => setuptools_precommit_autoupdate ( project_info) ?,
153+ ProjectManager :: Pixi => pixi_precommit_autoupdate ( project_info) ?,
154+ ProjectManager :: Maturin => maturin_precommit_autoupdate ( project_info) ?,
155+ } ;
156+
157+ Ok ( ( ) )
158+ }
159+
160+ fn uv_precommit_autoupdate ( project_info : & ProjectInfo ) -> Result < ( ) > {
161+ let output = std:: process:: Command :: new ( "uv" )
162+ . args ( [ "run" , "pre-commit" , "autoupdate" ] )
163+ . current_dir ( project_info. base_dir ( ) )
164+ . output ( ) ?;
165+
166+ if !output. status . success ( ) {
167+ let stderr = String :: from_utf8_lossy ( & output. stderr ) ;
168+ bail ! ( "Failed to update pre-commit hooks: {stderr}" ) ;
169+ }
170+
171+ Ok ( ( ) )
172+ }
173+
174+ fn poetry_precommit_autoupdate ( project_info : & ProjectInfo ) -> Result < ( ) > {
175+ let output = std:: process:: Command :: new ( "poetry" )
176+ . args ( [ "run" , "pre-commit" , "autoupdate" ] )
177+ . current_dir ( project_info. base_dir ( ) )
178+ . output ( ) ?;
179+
180+ if !output. status . success ( ) {
181+ let stderr = String :: from_utf8_lossy ( & output. stderr ) ;
182+ bail ! ( "Failed to update pre-commit hooks: {stderr}" ) ;
183+ }
184+
185+ Ok ( ( ) )
186+ }
187+
188+ fn setuptools_precommit_autoupdate ( project_info : & ProjectInfo ) -> Result < ( ) > {
189+ let base_dir = project_info. base_dir ( ) ;
190+ let venv_path = base_dir. join ( ".venv" ) ;
191+
192+ if !venv_path. exists ( ) {
193+ bail ! ( "Virtual environment not found at {}" , venv_path. display( ) ) ;
194+ }
195+
196+ let precommit_bin = if cfg ! ( windows) {
197+ venv_path. join ( "Scripts" ) . join ( "pre-commit.exe" )
198+ } else {
199+ venv_path. join ( "bin" ) . join ( "pre-commit" )
200+ } ;
201+
202+ let output = std:: process:: Command :: new ( & precommit_bin)
203+ . args ( [ "autoupdate" ] )
204+ . current_dir ( base_dir)
205+ . output ( ) ?;
206+
207+ if !output. status . success ( ) {
208+ let stderr = String :: from_utf8_lossy ( & output. stderr ) ;
209+ bail ! ( "Failed to update pre-commit hooks: {stderr}" ) ;
210+ }
211+
212+ Ok ( ( ) )
213+ }
214+
215+ fn pixi_precommit_autoupdate ( project_info : & ProjectInfo ) -> Result < ( ) > {
216+ let output = std:: process:: Command :: new ( "pixi" )
217+ . args ( [ "run" , "pre-commit" , "autoupdate" ] )
218+ . current_dir ( project_info. base_dir ( ) )
219+ . output ( ) ?;
220+
221+ if !output. status . success ( ) {
222+ let stderr = String :: from_utf8_lossy ( & output. stderr ) ;
223+ bail ! ( "Failed to update pre-commit hooks: {stderr}" ) ;
224+ }
225+
226+ Ok ( ( ) )
227+ }
228+
229+ fn maturin_precommit_autoupdate ( project_info : & ProjectInfo ) -> Result < ( ) > {
230+ if let Some ( pyo3_python_manager) = & project_info. pyo3_python_manager {
231+ match pyo3_python_manager {
232+ Pyo3PythonManager :: Uv => uv_precommit_autoupdate ( project_info) ,
233+ Pyo3PythonManager :: Setuptools => setuptools_precommit_autoupdate ( project_info) ,
234+ }
235+ } else {
236+ bail ! ( "No Python project manager provided for PyO3 project" ) ;
237+ }
238+ }
239+
240+ pub fn install_precommit_hooks ( project_info : & ProjectInfo ) -> Result < ( ) > {
241+ match project_info. project_manager {
242+ ProjectManager :: Uv => uv_precommit_install ( project_info) ?,
243+ ProjectManager :: Poetry => poetry_precommit_install ( project_info) ?,
244+ ProjectManager :: Setuptools => setuptools_precommit_install ( project_info) ?,
245+ ProjectManager :: Pixi => pixi_precommit_install ( project_info) ?,
246+ ProjectManager :: Maturin => maturin_precommit_install ( project_info) ?,
247+ } ;
248+
249+ Ok ( ( ) )
250+ }
251+
252+ fn uv_precommit_install ( project_info : & ProjectInfo ) -> Result < ( ) > {
253+ let output = std:: process:: Command :: new ( "uv" )
254+ . args ( [ "run" , "pre-commit" , "install" ] )
255+ . current_dir ( project_info. base_dir ( ) )
256+ . output ( ) ?;
257+
258+ if !output. status . success ( ) {
259+ let stderr = String :: from_utf8_lossy ( & output. stderr ) ;
260+ bail ! ( "Failed to install pre-commit hooks: {stderr}" ) ;
261+ }
262+
263+ Ok ( ( ) )
264+ }
265+
266+ fn poetry_precommit_install ( project_info : & ProjectInfo ) -> Result < ( ) > {
267+ let output = std:: process:: Command :: new ( "poetry" )
268+ . args ( [ "run" , "pre-commit" , "install" ] )
269+ . current_dir ( project_info. base_dir ( ) )
270+ . output ( ) ?;
271+
272+ if !output. status . success ( ) {
273+ let stderr = String :: from_utf8_lossy ( & output. stderr ) ;
274+ bail ! ( "Failed to install pre-commit hooks: {stderr}" ) ;
275+ }
276+
277+ Ok ( ( ) )
278+ }
279+
280+ fn setuptools_precommit_install ( project_info : & ProjectInfo ) -> Result < ( ) > {
281+ let base_dir = project_info. base_dir ( ) ;
282+ let venv_path = base_dir. join ( ".venv" ) ;
283+
284+ if !venv_path. exists ( ) {
285+ bail ! ( "Virtual environment not found at {}" , venv_path. display( ) ) ;
286+ }
287+
288+ let precommit_bin = if cfg ! ( windows) {
289+ venv_path. join ( "Scripts" ) . join ( "pre-commit.exe" )
290+ } else {
291+ venv_path. join ( "bin" ) . join ( "pre-commit" )
292+ } ;
293+
294+ let output = std:: process:: Command :: new ( & precommit_bin)
295+ . args ( [ "install" ] )
296+ . current_dir ( base_dir)
297+ . output ( ) ?;
298+
299+ if !output. status . success ( ) {
300+ let stderr = String :: from_utf8_lossy ( & output. stderr ) ;
301+ bail ! ( "Failed to install pre-commit hooks: {stderr}" ) ;
302+ }
303+
304+ Ok ( ( ) )
305+ }
306+
307+ fn pixi_precommit_install ( project_info : & ProjectInfo ) -> Result < ( ) > {
308+ let output = std:: process:: Command :: new ( "pixi" )
309+ . args ( [ "run" , "pre-commit" , "install" ] )
310+ . current_dir ( project_info. base_dir ( ) )
311+ . output ( ) ?;
312+
313+ if !output. status . success ( ) {
314+ let stderr = String :: from_utf8_lossy ( & output. stderr ) ;
315+ bail ! ( "Failed to install pre-commit hooks: {stderr}" ) ;
316+ }
317+
318+ Ok ( ( ) )
319+ }
320+
321+ fn maturin_precommit_install ( project_info : & ProjectInfo ) -> Result < ( ) > {
322+ if let Some ( pyo3_python_manager) = & project_info. pyo3_python_manager {
323+ match pyo3_python_manager {
324+ Pyo3PythonManager :: Uv => uv_precommit_install ( project_info) ,
325+ Pyo3PythonManager :: Setuptools => setuptools_precommit_install ( project_info) ,
326+ }
327+ } else {
328+ bail ! ( "No Python project manager provided for PyO3 project" ) ;
329+ }
330+ }
0 commit comments