Source code for pjkm.core.tasks.install.pre_commit_install
"""Install task: install pre-commit hooks."""
from __future__ import annotations
import subprocess
from pjkm.core.engine.task_context import TaskContext
from pjkm.core.models.task import Phase, TaskResult
from pjkm.core.tasks.base import BaseTask
[docs]
class PreCommitInstallTask(BaseTask):
"""Installs pre-commit hooks in the generated project."""
[docs]
id = "pre_commit_install"
[docs]
depends_on = ["pdm_install"]
[docs]
description = "Install pre-commit hooks"
[docs]
def should_run(self, ctx: TaskContext) -> bool:
return (
ctx.platform.has_tool("pre-commit")
and (ctx.project_dir / ".pre-commit-config.yaml").exists()
and (ctx.project_dir / ".git").exists()
)
[docs]
def execute(self, ctx: TaskContext) -> TaskResult:
if ctx.config.dry_run:
return self.success_result(message="Pre-commit hooks installed (dry run)")
try:
subprocess.run(
["pre-commit", "install"],
cwd=ctx.project_dir,
capture_output=True,
check=True,
text=True,
timeout=60,
)
subprocess.run(
["pre-commit", "install", "--hook-type", "commit-msg"],
cwd=ctx.project_dir,
capture_output=True,
check=True,
text=True,
timeout=60,
)
return self.success_result(message="Pre-commit hooks installed")
except subprocess.CalledProcessError as exc:
return self.failure_result(f"pre-commit install failed: {exc.stderr[:500]}")
except subprocess.TimeoutExpired:
return self.failure_result("pre-commit install timed out")