#!/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

# ruby gems to include in puppetserver's jruby environment
JRUBY_GEMS := $(shell cd resources/ext/build-scripts && cat jruby-gem-list.txt mri-gem-list-no-dependencies.txt | cut -d' ' -f1)

# fake home directory for the testsuite
FAKE_HOME := $(shell mktemp -d)

CLASSPATH=/usr/share/java/clojure.jar:/usr/share/java/slingshot.jar:/usr/share/java/snakeyaml.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:/usr/share/java/semver.jar:/usr/share/java/libtrapperkeeper-comidi-metrics-clojure.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:
	# create symlink tree for vendored-jruby-gems
	for gem in $(JRUBY_GEMS); do \
		PUPPETSERVER_GEM_HOME=target/vendored-jruby-gems ./debian/puppetserver_gem_helper.sh $$gem; \
	done
	# 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 facter and puppet gems available to the testsuite
	# upstream uses git submodules here, but we can use Debian sources instead
	for component in 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
	# symlink vendored gems to the test suite's custom gem-home
	# (see test/unit/puppetlabs/services/jruby/jruby_puppet_testutils.clj)
	mkdir -p $(FAKE_HOME)/.puppetlabs/opt/server/data/puppetserver
	ln -s $(CURDIR)/target/vendored-jruby-gems $(FAKE_HOME)/.puppetlabs/opt/server/data/puppetserver/jruby-gems
	# regenerate tls certificates used in https tests
	cd dev-resources/puppetlabs && ( \
		for testdir in puppetserver/ruby/http_client_test puppetserver/certificate_authority_test/master/conf puppetserver/certificate_authority_test/update_crls services/ca/certificate_authority_core_test/update_crls services/certificate_authority/certificate_authority_int_test/ca_true_test/master/conf services/certificate_authority/certificate_authority_int_test/infracrl_test/master/conf; do \
			cp -a $$testdir $${testdir}.clean; \
		done )
	ruby $(CURDIR)/dev-resources/regen_certs.rb
	# run unit and integration tests
	_JAVA_OPTIONS=-Duser.home=$(FAKE_HOME) lein test
endif

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:
	# tighten the binary Depends:
	# due to the ruby gem symlinks, see bug #1029299
	for gem in $(JRUBY_GEMS); do \
		package=$$(ruby -e "require 'gem2deb/package_name_mapping'; @mapping = Gem2Deb::PackageNameMapping.new(false); puts @mapping['$${gem}']") \
		ver=$$(dpkg-query -f '$${source:Upstream-Version}' -W $${package}); \
		ruby_depends="$${ruby_depends}, $${package} (<< $${ver}.), $${package} (>= $${ver}~~)"; \
	done; \
	dh_gencontrol -- -VrubyDepends="$${ruby_depends}"

override_dh_installman:
	cd debian/manpages; \
	for man in *.rst; do \
		rst2man --exit-status=2 --report=1 $${man} "$${man%%.*}".1; \
	done
	dh_installman debian/manpages/*.1

override_dh_clean:
	rm -f debian/maven-repo debian/manpages/*.1
	rm -Rf .lein .lein-failures target
	rm -rf resources/puppetlabs resources/locales.clj
	rm -rf ruby/facter/* ruby/puppet/* ruby/resource_api/*
	# cleanup regenerated certificates
	-cd dev-resources/puppetlabs && ( \
		for testdir in puppetserver/ruby/http_client_test puppetserver/certificate_authority_test/master/conf puppetserver/certificate_authority_test/update_crls services/ca/certificate_authority_core_test/update_crls services/certificate_authority/certificate_authority_int_test/ca_true_test/master/conf services/certificate_authority/certificate_authority_int_test/infracrl_test/master/conf; do \
			test -d $${testdir}.clean && ( rm -rf $$testdir; mv $${testdir}.clean $$testdir ); \
		done )
	dh_clean -Xacceptance
