#!/bin/bash
set -e

# subshell so that we can export PATH and TZ without breaking other things
(
	export TZ=UTC # make sure our "date" variables are UTC-based

	source "$(dirname "$BASH_SOURCE")/.integration-daemon-start"

	# TODO consider using frozen images for the dockercore/builder-rpm tags

	rpmName=docker-engine
	rpmVersion="$VERSION"
	rpmRelease=1

	# rpmRelease versioning is as follows
	# Docker 1.7.0:  version=1.7.0, release=1
	# Docker 1.7.0-rc1: version=1.7.0, release=0.1.rc1
	# Docker 1.7.0-cs1: version=1.7.0.cs1, release=1
	# Docker 1.7.0-cs1-rc1: version=1.7.0.cs1, release=0.1.rc1
	# Docker 1.7.0-dev nightly: version=1.7.0, release=0.0.YYYYMMDD.HHMMSS.gitHASH

	# if we have a "-rc*" suffix, set appropriate release
	if [[ "$rpmVersion" =~ .*-rc[0-9]+$ ]] ; then
		rcVersion=${rpmVersion#*-rc}
		rpmVersion=${rpmVersion%-rc*}
		rpmRelease="0.${rcVersion}.rc${rcVersion}"
	fi

	DOCKER_GITCOMMIT=$(git rev-parse --short HEAD)
	if [ -n "$(git status --porcelain --untracked-files=no)" ]; then
		DOCKER_GITCOMMIT="$DOCKER_GITCOMMIT-unsupported"
	fi

	# if we have a "-dev" suffix or have change in Git, let's make this package version more complex so it works better
	if [[ "$rpmVersion" == *-dev ]] || [ -n "$(git status --porcelain)" ]; then
		gitUnix="$(git log -1 --pretty='%at')"
		gitDate="$(date --date "@$gitUnix" +'%Y%m%d.%H%M%S')"
		gitCommit="$(git log -1 --pretty='%h')"
		gitVersion="${gitDate}.git${gitCommit}"
		# gitVersion is now something like '20150128.112847.17e840a'
		rpmVersion="${rpmVersion%-dev}"
		rpmRelease="0.0.$gitVersion"
	fi

	# Replace any other dashes with periods
	rpmVersion="${rpmVersion/-/.}"

	rpmPackager="$(awk -F ': ' '$1 == "Packager" { print $2; exit }' hack/make/.build-rpm/${rpmName}.spec)"
	rpmDate="$(date +'%a %b %d %Y')"

	# if go-md2man is available, pre-generate the man pages
	./man/md2man-all.sh -q || true
	# TODO decide if it's worth getting go-md2man in _each_ builder environment to avoid this

	# Convert the CHANGELOG.md file into RPM changelog format
	VERSION_REGEX="^\W\W (.*) \((.*)\)$"
	ENTRY_REGEX="^[-+*] (.*)$"
	while read -r line || [[ -n "$line" ]]; do
		if [ -z "$line" ]; then continue; fi
		if [[ "$line" =~ $VERSION_REGEX ]]; then
			echo >> contrib/builder/rpm/changelog
			echo "* `date -d ${BASH_REMATCH[2]} '+%a %b %d %Y'` ${rpmPackager} - ${BASH_REMATCH[1]}" >> contrib/builder/rpm/changelog
		fi
		if [[ "$line" =~ $ENTRY_REGEX ]]; then
			echo "- ${BASH_REMATCH[1]//\`}" >> contrib/builder/rpm/changelog
		fi
	done < CHANGELOG.md

	# TODO add a configurable knob for _which_ rpms to build so we don't have to modify the file or build all of them every time we need to test
	for dir in contrib/builder/rpm/*/; do
		version="$(basename "$dir")"
		suite="${version##*-}"

		image="dockercore/builder-rpm:$version"
		if ! docker inspect "$image" &> /dev/null; then
			( set -x && docker build ${DOCKER_BUILD_ARGS} -t "$image" "$dir" )
		fi

		mkdir -p "$DEST/$version"
		cat > "$DEST/$version/Dockerfile.build" <<-EOF
			FROM $image
			COPY . /usr/src/${rpmName}
		EOF
		if [ "$DOCKER_EXPERIMENTAL" ]; then
			echo 'ENV DOCKER_EXPERIMENTAL 1' >> "$DEST/$version/Dockerfile.build"
		fi
		cat >> "$DEST/$version/Dockerfile.build" <<-EOF
			RUN mkdir -p /root/rpmbuild/SOURCES \
				&& echo '%_topdir /root/rpmbuild' > /root/.rpmmacros
			WORKDIR /root/rpmbuild
			RUN ln -sfv /usr/src/${rpmName}/hack/make/.build-rpm SPECS
			WORKDIR /root/rpmbuild/SPECS
			RUN tar -cz -C /usr/src -f /root/rpmbuild/SOURCES/${rpmName}.tar.gz ${rpmName}
			RUN { cat /usr/src/${rpmName}/contrib/builder/rpm/changelog; } >> ${rpmName}.spec && tail >&2 ${rpmName}.spec
			RUN rpmbuild -ba \
				--define '_gitcommit $DOCKER_GITCOMMIT' \
				--define '_release $rpmRelease' \
				--define '_version $rpmVersion' \
				--define '_origversion $VERSION' \
				--define '_experimental ${DOCKER_EXPERIMENTAL:-0}' \
				${rpmName}.spec
		EOF
		# selinux policy referencing systemd things won't work on non-systemd versions
		# of centos or rhel, which we don't support anyways
		if [ "${suite%.*}" -gt 6 ] && [[ "$version" != opensuse* ]]; then
			cat >> "$DEST/$version/Dockerfile.build" <<-EOF
				RUN tar -cz -C /usr/src/${rpmName}/contrib -f /root/rpmbuild/SOURCES/${rpmName}-selinux.tar.gz ${rpmName}-selinux
				RUN rpmbuild -ba \
						--define '_gitcommit $DOCKER_GITCOMMIT' \
						--define '_release $rpmRelease' \
						--define '_version $rpmVersion' \
						--define '_origversion $VERSION' \
						${rpmName}-selinux.spec
			EOF
		fi
		tempImage="docker-temp/build-rpm:$version"
		( set -x && docker build -t "$tempImage" -f $DEST/$version/Dockerfile.build . )
		docker run --rm "$tempImage" bash -c 'cd /root/rpmbuild && tar -c *RPMS' | tar -xvC "$DEST/$version"
		docker rmi "$tempImage"
	done

	source "$(dirname "$BASH_SOURCE")/.integration-daemon-stop"
) 2>&1 | tee -a $DEST/test.log
