# Go parameters GOCMD = go GOBUILD = $(GOCMD) build GOCLEAN = $(GOCMD) clean GOTEST = $(GOCMD) test GOGET = $(GOCMD) get # SQLite database filename DB_FILE = db.sqlite3 PROC_NAME = ttime_server # Directory containing migration SQL scripts MIGRATIONS_DIR = internal/database/migrations SAMPLE_DATA_DIR = internal/database/sample_data # Build target build: $(GOBUILD) -o bin/$(PROC_NAME) main.go # Run target run: build ./bin/$(PROC_NAME) watch: build watchexec -c -w . -r make run # Clean target clean: $(GOCLEAN) rm -rf bin rm -f db.sqlite3 rm -f diagram* rm -f plantuml.jar rm -f erd.png rm -f config.toml # Test target test: db.sqlite3 $(GOTEST) ./... -count=1 # Integration test target .PHONY: itest itest: pgrep $(PROC_NAME) && echo "Server already running" && exit 1 || true make build ./bin/$(PROC_NAME) >/dev/null 2>&1 & sleep 1 # Adjust if needed python ../testing.py pkill $(PROC_NAME) # Get dependencies target deps: $(GOGET) -v ./... # Update dependencies target update: $(GOGET) -u -v ./... $(GOCMD) mod tidy # Migration target migrate: @echo "If this ever fails, run make clean and try again" @echo "Migrating database $(DB_FILE) using SQL scripts in $(MIGRATIONS_DIR)" @for file in $(wildcard $(MIGRATIONS_DIR)/*.sql); do \ echo "Applying migration: $$file"; \ sqlite3 $(DB_FILE) < $$file; \ done sampledata: @echo "If this ever fails, run make clean and try again" @echo "Migrating database $(DB_FILE) using SQL scripts in $(SAMPLE_DATA_DIR)" @for file in $(wildcard $(SAMPLE_DATA_DIR)/*.sql); do \ echo "Applying migration: $$file"; \ sqlite3 $(DB_FILE) < $$file; \ done # Target added primarily for CI/CD to ensure that the database is created before running tests db.sqlite3: make migrate dbdump: sqlite3 $(DB_FILE) .dump > database.txt backup: mkdir -p backups sqlite3 $(DB_FILE) .dump | gzip -9 > ./backups/BACKUP_$(DB_FILE)_$(shell date +"%Y-%m-%d_%H:%M:%S").sql.gz # Restore with: # gzip -cd BACKUP_FILE.sql.gz | sqlite3 $(DB_FILE) # Format fmt: $(GOCMD) fmt ./... # Lint lint: golangci-lint run ./... # Default target default: build # Generate swagger docs .PHONY: docs docs: swag init -outputTypes go .PHONY: docfmt docfmt: swag fmt # Generate ERD # Requires eralchemy2 .PHONY: erd erd: eralchemy2 -i sqlite:///db.sqlite3 -o erd.png install-swag: @echo "Installing swag" @go get -u github.com/swaggo/swag/cmd/swag # Convenience target to install golangci-lint install-lint: @echo "Installing golangci-lint" @curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.42.1 # Fetches the latest plantuml.jar and checks its SHA256 hash plantuml.jar: curl -sSfL https://github.com/plantuml/plantuml/releases/download/v1.2024.3/plantuml.jar -o plantuml.jar \ && echo "519a4a7284c6a0357c369e4bb0caf72c4bfbbde851b8c6d6bbdb7af3c01fc82f plantuml.jar" | sha256sum -c # Generate UML diagrams diagral.png & diagram.svg .PHONY: uml uml: plantuml.jar goplantuml -recursive . > diagram.puml java -jar plantuml.jar -tpng diagram.puml java -jar plantuml.jar -tsvg diagram.puml # Convenience target to install just (requires sudo privileges) install-just: @echo "Installing just" @curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/local/bin .PHONY: types types: tygo generate .PHONY: install-golds install-golds: go install go101.org/golds@latest .PHONY: golds golds: golds -port 6060 -nouses -plainsrc -wdpkgs-listing=promoted ./...