# Set DOCKER_REGISTRY to change the docker image registry
DOCKER_REGISTRY := $(if $(DOCKER_REGISTRY),$(DOCKER_REGISTRY),localhost:5000/pingcap)

GOVER_MAJOR := $(shell go version | sed -E -e "s/.*go([0-9]+)[.]([0-9]+).*/\1/")
GOVER_MINOR := $(shell go version | sed -E -e "s/.*go([0-9]+)[.]([0-9]+).*/\2/")
GO111 := $(shell [ $(GOVER_MAJOR) -gt 1 ] || [ $(GOVER_MAJOR) -eq 1 ] && [ $(GOVER_MINOR) -ge 11 ]; echo $$?)
ifeq ($(GO111), 1)
$(error Please upgrade your Go compiler to 1.11 or higher version)
endif

export GO111MODULE=on
GOOS := $(if $(GOOS),$(GOOS),linux)
GOARCH := $(if $(GOARCH),$(GOARCH),amd64)
GOENV  := GO111MODULE=on CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH)
GO     := $(GOENV) go build
GOTEST := CGO_ENABLED=0 GO111MODULE=on go test -v -cover

PACKAGE_LIST := go list ./... | grep -vE "pkg/client" | grep -vE "zz_generated"
FAIL_ON_STDOUT := awk '{ print } END { if (NR > 0) { exit 1 } }'
TEST_COVER_PACKAGES:=go list ./pkg/... | grep -vE "pkg/client" | grep -vE "pkg/tkctl" | grep -vE "pkg/apis" | sed 's|github.com/pingcap/tidb-operator/|./|' | tr '\n' ','
LDFLAGS := -w -s

TEP_PKG := github.com/pingcap/tep/pkg
TEP_LDFLAGS := $(LDFLAGS)
TEP_LDFLAGS += -X "$(TEP_PKG)/version.TEPReleaseVersion=$(shell git describe --tags --dirty)"
TEP_LDFLAGS += -X "$(TEP_PKG)/version.TEPBuildTS=$(shell date -u '+%Y-%m-%d %I:%M:%S')"
TEP_LDFLAGS += -X "$(TEP_PKG)/version.TEPGitHash=$(shell git rev-parse HEAD)"
TEP_LDFLAGS += -X "$(TEP_PKG)/version.TEPGitBranch=$(shell git rev-parse --abbrev-ref HEAD)"

check: check-setup tidy lint golangci-lint

check-setup: tools/bin/revive tools/bin/golangci-lint

tools/bin/revive:
	cd tools/ && make bin/revive

tools/bin/golangci-lint:
	cd tools/ && make bin/golangci-lint

tidy:
	@echo "go mod tidy"
	GO111MODULE=on go mod tidy

lint: 
	@echo "linting"
	tools/bin/revive -formatter friendly -config revive.toml $$($(PACKAGE_LIST))

golangci-lint:
	@echo "golangci-lint"
	GO111MODULE=on tools/bin/golangci-lint run

tep: tep-server tep-apiserver tep-metadata-backup-manager

docker: tep-apiserver-docker tep-server-docker tep-server-push tep-metadata-backup-mangaer-push

tep-apiserver:
	$(GO) -ldflags '$(LDFLAGS)' -a -o images/tep-apiserver/bin/tep-apiserver cmd/tep-apiserver/*.go

tep-apiserver-docker: tep-apiserver
	docker build -t "${DOCKER_REGISTRY}/tep-apiserver:latest" images/tep-apiserver

tep-apiserver-push: tep-apiserver-docker
	docker push "${DOCKER_REGISTRY}/tep-apiserver:latest"

tep-metadata-backup-manager:
	$(GO) -ldflags '$(LDFLAGS)' -a -o images/tep-metadata-backup-manager/bin/tep-metadata-backup-manager cmd/tep-metadata-backup-manager/*.go

tep-metadata-backup-manager-docker: tep-metadata-backup-manager
	docker build -t "${DOCKER_REGISTRY}/tep-metadata-backup-manager:latest" images/tep-metadata-backup-manager

tep-metadata-backup-manager-push: tep-metadata-backup-manager-docker
	docker push "${DOCKER_REGISTRY}/tep-metadata-backup-manager:latest"

setup:
	if [ ! -d "dashboard-ui" ]; then \
		git clone --depth=1 -b tep git@github.com:pingcap/dashboard-ui.git; \
	else \
		cd dashboard-ui && git pull && cd ..; \
	fi
	cd dashboard-ui && npm install && npm run build-tep

tep-server: bin/statik
	@$< -f -src=dashboard-ui/build
	$(GO) -ldflags '$(TEP_LDFLAGS)' -o images/tep-server/bin/tep-server cmd/tep-server/main.go

tep-server-docker: tep-server
	docker build -t "${DOCKER_REGISTRY}/tep-server:latest" images/tep-server

tep-server-push: tep-server-docker
	docker push "${DOCKER_REGISTRY}/tep-server:latest"

bin/statik:
	$(GO) -o $@ github.com/rakyll/statik

clean:
	rm -rf bin images/tep-{server,apiserver,metadata-backup-manager}/bin

.PHONY: tep-apiserver tep-server
