#!/bin/sh
# $NetBSD: report,v 1.8 2008/09/16 18:21:30 joerg Exp $
#
# Copyright (c) 2007 Joerg Sonnenberger <joerg@NetBSD.org>.
# All rights reserved.
#
# This code was developed as part of Google's Summer of Code 2007 program.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in
#    the documentation and/or other materials provided with the
#    distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.

. ${PBULK_CONF:-/opt/tools/etc/pbulk.conf}

set -e

if [ "${config_version}" != "0.68" ]; then
	echo "Your configuration has version ${config_version}."
	echo "This version of pbulk expects version 0.68."
	exit 1
fi

echo "Build reports..."
${report_script} ${loc}
${xz} -zc ${loc}/report > ${loc}/report.xz
${report_html_script} ${loc} ${bulklog}
${report_txt_script} ${loc}

${report_graph_script} ${loc}
if [ -x "${neato}" ] && \
   [ "`grep -- '->' < ${loc}/report.dot | wc -l`" -lt ${report_graph_script_limit} ]; then
	${neato} -Tsvg -Goverlap=ortho -Gsplines=true \
	    -o ${loc}/report.svg ${loc}/report.dot
else
	rm -f ${loc}/report.svg
fi

while read line; do
	case "${line}" in
	BUILD_START_ISO=*)
		build_start_iso=${line#BUILD_START_ISO=}
		;;
	BUILD_START_DIR=*)
		build_start_dir=${line#BUILD_START_DIR=}
		;;
	PLATFORM=*)
		platform=${line#PLATFORM=}
	esac
done < ${loc}/status

if [ -z "${build_start_iso}" ] || [ -z "${build_start_dir}" ]; then
	echo "Could not find start time of build."
	exit 1
fi

cd ${bulklog}
echo "Uploading report..."
{
	echo "meta/report.txt"
	echo "meta/report.html"
	echo "meta/report.dot"
	echo "meta/report.svg"
	echo "meta/report.xz"
	echo "meta/status"
	while read pkg; do
		echo "${pkg}/pre-clean.log"
		echo "${pkg}/depends.log"
		echo "${pkg}/checksum.log"
		echo "${pkg}/configure.log"
		echo "${pkg}/build.log"
		echo "${pkg}/install.log"
		echo "${pkg}/package.log"
		echo "${pkg}/clean.log"
		echo "${pkg}/deinstall.log"
		echo "${pkg}/work.log"
	done < ${loc}/error
} | {
	echo "+ meta/"
	while read pkg; do
		echo "+ ${pkg}/"
	done < ${loc}/error

	while read file; do
		[ -f "$file" ] && echo "+ $file"
	done
	echo "- *"
} | {
	if [ -n "${report_manta_target}" ]; then
		# Variables sourced from pbulk.conf
		export MANTA_USER MANTA_KEY_ID MANTA_URL MANTA_SUBUSER
		PATH=${MANTA_PATH}:${PATH}
		#
		# Use manta-sync if the args have been set.  manta-sync does
		# not (yet) support --exclude-from, so a manual list of -x
		# exclusions needs to be supplied instead of using stdin.
		#
		# Using 'noglob' makes things a lot simpler with expansion and
		# globs in variables.
		#
		# Moving the 'report' file is a hack due to manta-sync not
		# currently having a way to limit excludes, so "-x report" will
		# exclude report.* which is definitely not what we want!
		#
		if [ -n "${MANTA_SYNC_ARGS}" ]; then
			set -o noglob
			mv ${loc}/report ${loc}/report.save
			#
			# Run it a few times to catch any temporarily failures,
			# the client does not yet support retries.
			#
			sync_failed=true
			for retry in 1 2 3 4 5; do
				echo "manta-sync attempt ${retry}..."
				manta-sync ${MANTA_SYNC_ARGS} . ${report_manta_target}/${build_start_dir} || continue
				sync_failed=false
				break
			done
			set +o noglob
			if ${sync_failed}; then
				echo "All sync attempts failed, aborting..."
				exit 1
			fi
		#
		# Otherwise fall back to muntar, using rsync to create a
		# temporary tar to unpack without excluded files.
		#
		else
			# Output directory only needs to not exist or be empty.
			tmpdir="${bulklog}/pbulk-rsync-dir"
			tmptar="${bulklog}/pbulk-rsync.tar"
			rm -rf ${tmpdir} ${tmptar}
			${rsync} -rn --exclude-from=- --out-format='%n' . ${tmpdir} \
			    | grep -v '/$' | /usr/bin/tar -cf ${tmptar} -T -
			muntar -f ${tmptar} ${report_manta_target}/${build_start_dir}
		fi
	else
		${rsync} --exclude-from=- ${report_rsync_args} . ${report_rsync_target}/${build_start_dir}
	fi
}

echo "Sending report mail..."
cat ${loc}/report.txt | ${mail} -s "${report_subject_prefix} ${platform} ${build_start_iso}" ${report_recipients}
