PACKAGE_NAME = cockpit-image-builder
INSTALL_DIR_BASE = /share/cockpit/
INSTALL_DIR = $(INSTALL_DIR_BASE)$(PACKAGE_NAME)
APPSTREAMFILE=org.image-builder.$(PACKAGE_NAME).metainfo.xml

VERSION := $(shell (cd "$(SRCDIR)" && grep "^Version:" cockpit/$(PACKAGE_NAME).spec | sed 's/[^[:digit:]]*\([[:digit:]]\+\).*/\1/'))
COMMIT = $(shell (cd "$(SRCDIR)" && git rev-parse HEAD))

# TODO: figure out a strategy for keeping this updated
COCKPIT_REPO_COMMIT = a70142a7a6f9c4e78e71f3c4ec738b6db2fbb04f
COCKPIT_REPO_URL = https://github.com/cockpit-project/cockpit.git
COCKPIT_REPO_TREE = '$(strip $(COCKPIT_REPO_COMMIT))^{tree}'

# checkout common files from Cockpit repository required to build this project;
# this has no API stability guarantee, so check out a stable tag when you start
# a new project, use the latest release, and update it from time to time
COCKPIT_REPO_FILES = \
	pkg/lib \
	$(NULL)

help:
	@cat Makefile

#
# Install target for specfile
#

.PHONY: install
install:
	$(MAKE) cockpit/install

#
# Cockpit related targets
#

.PHONY: cockpit/clean
cockpit/clean:
	rm -f cockpit/public/*.css
	rm -f cockpit/public/*.js

.PHONY: cockpit/install
cockpit/install:
	mkdir -p $(DESTDIR)$(PREFIX)$(INSTALL_DIR)
	cp -a cockpit/public/* $(DESTDIR)$(PREFIX)$(INSTALL_DIR)
	mkdir -p $(DESTDIR)$(PREFIX)/share/metainfo
	msgfmt --xml -d po \
		--template cockpit/public/$(APPSTREAMFILE) \
		-o $(DESTDIR)$(PREFIX)/share/metainfo/$(APPSTREAMFILE)

.PHONY: cockpit/devel-uninstall
cockpit/devel-uninstall: PREFIX=~/.local
cockpit/devel-uninstall:
	rm -rf $(PREFIX)$(INSTALL_DIR)

.PHONY: cockpit/devel-install
cockpit/devel-install: PREFIX=~/.local
cockpit/devel-install:
	PREFIX="~/.local"
	mkdir -p $(PREFIX)$(INSTALL_DIR_BASE)
	ln -s $(shell pwd)/cockpit/public $(PREFIX)$(INSTALL_DIR)

.PHONY: cockpit/download
cockpit/download: Makefile
	@git rev-list --quiet --objects $(COCKPIT_REPO_TREE) -- 2>/dev/null || \
	    git fetch --no-tags --no-write-fetch-head --depth=1 $(COCKPIT_REPO_URL) $(COCKPIT_REPO_COMMIT)
	git archive $(COCKPIT_REPO_TREE) -- $(COCKPIT_REPO_FILES) | tar x

.PHONY: cockpit/build
cockpit/build: cockpit/download
	npm run build:cockpit

.PHONY: cockpit/devel
cockpit/devel: cockpit/devel-uninstall cockpit/build cockpit/devel-install

#
# Building packages
#

RPM_SPEC=cockpit/$(PACKAGE_NAME).spec
NODE_MODULES_TEST=package-lock.json
TARFILE=$(PACKAGE_NAME)-$(VERSION).tar.gz

$(RPM_SPEC): $(RPM_SPEC) $(NODE_MODULES_TEST)
	provides=$$(npm ls --omit dev --package-lock-only --depth=Infinity | grep -Eo '[^[:space:]]+@[^[:space:]]+' | sort -u | sed 's/^/Provides: bundled(npm(/; s/\(.*\)@/\1)) = /'); \
	awk -v p="$$provides" '{gsub(/%{VERSION}/, "$(VERSION)"); $(SUB_NODE_ENV) gsub(/%{NPM_PROVIDES}/, p)}1' $< > $@

$(TARFILE): export NODE_ENV ?= production
$(TARFILE): cockpit/build
	touch -r package.json package-lock.json
	touch cockpit/public/*
	tar czf $(TARFILE) --transform 's,^,$(PACKAGE_NAME)/,' \
		--exclude node_modules \
		$$(git ls-files) $(RPM_SPEC) $(NODE_MODULES_TEST) cockpit/public/ cockpit/README.md
	realpath $(TARFILE)

dist: $(TARFILE)
	@ls -1 $(TARFILE)

.PHONY: srpm
srpm: $(TARFILE)
	rpmbuild -bs \
		--define "_sourcedir `pwd`" \
		--define "_topdir $(CURDIR)/rpmbuild" \
		$(RPM_SPEC)

.PHONY: rpm
rpm: $(TARFILE)
	rpmbuild -bb \
		--define "_sourcedir `pwd`" \
		--define "_topdir $(CURDIR)/rpmbuild" \
		$(RPM_SPEC)
