#!/usr/bin/make -f

include /usr/share/dpkg/pkg-info.mk
include /usr/share/javahelper/java-vars.mk

export LEIN_HOME=$(CURDIR)/.lein
export LEIN_OFFLINE=true
NAME=puppetserver

DEBIAN_GEMS=deep_merge fast_gettext hocon gettext locale puppetserver-ca text semantic_puppet

CLASSPATH=/usr/share/java/clojure.jar:/usr/share/java/slingshot.jar:/usr/share/java/clj-yaml.jar:/usr/share/java/snakeyaml-1.x.jar:/usr/share/java/commons-lang.jar:/usr/share/java/commons-io.jar:/usr/share/java/clj-time.jar:/usr/share/java/clj-semver.jar:/usr/share/java/schema.jar:/usr/share/java/fs.jar:/usr/share/java/liberator.jar:/usr/share/java/commons-exec.jar:/usr/share/java/metrics-core.jar:/usr/share/java/jruby-utils.jar:/usr/share/java/clj-shell-utils.jar:/usr/share/java/trapperkeeper.jar:/usr/share/java/trapperkeeper-status.jar:/usr/share/java/trapperkeeper-scheduler.jar:/usr/share/java/trapperkeeper-webserver-jetty9.jar:/usr/share/java/trapperkeeper-authorization.jar:/usr/share/java/trapperkeeper-comidi-metrics.jar:/usr/share/java/trapperkeeper-metrics.jar:/usr/share/java/trapperkeeper-filesystem-watcher.jar:/usr/share/java/kitchensink.jar:/usr/share/java/ssl-utils.jar:/usr/share/java/ring-middleware.jar:/usr/share/java/dujour-version-check.jar:/usr/share/java/http-client.jar:/usr/share/java/comidi.jar:/usr/share/java/i18n.jar

%:
	dh $@ --with javahelper

override_dh_auto_configure:
	cd debian && ln -sf /usr/share/maven-repo .

override_dh_auto_build:
	# main build
	lein i18n make
	lein jar

execute_after_dh_auto_build:
	# bundle gems shipped as component tarballs
	mkdir -p target/vendored-jruby-gems
	cp -a rubygem-*/gems target/vendored-jruby-gems
	cp -a rubygem-*/specifications target/vendored-jruby-gems
	# create symlink tree for vendored-jruby-gems
	mkdir -p target/vendored-jruby-gems/gems
	mkdir -p target/vendored-jruby-gems/specifications
	$(foreach gem_name,$(DEBIAN_GEMS), \
		set -e; \
		gem=$(shell ls -1 /usr/share/rubygems-integration/all/specifications | grep -Po "^$(gem_name)-[0-9\.]+(?=\.gemspec)"); \
		ln -s /usr/share/rubygems-integration/all/specifications/$${gem}.gemspec target/vendored-jruby-gems/specifications; \
		if [ -e  /usr/share/rubygems-integration/all/gems/$${gem} ]; then \
			ln -s /usr/share/rubygems-integration/all/gems/$${gem} target/vendored-jruby-gems/gems; \
		else \
			mkdir -p target/vendored-jruby-gems/gems/$${gem}/lib; \
			cp -as /usr/lib/ruby/vendor_ruby/$(gem_name)*.rb target/vendored-jruby-gems/gems/$${gem}/lib; \
			ln -s /usr/lib/ruby/vendor_ruby/$(gem_name) target/vendored-jruby-gems/gems/$${gem}/lib; \
		fi; \
	)
	# prepare main binary
	mkdir -p target/bin
	sed -e 's/%DEB_VERSION_UPSTREAM%/$(DEB_VERSION_UPSTREAM)/' < debian/bin/puppetserver.in > target/bin/puppetserver
	# prepare cli subcommands defaults script
	# inject the jar classpath into cli-defaults.sh
	mkdir -p target/cli
	sed -e "s#%CLASSPATH%#$(CLASSPATH)#" < debian/bin/cli-defaults.sh.in > target/cli/cli-defaults.sh
	# prepare cli subcommands
	mkdir -p target/cli/apps
	cp debian/bin/cli/* target/cli/apps
	cp resources/ext/cli/* target/cli/apps
	find target/cli -name \*.erb | xargs sed -i \
		-e 's/<%= EZBake::Config\[:uberjar_name\] %>/puppetserver.jar/' \
		-e '1s|^#!/opt/puppetlabs/puppet/bin/ruby|#!/usr/bin/ruby|' \
		-e '1s|^#!/usr/bin/env bash|#!/bin/bash|'
	rename --filename -e 's/\.erb$$//' target/cli/**/*
	chmod +x target/cli/**/*
	# dropsonde unsupported
	@rm -f target/cli/apps/dropsonde

