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

# used to generate dependencies on the upstream versions of these packages
RUBY_PACKAGES=ruby-deep-merge ruby-fast-gettext ruby-gettext ruby-hocon ruby-locale ruby-puppetserver-ca-cli ruby-semantic-puppet ruby-text

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:/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:
	# 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
	for dep in $(RUBY_PACKAGES); do \
		ver=$$(dpkg-query -f '$${source:Upstream-Version}' -W $${dep}); \
		ruby_depends="$${ruby_depends}, $${dep} (<< $${ver}.), $${dep} (>= $${ver}~~)"; \
	done; \
	dh_gencontrol -- -VrubyDepends="$${ruby_depends}" -VclojureAotDepends="$${aot_depends}"

override_dh_installman:
	mkdir debian/tmp/man
	for manpage_path in debian/manpages/*.rst; do \
		manpage=$$(basename $$manpage_path); \
		rst2man --exit-status=2 --report=1 $${manpage_path} "debian/tmp/man/$${manpage%%.*}".1; \
	done
	dh_installman debian/tmp/man/*.1

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