Files
EverOS/scripts/check_pr_title.py
Elliot Chen 79b3df4de2 docs(readme): polish launch highlights and banner (#261)
* docs: simplify README launch highlights

* docs(readme): use six launch highlights

* docs(readme): use optimized banner asset

* ci: lint pull request titles
2026-06-06 19:49:59 +08:00

71 lines
1.9 KiB
Python

"""Validate pull request titles against the EverOS Conventional Commits policy."""
from __future__ import annotations
import importlib.util
import os
import sys
from pathlib import Path
from types import ModuleType
_SCRIPT_DIR = Path(__file__).resolve().parent
def _load_commit_policy() -> ModuleType:
policy_path = _SCRIPT_DIR / "check_commit_messages.py"
spec = importlib.util.spec_from_file_location("_commit_message_policy", policy_path)
if spec is None or spec.loader is None:
raise RuntimeError(f"Unable to load commit policy from {policy_path}")
module = importlib.util.module_from_spec(spec)
sys.modules[spec.name] = module
spec.loader.exec_module(module)
return module
_POLICY = _load_commit_policy()
ALLOWED_TYPES = _POLICY.ALLOWED_TYPES
MAX_TITLE_LENGTH = _POLICY.MAX_TITLE_LENGTH
TITLE_RE = _POLICY.TITLE_RE
def validate_title(title: str) -> list[str]:
title = title.strip()
if not title:
return ["missing PR title"]
if len(title) > MAX_TITLE_LENGTH:
return [f"PR title is {len(title)} chars; max is {MAX_TITLE_LENGTH}: {title}"]
if not TITLE_RE.match(title):
allowed = ", ".join(ALLOWED_TYPES)
return [
f"invalid PR title: {title}\n"
" expected: <type>[(scope)][!]: <description>\n"
f" allowed types: {allowed}"
]
return []
def _title_from_args_or_env(argv: list[str]) -> str:
if argv:
return " ".join(argv)
return os.getenv("PR_TITLE", "")
def main(argv: list[str] | None = None) -> int:
title = _title_from_args_or_env(sys.argv[1:] if argv is None else argv)
failures = validate_title(title)
if failures:
print("Pull request title check failed:")
print("\n".join(failures))
return 1
print("Pull request title follows Conventional Commits.")
return 0
if __name__ == "__main__":
raise SystemExit(main())