# Foodster. Run `make` for the target list. COMPOSE ?= podman compose BIN := foodster PKG := ./cmd/foodster # Registry coordinates, shared password and TZ live here. Gitignored. ifneq (,$(wildcard .env)) include .env export endif # Generated templ output is excluded — it is not ours to format. GOFILES = $(shell find . -name '*.go' -not -name '*_templ.go' 2>/dev/null) .DEFAULT_GOAL := help .PHONY: help generate build run test lint fix image push release up down logs clean help: ## Show this help @grep -hE '^[a-zA-Z_-]+:.*## ' $(MAKEFILE_LIST) \ | awk -F':.*## ' '{printf " \033[1m%-9s\033[0m %s\n", $$1, $$2}' generate: ## Generate Go from .templ files go tool templ generate build: generate ## Build ./foodster CGO_ENABLED=0 go build -trimpath \ -ldflags="-s -w -X main.version=dev" -o $(BIN) $(PKG) run: generate ## Run locally on :8080 FOODSTER_PASSWORD=$${FOODSTER_PASSWORD:-dev} \ FOODSTER_DB=$${FOODSTER_DB:-./foodster.db} \ go run $(PKG) test: generate ## Run tests go test ./... lint: ## go vet, gofmt check, golangci-lint when installed go vet ./... @bad=$$(gofmt -l $(GOFILES) 2>/dev/null); \ if [ -n "$$bad" ]; then echo "gofmt needed:"; echo "$$bad"; exit 1; fi @if command -v golangci-lint >/dev/null 2>&1; then golangci-lint run; \ else echo "golangci-lint not installed - skipped"; fi fix: ## Format Go and templ sources, tidy go.mod @if [ -n "$(GOFILES)" ]; then gofmt -w $(GOFILES); fi go tool templ fmt . go mod tidy image: ## Build and tag an image as vYYYYMMDD-N. Creates a git tag. @test -n "$(FOODSTER_REPO)" || { echo "set FOODSTER_REPO in .env"; exit 1; } @day=$$(date +%Y%m%d); \ tag="v$$day-$$(( $$(git tag -l "v$$day-*" | wc -l) + 1 ))"; \ echo "==> $$tag"; \ git tag "$$tag"; \ podman build --platform linux/amd64 --build-arg VERSION="$$tag" \ -t "$(FOODSTER_REPO):$$tag" -t "$(FOODSTER_REPO):latest" . push: ## Push the newest tag and :latest @test -n "$(FOODSTER_REPO)" || { echo "set FOODSTER_REPO in .env"; exit 1; } @tag=$$(git tag -l 'v*' --sort=-creatordate | head -n1); \ test -n "$$tag" || { echo "no tags yet - run make image"; exit 1; }; \ podman push "$(FOODSTER_REPO):$$tag"; \ podman push "$(FOODSTER_REPO):latest" release: image push ## Build, tag and push in one go up: ## Start the stack $(COMPOSE) up -d down: ## Stop the stack $(COMPOSE) down logs: ## Follow app logs $(COMPOSE) logs -f app clean: ## Remove the binary and generated templates rm -f $(BIN) find . -name '*_templ.go' -delete