From: Tom de Vries Date: Thu, 11 Dec 2025 21:38:30 +0000 (+0100) Subject: [pre-commit] Add pre-commit setup check X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=831917c6e0f3ecee9f0482f45b38b2ab9277cd76;p=thirdparty%2Fbinutils-gdb.git [pre-commit] Add pre-commit setup check I wrote a patch and accidentally introduced a typo in the commit message. This didn't get detected because codespell-log didn't run. I installed pre-commit on that setup a while back, before codespell-log was around and consequently only the .git/hooks/pre-commit script was installed. This is a bit hard to notice given that all other hooks do run. Add a pre-commit check that checks for this situation: ... $ rm .git/hooks/commit-msg $ git commit --amend ... pre-commit-setup........................................................Failed - hook id: pre-commit-setup - exit code: 1 missing hook: .git/hooks/commit-msg (please run pre-commit install) ... $ ... This is a bit niche, but worthwhile if you're using a dozen build and test installations. --- diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 62af6f5d2f9..6757d872ce3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -104,6 +104,12 @@ repos: files: '^(gdb(support|server)?)/.*$' pass_filenames: true stages: [pre-commit] + - id: pre-commit-setup + name: pre-commit-setup + language: script + entry: gdb/contrib/pre-commit-setup.py + always_run: true + require_serial: true - repo: https://github.com/nmoroze/tclint rev: v0.6.2 hooks: diff --git a/gdb/contrib/pre-commit-setup.py b/gdb/contrib/pre-commit-setup.py new file mode 100755 index 00000000000..71f19bc10be --- /dev/null +++ b/gdb/contrib/pre-commit-setup.py @@ -0,0 +1,62 @@ +#!/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 . + +# 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) diff --git a/gdb/testsuite/gdb.src/pre-commit.exp b/gdb/testsuite/gdb.src/pre-commit.exp index 8745b31272e..7c8cb6b363c 100644 --- a/gdb/testsuite/gdb.src/pre-commit.exp +++ b/gdb/testsuite/gdb.src/pre-commit.exp @@ -31,6 +31,10 @@ with_cwd $repodir { return } + # Skip the pre-commit-setup check. It checks the repository setup, not + # the sources. + setenv SKIP pre-commit-setup + set result [remote_exec build "pre-commit run --all-files -v"] set status [lindex $result 0] gdb_assert {$status == 0} "pre-commit checks"