
define HELPTEXT
make build      # build Docker images
  REDIS_VER=ver   # use Redis version `ver`
  TEST=1          # test aftar build
  PACK=1          # create packages
  ARTIFACTS=1     # copy artifacts from docker image

make publish        # push Docker image to Dockerhub
  OFFICIAL=0|1        # whether to publish to official (redislabs/*) repos
  PUSH_GENERAL=0|1    # whether to publish non-official version
  PUSH_LATEST=0|1     # whether to publish 'latest' version
  PUSH_EDGE=0|1       # whether to publish 'edge' version

make clean     # remove docker images

make show      # display registry information from Docker repo

Common arguments:
  OSNICK=nick        # nick=buster|stretch|bionic|centos7
  INT_BRNACHES=list  # list of intergration branch names
  VERSION=ver        # build and publish specified version
  BRANCH=name        # build and publish from specified branch
endef

#----------------------------------------------------------------------------------------------

.NOTPARALLEL:

MK.nobindir=1

MK_ALL_TARGETS ?= build publish clean
MK_CUSTOM_BUILD=1
MK_CUSTOM_CLEAN=1

#----------------------------------------------------------------------------------------------

ifneq ($(HELP),1)
ifeq ($(REPO),)
$(error REPO is undefined. Aborting.)
endif
endif

OFFICIAL ?= 1

ifeq ($(VARIANT),)
_VARIANT=
else
_VARIANT=-$(VARIANT)
endif

#----------------------------------------------------------------------------------------------

BUILD_OPT += --rm --no-cache
ifneq ($(PULL),0)
BUILD_OPT += --pull
endif

# --squash

DOCKERFILE_STEM ?= $(ROOT)/Dockerfile

#----------------------------------------------------------------------------------------------

REDIS_VER ?= 6.2.1

PACK ?= 0
TEST ?= 0

ifeq ($(ARTIFACTS),1)
PACK:=1
endif

#----------------------------------------------------------------------------------------------

OSNICK ?= debian

ifeq ($(OS.custom),)

OS.centos7=centos:7
OS.centos7.8=centos:7.8.2003
OS.centos8=centos:8
OS.centos8.3=centos:8.2011
OS.fedora=fedora:latest
OS.fedora33=fedora:33
OS.hirsute=ubuntu:hirsute
OS.focal=ubuntu:focal
OS.bionic=ubuntu:bionic
OS.xenial=ubuntu:xenial
OS.trusty=ubuntu:trusty
OS.bullseye=debian:bullseye
OS.buster=debian:buster
OS.stretch=debian:stretch
OS.leap=opensuse/leap:latest
OS.leap15.2=opensuse/leap:15.2
OS.leap15.3=opensuse/leap:15.3
OS.tumbleweed=opensuse/tumbleweed
OS.archlinux=archlinux:latest
OS.ol8=oraclelinux:8
OS.alma8=almalinux:8
OS.rocky8=rockylinux:8
OS.jammy=ubuntu:jammy

endif # OS

OS=$(OS.$(OSNICK))
ifneq ($(HELP),1)
ifeq ($(OS),)
$(error Invalid OSNICK. Aborting.)
endif
endif

#----------------------------------------------------------------------------------------------

MACH:=$(shell uname -m)
CPUSET:=0-$(shell /bin/bash -c "echo $$((`nproc`-1))")

#----------------------------------------------------------------------------------------------

