.PHONY: all check test lint fmt fmt-check build clean deps test-coverage test-integration local install release release-snapshot # Version number VERSION := 1.0.0-rc.1 # Build variables GIT_REVISION := $(shell git rev-parse HEAD 2>/dev/null || echo "unknown") # Linker flags LDFLAGS := -X 'git.eeqj.de/sneak/vaultik/internal/globals.Version=$(VERSION)' \ -X 'git.eeqj.de/sneak/vaultik/internal/globals.Commit=$(GIT_REVISION)' # Default target all: vaultik # Combined pre-commit/CI gate: lint, format check, then tests. check: lint fmt-check test # Run tests only. test: @echo "Running tests..." @if ! go test -v -timeout 10s ./... 2>&1; then \ echo ""; \ echo "TEST FAILURES DETECTED"; \ echo "Run 'go test -v ./internal/database' to see database test details"; \ exit 1; \ fi # Check if code is formatted. fmt-check: @if [ -n "$$(go fmt ./...)" ]; then \ echo "Error: Code is not formatted. Run 'make fmt' to fix."; \ exit 1; \ fi # Format code. fmt: go fmt ./... # Run linter only. lint: golangci-lint run # Build binary. vaultik: internal/*/*.go cmd/vaultik/*.go go build -ldflags "$(LDFLAGS)" -o $@ ./cmd/vaultik # Clean build artifacts. clean: rm -f vaultik 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 ./... local: VAULTIK_CONFIG=$(HOME)/etc/vaultik/config.yml ./vaultik snapshot --debug list 2>&1 VAULTIK_CONFIG=$(HOME)/etc/vaultik/config.yml ./vaultik snapshot --debug create 2>&1 install: vaultik cp ./vaultik $(HOME)/bin/ # Build and publish release artifacts (linux/darwin × amd64/arm64) via goreleaser. release: goreleaser release --clean # Dry-run a release build without publishing or tagging. release-snapshot: goreleaser release --clean --snapshot