From c81d805163f2bb757b8f680641cbf46a02b6a9cc Mon Sep 17 00:00:00 2001 From: Jonathan Haas Date: Wed, 15 Apr 2026 00:23:22 -0700 Subject: [PATCH] Add Go pre-commit hook --- Makefile | 6 +++++- scripts/pre-commit | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100755 scripts/pre-commit diff --git a/Makefile b/Makefile index 0b30772..b0f87e1 100644 --- a/Makefile +++ b/Makefile @@ -8,10 +8,14 @@ GOSEC ?= $(GOBIN)/gosec OPA ?= opa export PATH := $(GOBIN):$(PATH) -.PHONY: all tidy build test lint format lint-go lint-python format-go format-python docker-up docker-down docker-logs db-migrate opa-test cert-refresh setup-venv security +.PHONY: all tidy build test lint format lint-go lint-python format-go format-python docker-up docker-down docker-logs db-migrate opa-test cert-refresh setup-venv security install-hooks all: build +install-hooks: + mkdir -p .git/hooks + install -m 0755 scripts/pre-commit .git/hooks/pre-commit + tidy: go mod tidy diff --git a/scripts/pre-commit b/scripts/pre-commit new file mode 100755 index 0000000..384c0ed --- /dev/null +++ b/scripts/pre-commit @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +set -euo pipefail + +repo_root=$(git rev-parse --show-toplevel) +cd "$repo_root" + +mapfile -t staged_go_files < <(git diff --cached --name-only --diff-filter=ACM -- "*.go") +if [ ${#staged_go_files[@]} -eq 0 ]; then + exit 0 +fi + +stashed=0 +cleanup() { + if [ "$stashed" -eq 1 ]; then + git stash pop -q >/dev/null 2>&1 || true + fi +} +trap cleanup EXIT + +if ! git diff --quiet -- . || [ -n "$(git ls-files --others --exclude-standard)" ]; then + git stash push -q --keep-index --include-untracked -m "pre-commit-$(date +%s)" + stashed=1 +fi + +echo "Running gofmt on staged files..." +gofmt -w "${staged_go_files[@]}" +git add -- "${staged_go_files[@]}" + +if ! command -v golangci-lint >/dev/null 2>&1; then + echo "golangci-lint is required for this repo. Install it and retry." >&2 + exit 1 +fi + +echo "Running golangci-lint..." +golangci-lint run ./... + +echo "Running go test..." +go test ./...