include ../metadata.mk

PACKAGE_NAME = github.com/projectcalico/calico/release

include ../lib.Makefile

.PHONY: build
build: bin/release

# The tool logs to the directory it ran from, so clean the repo root too.
clean:
	@rm -rf ./bin ./output ./_output ./report ./tmp ./_logs
	@rm -f ./internal/defaults/metadata.mk
	@find .. -maxdepth 1 -name '*.log' -delete
	@find . -name '*.log' -delete
	@find . -name '*.received.*' -delete

# Stage metadata.mk next to embed.go so go:embed (which requires paths relative to the source file) can pick it up.
# Embedding also makes the binary self-contained across invocation dirs (root Makefile vs release/).
internal/defaults/metadata.mk: ../metadata.mk
	@cp ../metadata.mk $@

bin/release: $(shell find . -name "*.go" -or -name "*.gotmpl") internal/defaults/metadata.mk
	@mkdir -p bin
	@$(DOCKER_RUN) \
		-e CGO_ENABLED=0 \
		$(CALICO_BUILD) \
		sh -c '$(GIT_CONFIG_SSH) go build -o bin/release -v -buildvcs=false -tags with_embed -ldflags "$(LDFLAGS)" ./cmd'

POSTRELEASE_TEST_PACKAGE		:= $(PACKAGE_NAME)/pkg/postrelease
UNIT_TEST_PACKAGES	:= $(shell go list ./... | grep -v $(POSTRELEASE_TEST_PACKAGE))

.PHONY: ut fv st
ifdef TESTS_NO_DOCKER
ut:
	@mkdir -p report
	@gotestsum --junitfile report/unit-tests.xml \
		-- -coverprofile=report/coverage.out $(UNIT_TEST_PACKAGES)
else
ut:
	$(warning Running unit tests inside docker will skip some tests due to missing binaries.)
	$(warning Run the tests without Docker to test this functionality as well.)
	@mkdir -p report
	@$(DOCKER_GO_BUILD) gotestsum --junitfile report/unit-tests.xml \
		-- -coverprofile=report/coverage.out $(UNIT_TEST_PACKAGES)
endif

fv st:
	$(info *** Release tool does not have $@ tests, skipping)
	@true

.PHONY: e2e e2e/hashrelease e2e/release
e2e: e2e/hashrelease e2e/release

e2e/hashrelease: var-require-all-HASHRELEASE_SERVER_BUCKET
	PLAN=true $(MAKE) hashrelease
	LOCAL=true BRANCH_CHECK=false $(MAKE) hashrelease

e2e/release:
	PLAN=true $(MAKE) -C ../ release release-publish

###############################################################################
# Checks
###############################################################################
# bin/release tracks only release/ sources, so rebuild it to pick up the operator's
# component list. Clearing MAKEFLAGS keeps an outer -C's -w directory lines out of
# the parsed image list.
.PHONY: check-operator-images
check-operator-images:
	@$(MAKE) --no-print-directory --always-make bin/release
	@MAKEFLAGS= bin/release images check-operator

###############################################################################
# CI/CD
###############################################################################
.PHONY: ci
ci: static-checks ut

###############################################################################
# Hashrelease
###############################################################################
.PHONY: hashrelease hashrelease-build hashrelease-publish
hashrelease: hashrelease-build hashrelease-publish

# Ensures helm is in the bin dir relative to repo root
../bin/helm:
	@$(MAKE) -C ../ helm

hashrelease-build: bin/release
	@bin/release hashrelease build

hashrelease-publish: bin/release ../bin/helm
	@bin/release hashrelease publish

hashrelease-svr-gc: bin/release
	@bin/release hashrelease garbage-collect

###############################################################################
# Release
###############################################################################
.PHONY: release-notes
release-notes: bin/release var-require-all-GITHUB_TOKEN
	@bin/release release generate-release-notes
