Download
98 lines 3.5 KiBMakefileModified 2026-10-28 raw
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
.POSIX:

# ---- on your machine ------------------------------------------------------
#
# make                the renderer and the preview server, for this machine
# make preview        render the repositories in preview/repos.txt and serve them
# make check          go vet, gofmt, shellcheck, the Go tests and the node tests
# make fuzz           fuzz the checks on pushed names and paths
# make screenshots    retake the README's screenshots
#
# ---- for the server ----------------------------------------------------------
#
# make server         dist/repo-render-OS-ARCH.tar.gz: the renderer built for
#                     the server, new-repo, the hook, the example configs,
#                     and install.sh, which installs them there (see
#                     docs/openbsd.md)

BINS = repo-render repo-render-preview

all: $(BINS)

$(BINS): FORCE
	go build -trimpath -o $@ ./cmd/$@

# The server's OS and architecture: OpenBSD on amd64 unless you say.
SERVER_OS = openbsd
SERVER_ARCH = amd64
SERVER = repo-render-$(SERVER_OS)-$(SERVER_ARCH)

server: FORCE
	rm -rf dist/$(SERVER)
	mkdir -p dist/$(SERVER)/bin dist/$(SERVER)/share/repo-render dist/$(SERVER)/share/examples/repo-render
	GOOS=$(SERVER_OS) GOARCH=$(SERVER_ARCH) CGO_ENABLED=0 go build -trimpath -ldflags='-s -w' \
		-o dist/$(SERVER)/bin/repo-render ./cmd/repo-render
	cp contrib/new-repo dist/$(SERVER)/bin/repo-render-new-repo
	cp contrib/post-receive dist/$(SERVER)/share/repo-render/post-receive
	cp examples/repo-render.yaml examples/httpd.conf dist/$(SERVER)/share/examples/repo-render/
	cp contrib/install.sh dist/$(SERVER)/install.sh
	tar -C dist -czf dist/$(SERVER).tar.gz $(SERVER)
	@echo "dist/$(SERVER).tar.gz: copy it to the server, then there: tar -xzf $(SERVER).tar.gz && doas $(SERVER)/install.sh"

test:
	go test ./...
	node --test test/*_test.js

# Fuzz each untrusted-input check for FUZZTIME. `make test` runs only the
# seeds.
FUZZTIME = 30s
FUZZ = internal/config:FuzzValidBranchName internal/config:FuzzValidRepoName \
	internal/render:FuzzValidPath internal/render:FuzzSanitizeTag \
	internal/queue:FuzzParse internal/queue:FuzzAppendTake \
	internal/markdown:FuzzResolve internal/markdown:FuzzRender \
	internal/markdown:FuzzStripPandocMeta internal/render:FuzzThemeSVG \
	internal/highlight:FuzzHTML internal/httpd:FuzzPattern

fuzz:
	for f in $(FUZZ); do \
		go test -run '^$$' -fuzz "^$${f#*:}$$" -fuzztime $(FUZZTIME) ./$${f%%:*} || exit 1; \
	done

vet:
	go vet ./...
	gofmt -l . | (! grep .)

SHELL_SCRIPTS = contrib/install.sh contrib/new-repo contrib/post-receive preview/fetch.sh tools/create-repo tools/migrate-from-github

shellcheck:
	shellcheck $(SHELL_SCRIPTS)

check: vet shellcheck test

# Local preview: fetch the repositories in preview/repos.txt, render them
# with preview/repo-render.yaml into .preview/, and serve the result.
PREVIEW_LISTEN = 127.0.0.1:8080
PREVIEW = ./repo-render --config preview/repo-render.yaml

preview-fetch:
	preview/fetch.sh .preview/git preview/repos.txt

preview-render: repo-render preview-fetch
	$(PREVIEW) render --all

preview: preview-render repo-render-preview
	./repo-render-preview --listen $(PREVIEW_LISTEN) .preview/htdocs

preview-clean:
	rm -rf .preview

# Retake the README's screenshots of the preview site. Needs node and firefox.
screenshots: preview-render repo-render-preview
	node preview/screenshots.mjs ./repo-render-preview .preview/htdocs docs/screenshots

clean:
	rm -rf $(BINS) dist .preview

FORCE:

.PHONY: all server test fuzz vet shellcheck check preview preview-fetch preview-render preview-clean screenshots clean FORCE