.PHONY: all check test lint fmt fmt-check build clean deps test-coverage test-integration install release release-snapshot docker hooks # Version number VERSION := 0.1.0-dev # Default target all: bsdaily # Combined pre-commit/CI gate: lint, format check, then tests. check: lint fmt-check test # Run tests only. test: go test -race -timeout 30s ./... # Check if code is formatted (read-only). fmt-check: @test -z "$$(gofmt -l .)" || (echo "Files not formatted:" && gofmt -l . && exit 1) # Format code. fmt: go fmt ./... # Run linter only. lint: golangci-lint run ./... # Build binary (pure Go; no CGO required since we use modernc.org/sqlite). bsdaily: internal/*/*.go cmd/bsdaily/*.go CGO_ENABLED=0 go build -o $@ ./cmd/bsdaily # Clean build artifacts. clean: rm -f bsdaily go clean # Install dependencies. deps: go mod download go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest # Run tests with coverage. test-coverage: go test -v -coverprofile=coverage.out ./... go tool cover -html=coverage.out -o coverage.html # Run integration tests. test-integration: go test -v -tags=integration ./... install: bsdaily cp ./bsdaily $(HOME)/bin/ # Build and publish release artifacts via goreleaser. release: goreleaser release --clean # Dry-run a release build without publishing or tagging. release-snapshot: goreleaser release --clean --snapshot # Build Docker image. docker: docker build -t bsdaily . # Install pre-commit hook. hooks: @printf '#!/bin/sh\nset -e\n' > .git/hooks/pre-commit @printf 'go mod tidy\ngo fmt ./...\ngit diff --exit-code -- go.mod go.sum || { echo "go mod tidy changed files; please stage and retry"; exit 1; }\n' >> .git/hooks/pre-commit @printf 'make check\n' >> .git/hooks/pre-commit @chmod +x .git/hooks/pre-commit