# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

# What is the prerelease version?
vsn_pre = $(shell git describe --tags --always --first-parent \
        | grep -Eo -- '(-rc\.[0-9]+)?$$' \
        2>/dev/null)

# What is the release version?
vsn_rel = $(shell git describe --tags --always --first-parent \
        | grep -Eo -- '^v[0-9]+\.[0-9]\.[0-9]+' \
        | tail -c +2 \
        2>/dev/null)

# Is this a tagged release?
vsn_tag = $(shell git describe --tags --always --first-parent \
        | grep -Eo -- '^v[0-9]+\.[0-9]\.[0-9]+(-rc.[0-9]+)?$$' \
        | tail -c +2 \
        2>/dev/null)

annotator_vsn = $(vsn_rel)

.PHONY: all
all: build

.PHONY: build
build:
	@yarn

.PHONY: clean
clean:
	@yarn run clean

.PHONY: check
check: lint test

.PHONY: lint
lint: build
	@yarn lint

.PHONY: test
test: build
	@yarn test

ifeq ($(vsn_tag),)

.PHONY: dist
dist:
	$(error No tag found for release)

else

.PHONY: dist
dist:
	@rm -rf apache-annotator-$(annotator_vsn)-incubating
	@git clone \
        --config advice.detachedHead=false \
        --config versionsort.suffix=-rc \
        --depth 1 \
        --quiet \
        file://"$(shell git rev-parse --show-toplevel)" \
        apache-annotator-$(annotator_vsn)-incubating
	@git --git-dir apache-annotator-$(annotator_vsn)-incubating/.git config \
        remote.origin.url https://github.com/apache/incubator-annotator.git
	@tar czf \
        apache-annotator-$(annotator_vsn)$(vsn_pre)-incubating.tar.gz \
        apache-annotator-$(annotator_vsn)-incubating
	@echo "Done: apache-annotator-$(annotator_vsn)$(vsn_pre)-incubating.tar.gz"

endif

.PHONY: distcheck
distcheck: dist
	@tar xzf apache-annotator-$(annotator_vsn)$(vsn_pre)-incubating.tar.gz
	@make -C apache-annotator-$(annotator_vsn)-incubating check

.PHONY: distsign
distsign: dist
	@gpg -ab apache-annotator-$(annotator_vsn)$(vsn_pre)-incubating.tar.gz
	@sha256sum apache-annotator-$(annotator_vsn)$(vsn_pre)-incubating.tar.gz \
        > apache-annotator-$(annotator_vsn)$(vsn_pre)-incubating.tar.gz.sha256
	@sha512sum apache-annotator-$(annotator_vsn)$(vsn_pre)-incubating.tar.gz \
        > apache-annotator-$(annotator_vsn)$(vsn_pre)-incubating.tar.gz.sha512
