Scaffolds the server module and everything Phase 0 of PLAN.md calls for: a binary that boots, serves its discovery endpoints and nothing else yet. - config: one YAML file plus per-field WARP_* environment overrides, unknown fields rejected, validation that reports every problem at once - logging and metrics: slog, a Prometheus registry, per-route HTTP instrumentation labelled by pattern rather than path - httputil: the Matrix error envelope, error-returning handlers, CORS, request logging, panic recovery, and a router over http.ServeMux - endpoints: /_matrix/client/versions, /.well-known/matrix/client, /.well-known/matrix/server (gated), /healthz, /metrics, and M_UNRECOGNIZED for everything else - storage: driver registry, shared database/sql base, checksummed migration runner, sqlite and postgres drivers, pocketbase stub - settings: server_settings table behind a cached service, so the federation and registration switches change without a restart - federation: the gate that makes federation a runtime mode - cmd/warp: serve, migrate, generate-keys, version - Makefile, golangci-lint v2, GitHub Actions CI (Linux and Windows tests, race on Linux, storage tests against PostgreSQL, lint, boot smoke test), Dockerfile, example config and docs Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
99 lines
2.9 KiB
Makefile
99 lines
2.9 KiB
Makefile
# Warp — build, test and lint.
|
|
#
|
|
# Everything Go lives in ./server; the frontend packages (apps/*) get their
|
|
# own targets as they are created.
|
|
|
|
SHELL := /bin/sh
|
|
GO ?= go
|
|
BIN_DIR := bin
|
|
BINARY := warp
|
|
SERVER_DIR := server
|
|
|
|
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo 0.0.0-dev)
|
|
COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown)
|
|
DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
PKG := github.com/dariuszjaniak/warp/server/internal/buildinfo
|
|
LDFLAGS := -X $(PKG).Version=$(VERSION) -X $(PKG).Commit=$(COMMIT) -X $(PKG).BuildDate=$(DATE)
|
|
|
|
# Windows builds need the .exe suffix for `make run` to work from MSYS.
|
|
ifeq ($(OS),Windows_NT)
|
|
EXE := .exe
|
|
else
|
|
EXE :=
|
|
endif
|
|
|
|
.DEFAULT_GOAL := build
|
|
|
|
.PHONY: help
|
|
help: ## List the targets
|
|
@grep -hE '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | \
|
|
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-16s\033[0m %s\n", $$1, $$2}'
|
|
|
|
.PHONY: build
|
|
build: ## Build the warp binary into bin/
|
|
cd $(SERVER_DIR) && $(GO) build -ldflags "$(LDFLAGS)" -o ../$(BIN_DIR)/$(BINARY)$(EXE) ./cmd/warp
|
|
|
|
.PHONY: run
|
|
run: build ## Build and run the server
|
|
./$(BIN_DIR)/$(BINARY)$(EXE) serve
|
|
|
|
.PHONY: test
|
|
test: ## Run the unit tests (sqlite only)
|
|
cd $(SERVER_DIR) && $(GO) test ./...
|
|
|
|
.PHONY: test-race
|
|
test-race: ## Run the tests with the race detector (needs cgo)
|
|
cd $(SERVER_DIR) && CGO_ENABLED=1 $(GO) test -race ./...
|
|
|
|
.PHONY: test-postgres
|
|
test-postgres: ## Run the storage tests against PostgreSQL too
|
|
@test -n "$(WARP_TEST_POSTGRES_DSN)" || \
|
|
{ echo "set WARP_TEST_POSTGRES_DSN, e.g. postgres://warp:warp@localhost/warp_test?sslmode=disable"; exit 1; }
|
|
cd $(SERVER_DIR) && WARP_TEST_POSTGRES_DSN="$(WARP_TEST_POSTGRES_DSN)" $(GO) test ./internal/storage/...
|
|
|
|
.PHONY: cover
|
|
cover: ## Run the tests and write coverage.out / coverage.html
|
|
cd $(SERVER_DIR) && $(GO) test -coverprofile=../coverage.out -covermode=count ./...
|
|
$(GO) tool cover -html=coverage.out -o coverage.html
|
|
@echo "wrote coverage.html"
|
|
|
|
.PHONY: fmt
|
|
fmt: ## Format the Go code
|
|
cd $(SERVER_DIR) && $(GO) fmt ./...
|
|
|
|
.PHONY: vet
|
|
vet: ## Run go vet
|
|
cd $(SERVER_DIR) && $(GO) vet ./...
|
|
|
|
.PHONY: lint
|
|
lint: ## Run golangci-lint
|
|
cd $(SERVER_DIR) && golangci-lint run
|
|
|
|
.PHONY: tidy
|
|
tidy: ## Tidy the Go module files
|
|
cd $(SERVER_DIR) && $(GO) mod tidy
|
|
|
|
.PHONY: check
|
|
check: vet test ## What CI runs on every push (minus the linter)
|
|
|
|
.PHONY: generate-keys
|
|
generate-keys: build ## Create the ed25519 signing key
|
|
./$(BIN_DIR)/$(BINARY)$(EXE) generate-keys
|
|
|
|
.PHONY: migrate
|
|
migrate: build ## Apply pending database migrations
|
|
./$(BIN_DIR)/$(BINARY)$(EXE) migrate
|
|
|
|
.PHONY: complement
|
|
complement: ## Run the Complement suite (Phase 1 onwards)
|
|
@echo "Complement is wired up in Phase 1, once registration and login exist."
|
|
@exit 1
|
|
|
|
.PHONY: docker
|
|
docker: ## Build the container image
|
|
docker build -t warp:$(VERSION) .
|
|
|
|
.PHONY: clean
|
|
clean: ## Remove build output
|
|
rm -rf $(BIN_DIR) coverage.out coverage.html
|