override BRANCH:=$(shell X="$(BRANCH)"; echo $${X//[^A-Za-z0-9._-]/_})
override VERSION:=$(shell X="$(VERSION)"; echo $${X//[^A-Za-z0-9._-]/_})

ifeq ($(findstring master,$(INT_BRANCHES)),)
INT_BRANCHES += master
endif
LATEST_BRANCH=$(firstword $(INT_BRANCHES))

ifneq ($(VERSION),)
D_VERSION=$(VERSION)
LATEST_VERSION:=$(shell git name-rev --name-only HEAD | cut -f2 -d/ | cut -f1 -d^ | grep '^v' | sed -e 's/^v\(.*\)/\1/g')
ifneq ($(findstring $(VERSION),$(LATEST_VERSION)),)
PUSH_LATEST=1
endif

else ifneq ($(BRANCH),)
D_VERSION=$(BRANCH)

else

# when no version is defined, attempt to use the tag
TAG_NAME:=$(shell git describe --exact-match --tags $$(git log -n1 --pretty='%h') 2> /dev/null | cut -d 'v' -f 2-2)
ifneq ($(TAG_NAME),)
D_VERSION=$(TAG_NAME)
else
override BRANCH=$(GIT_BRANCH)
D_VERSION=$(BRANCH)
endif

endif

ifneq ($(findstring $(BRANCH),$(INT_BRANCHES)),)
PUSH_GENERAL=1
endif

ifneq ($(OFFICIAL),0)

ifeq ($(BRANCH),master)
PUSH_EDGE=1
endif

endif # OFFICIAL

D_VERSION:=$(shell X="$(D_VERSION)"; echo $${X//[^A-Za-z0-9._-]/_})

ifeq ($(VERBOSE),1)
$(info REPO=$(REPO))
$(info VERSION=$(VERSION))
$(info LATEST_VERSION=$(LATEST_VERSION))
$(info BRANCH=$(BRANCH))
$(info GIT_BRANCH=$(GIT_BRANCH))
$(info TAG_NAME=$(TAG_NAME))
$(info LATEST_BRANCH=$(LATEST_BRANCH))
$(info INT_BRANCHES=$(INT_BRANCHES))
$(info OFFICIAL=$(OFFICIAL))
$(info PUSH_GENERAL=$(PUSH_GENERAL))
$(info PUSH_EDGE=$(PUSH_EDGE))
$(info PUSH_LATEST=$(PUSH_LATEST))
$(info D_VERSION=$(D_VERSION))
endif

#----------------------------------------------------------------------------------------------

ORG ?= redisfab
OFFICIAL_ORG ?= redislabs

D_NAME=$(ORG)/$(REPO):$(D_VERSION)$(_VARIANT)-$(ARCH)-$(OSNICK)
D_LATEST_NAME=$(ORG)/$(REPO):latest$(_VARIANT)-$(ARCH)-$(OSNICK)
D_EDGE_NAME=$(ORG)/$(REPO):master$(_VARIANT)-$(ARCH)-$(OSNICK)

D_OFFICIAL_NAME=$(OFFICIAL_ORG)/$(REPO):$(D_VERSION)$(_VARIANT)
D_OFFICIAL_LATEST_NAME=$(OFFICIAL_ORG)/$(REPO):latest$(_VARIANT)
D_OFFICIAL_EDGE_NAME=$(OFFICIAL_ORG)/$(REPO):edge$(_VARIANT)

#----------------------------------------------------------------------------------------------

DOCKER_BUILD_ARGS += \
	VERSION=$(D_VERSION) \
	OSNICK=$(OSNICK) \
	OS=$(OS) \
	ARCH=$(ARCH) \
	MACH=$(MACH) \
	REDIS_VER=$(REDIS_VER) \
	TEST=$(TEST) \
	PACK=$(PACK)

#----------------------------------------------------------------------------------------------

ifeq ($(ARTIFACTS),1)
ifeq ($(ART_DIR),)
$(error ART_DIR is not defined.)
endif
export ART_DIR
ifeq ($(ART_INT_DIR),)
$(error ART_INT_DIR is not defined.)
endif
export ART_INT_DIR
endif

#----------------------------------------------------------------------------------------------

DEFAULT_TARGETS += all

include $(MK)/defs

#----------------------------------------------------------------------------------------------

include $(MK)/rules

#----------------------------------------------------------------------------------------------

# docker build cpuset arg: --cpuset-cpus $(CPUSET)

build:
	$(SHOW)time docker build $(BUILD_OPT) -t $(D_NAME) -f $(DOCKERFILE_STEM) \
		$(foreach A,$(DOCKER_BUILD_ARGS),--build-arg $(A)) \
		$(ROOT)
ifeq ($(ARTIFACTS),1)
	$(SHOW)IMAGE=$(D_NAME) $(MK)/docker-collect-artifacts
endif
ifeq ($(PUSH_LATEST),1)
	$(SHOW)docker tag $(D_NAME) $(D_LATEST_NAME)
endif
ifneq ($(OFFICIAL),0)
ifeq ($(PUSH_LATEST),1)
	$(SHOW)docker tag $(D_NAME) $(D_OFFICIAL_LATEST_NAME)
endif
ifeq ($(PUSH_EDGE),1)
	$(SHOW)docker tag $(D_NAME) $(D_OFFICIAL_EDGE_NAME)
endif
endif # OFFICIAL

.PHONY: build_docker

#----------------------------------------------------------------------------------------------

publish:
ifeq ($(PUSH_GENERAL),1)
	$(SHOW)docker push $(D_NAME)
endif
ifeq ($(PUSH_LATEST),1)
	$(SHOW)docker push $(D_LATEST_NAME)
endif
ifneq ($(OFFICIAL),0)
ifeq ($(PUSH_LATEST),1)
	$(SHOW)docker push $(D_OFFICIAL_LATEST_NAME)
endif
ifeq ($(PUSH_EDGE),1)
	$(SHOW)docker push $(D_OFFICIAL_EDGE_NAME)
endif
endif # OFFICIAL
	@true

.PHONY: publish

#----------------------------------------------------------------------------------------------

clean:
	$(SHOW)docker rmi -f $(D_NAME)

.PHONY: clean

#----------------------------------------------------------------------------------------------

show:
	@echo "$(ORG)/$(REPO):"
	$(SHOW)curl -s -X "GET" https://cloud.docker.com/v2/repositories/$(ORG)/$(REPO)/tags/ | jq
ifneq ($(OFFICIAL),0)
	@echo "$(OFFICIAL_ORG)/$(REPO):"
	$(SHOW)curl -s -X "GET" https://cloud.docker.com/v2/repositories/$(OFFICIAL_ORG)/$(REPO)/tags/ | jq
endif

.PHONY: show
