# Targets .PHONY: all run test clean docker lint update-data all: run example: *.go ./cmd/example/*.go go build -o $@ ./cmd/example/main.go run: example ./example test: go test -v ./... clean: rm -f example blogs.json.tmp docker: docker build --progress plain . lint: golangci-lint run # Refresh the vendored dataset from the BlogsURL constant in hnblogs.go, which # is the single source of truth for the upstream location. The download lands # on a temporary file and only replaces blogs.json once it has been checked to # be a non-empty JSON array of blog entries, so neither an interrupted transfer # nor a complete-but-wrong response (an error page, a redirect landing page) # can overwrite the good dataset. update-data: @command -v jq >/dev/null || { echo "update-data requires jq" >&2; exit 1; } @url=$$(sed -n 's/^const BlogsURL = "\(.*\)"$$/\1/p' hnblogs.go); \ test -n "$$url" || { echo "could not parse BlogsURL from hnblogs.go" >&2; exit 1; }; \ echo "downloading $$url"; \ curl -fsSL "$$url" -o blogs.json.tmp @jq -e 'type == "array" and length > 0 and all(.[]; type == "object" and has("url"))' \ blogs.json.tmp >/dev/null 2>&1 \ || { echo "download is not a non-empty JSON array of blog entries; blogs.json left unchanged" >&2; \ rm -f blogs.json.tmp; exit 1; } mv blogs.json.tmp blogs.json $(MAKE) test