blob: 71f19bc10bea8e186910aa814ec1435a621538dc [file] [log] [blame]
#!/usr/bin/env python3
# Copyright (C) 2025 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Occasionally we add new stages to default_install_hook_types in
# .pre-commit-config.yaml. The new stages are not used until somebody runs
# pre-commit install again. This script, meant to run as a pre-commit hook in
# the pre-commit stage, detects this situation.
import os
import re
import sys
import yaml
cfg = ".pre-commit-config.yaml"
with open(cfg, "r") as f:
data = yaml.load(f, Loader=yaml.SafeLoader)
stages = data.get("default_install_hook_types", ["pre-commit"])
if os.path.isfile(".git"):
# Handle worktrees.
fp = open(".git")
text = fp.read()
m = re.search("gitdir: (.*)", text)
dir = os.path.join(m.group(1), "..", "..")
else:
dir = ".git"
if not os.path.isdir(dir):
# Not a git repository.
print("no .git dir found, skipping")
sys.exit(0)
for val in stages:
f = os.path.join(dir, "hooks", val)
if not (os.path.isfile(f)):
if val == "pre-commit":
print("pre-commit framework hooks not installed, skipping")
sys.exit(0)
print("missing hook: " + val + " (please run pre-commit install)")
sys.exit(1)
fp = open(f)
text = fp.read()
m = re.search("File generated by pre-commit", text)
if not m:
print("not a pre-commit framework hook: " + f)
sys.exit(1)