#!/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"
	source "$(dirname "$BASH_SOURCE")/.detect-daemon-osarch"

	# 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/${PACKAGE_ARCH}/changelog
			echo "* `date -d ${BASH_REMATCH[2]} '+%a %b %d %Y'` ${rpmPackager} - ${BASH_REMATCH[1]}" >> contrib/builder/rpm/${PACKAGE_ARCH}/changelog
		fi
		if [[ "$line" =~ $ENTRY_REGEX ]]; then
			echo "- ${BASH_REMATCH[1]//\`}" >> contrib/builder/rpm/${PACKAGE_ARCH}/changelog
		fi
	done < CHANGELOG.md

	builderDir="contrib/builder/rpm/${PACKAGE_ARCH}"
	pkgs=( $(find "${builderDir}/"*/ -type d) )
	if [ ! -z "$DOCKER_BUILD_PKGS" ]; then
		pkgs=( $(echo ${DOCKER_BUILD_PKGS[@]/#/$builderDir\/}) )
	fi
	for dir in "${pkgs[@]}"; do
		[ -d "$dir" ] || { echo >&2 "skipping nonexistent $dir"; continue; }
		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}
			RUN mkdir -p /go/src/github.com/docker && mkdir -p /go/src/github.com/opencontainers
		EOF

		# get the RUNC and CONTAINERD commit from the root Dockerfile, this keeps the commits in sync
		awk '$1 == "ENV" && $2 == "RUNC_COMMIT" { print; exit }' Dockerfile >> "$DEST/$version/Dockerfile.build"
		awk '$1 == "ENV" && $2 == "CONTAINERD_COMMIT" { print; exit }' Dockerfile >> "$DEST/$version/Dockerfile.build"

		# add runc and containerd compile and install
		cat >> "$DEST/$version/Dockerfile.build" <<-EOF
			# Install runc
			RUN git clone git://github.com/opencontainers/runc.git "/go/src/github.com/opencontainers/runc" \
					&& cd "/go/src/github.com/opencontainers/runc" \
					&& git checkout -q "\$RUNC_COMMIT"
			RUN set -x && export GOPATH="/go" && cd "/go/src/github.com/opencontainers/runc" \
					&& make BUILDTAGS="\$RUNC_BUILDTAGS" && make install
			# Install containerd
			RUN git clone git://github.com/docker/containerd.git "/go/src/github.com/docker/containerd" \
					&& cd "/go/src/github.com/docker/containerd" \
					&& git checkout -q "\$CONTAINERD_COMMIT"
			RUN set -x && export GOPATH="/go" && cd "/go/src/github.com/docker/containerd" && make && make install
		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 -r -C /usr/src -f /root/rpmbuild/SOURCES/${rpmName}.tar ${rpmName}
			RUN tar -r -C /go/src/github.com/docker -f /root/rpmbuild/SOURCES/${rpmName}.tar containerd
			RUN tar -r -C /go/src/github.com/opencontainers -f /root/rpmbuild/SOURCES/${rpmName}.tar runc
			RUN gzip /root/rpmbuild/SOURCES/${rpmName}.tar
			RUN { cat /usr/src/${rpmName}/contrib/builder/rpm/${PACKAGE_ARCH}/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