override_dh_auto_test:
ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS)))
	# make hiera, facter and puppet gems available to the testsuite
	# upstream uses git submodules here, but we can use Debian sources instead
	for component in hiera facter puppet resource_api; do \
		mkdir -p ruby/$${component}/lib; \
		if [ "$$component" = "puppet" ]; then package=puppet-agent ; \
		elif [ "$$component" = "resource_api" ]; then package=ruby-puppet-resource-api ; \
		else package=$$component; fi; \
		dpkg -L $$package | grep -Po "^/usr/lib/ruby/vendor_ruby/\K.*" | \
			while read file; do \
				if [ -d /usr/lib/ruby/vendor_ruby/$$file ]; then \
					mkdir -p ruby/$${component}/lib/$$file; \
				else \
					ln -sf /usr/lib/ruby/vendor_ruby/$$file ruby/$${component}/lib/$$file; \
				fi; \
			done; \
	done
	# testsuite looks for gems in this directory
	cd target && ln -sf vendored-jruby-gems jruby-gem-home
	# run unit and integration tests
	PUPPETSERVER_HEAP_SIZE=6G lein test
endif

execute_before_dh_install:
	# cleanup vendored jruby gems
	@rm -rf target/vendored-jruby-gems/cache/*
	@rm -rf target/vendored-jruby-gems/gems/*/ext
	@rm -rf target/vendored-jruby-gems/gems/*/test
	@rm -rf target/vendored-jruby-gems/gems/*/samples
	@rm -rf target/vendored-jruby-gems/gems/*/spec

execute_before_dh_link:
	# create unversioned jar symlinks
	dh_link usr/share/puppetserver/puppetserver-$(DEB_VERSION_UPSTREAM).jar usr/share/puppetserver/puppetserver.jar
	# create private vendor_ruby directory for puppetserver's jruby
	mkdir -p debian/puppetserver/usr/lib/puppetserver/ruby/vendor_ruby
	for component in hiera facter puppet; do \
		ln -s /usr/lib/ruby/vendor_ruby/$$component debian/puppetserver/usr/lib/puppetserver/ruby/vendor_ruby/$$component; \
		ln -s /usr/lib/ruby/vendor_ruby/$${component}*.rb debian/puppetserver/usr/lib/puppetserver/ruby/vendor_ruby; \
	done

override_dh_installsystemd:
	dh_installsystemd --no-enable

override_dh_fixperms:
	# cli scripts need to have execute permission
	dh_fixperms -Xusr/share/puppetserver/cli

override_jh_manifest:
	jh_manifest -c "$(subst :, ,$(CLASSPATH))" -m puppetlabs.trapperkeeper.main usr/share/puppetserver/puppetserver-$(DEB_VERSION_UPSTREAM).jar

override_dh_gencontrol:
	# needed to tighten the binary Depends:
	# due to the ruby gem symlinks, see bug #1029299
	dh_gencontrol -- \
	   -Vlibclojure-java:Upstream-Version=$(shell dpkg-query -f '$${source:Upstream-Version}' -W libclojure-java) \
	   -Vruby-deep-merge:Upstream-Version=$(shell dpkg-query -f '$${source:Upstream-Version}' -W ruby-deep-merge) \
	   -Vruby-fast-gettext:Upstream-Version=$(shell dpkg-query -f '$${source:Upstream-Version}' -W ruby-fast-gettext) \
	   -Vruby-gettext:Upstream-Version=$(shell dpkg-query -f '$${source:Upstream-Version}' -W ruby-gettext) \
	   -Vruby-hocon:Upstream-Version=$(shell dpkg-query -f '$${source:Upstream-Version}' -W ruby-hocon) \
	   -Vruby-locale:Upstream-Version=$(shell dpkg-query -f '$${source:Upstream-Version}' -W ruby-locale) \
	   -Vruby-puppetserver-ca-cli:Upstream-Version=$(shell dpkg-query -f '$${source:Upstream-Version}' -W ruby-puppetserver-ca-cli) \
	   -Vruby-semantic-puppet:Upstream-Version=$(shell dpkg-query -f '$${source:Upstream-Version}' -W ruby-semantic-puppet) \
	   -Vruby-text:Upstream-Version=$(shell dpkg-query -f '$${source:Upstream-Version}' -W ruby-text)

override_dh_clean:
	rm -f debian/maven-repo
	rm -Rf target ruby
	dh_clean -Xacceptance

override_dh_strip_nondeterminism:
	# skip processing the main jar
	# it causes syntax errors at runtime
	# needs investigation
	dh_strip_nondeterminism -Xusr/share/puppetserver/puppetserver-$(DEB_VERSION_UPSTREAM).jar
