#! /bin/sh
#
# This scripts builds world/kernel and installs it on the list of
# diretories specified in pathlist
#
# version 0.1
#
pathlist="/ /build5/jails/grokjail"
srcdir="/usr/src"

generate_rev()
{
	${srcdir}/tools/gitrev.sh > /tmp/.upgrade_all_rev
}

needs_build()
{
	local _t1
	local _t2

	if [ ! -f /tmp/.upgrade_all_rev ]; then
		return 0	# Needs build
	fi

	${srcdir}/tools/gitrev.sh > /tmp/.tmprev

	_t1=$(cat /tmp/.tmprev)
	_t2=$(cat /tmp/.upgrade_all_rev)

	if [ "${_t1}" != "${_t2}" ]; then
		return 0	# Needs rebuild
	else
		return 1	# Does not need to rebuild
	fi
}

build_target()
{
	local _target=$1

	if ! needs_build; then
		echo ${_target} build up to date.
	else
		echo --------------------------------------------------------
		echo Started ${_target} at $(date)
		echo --------------------------------------------------------
		{ cd ${srcdir} && make -j16 build${_target} > /tmp/b_${_target}.log 2>&1; } || \
			{ echo "build${_target} failed" && exit 1; }
		echo --------------------------------------------------------
		echo Finished ${_target} at $(date)
		echo --------------------------------------------------------
		echo
	fi
}

install_target()
{
	local _target=$1
	local _destdir=$2

	case ${_target} in
	world|kernel)
		;;
	*)
		echo Bad target ${_target}
		exit 1
		;;
	esac

	[ ! -z "${_destdir}" -a "${_destdir}" != "/" ] && export DESTDIR=${_destdir}

	echo '  -> Installing' ${_target}
	{ cd ${srcdir} && make install${_target} \
		>/tmp/install${_target}_$(basename "${DESTDIR}").log 2>&1; } || \
		{ echo "install${_target} failed for ${_destdir}" && exit 1; }

	[ ! -z "${DESTDIR}" ] && unset DESTDIR
}

do_makeupgrade()
{
	local _destdir=$1

	[ ! -z "${_destdir}" -a "${_destdir}" != "/" ] && export DESTDIR=${_destdir}

	echo '  -> make upgrade'
	{ make upgrade >/tmp/up_$(basename "${DESTDIR}").log 2>&1; } || \
		{ echo "make upgrade failed for ${_destdir}" && exit 1; }

	[ ! -z "${DESTDIR}" ] && unset DESTDIR

}

update_packages()
{
	local _destdir=$1

	# Do not update packages automatically for /
	if [ "${_destdir}" != "/" ]; then
    		echo '  -> Updating packages'
		{ chroot ${_destdir} /usr/local/sbin/pkg update -f && \
			chroot ${_destdir} /usr/local/sbin/pkg upgrade -y; } \
			> /tmp/pkg_$(basename ${_destdir}) 2>&1 || \
			{ echo "pkg upgrade failed for ${_destdir}" && exit 1; }
	fi

}
update_src()
{
	{ cd ${srcdir} && git pull >/tmp/up_pull.log 2>&1; } || \
		{ echo "Failed to git pull ${srcdir}" && exit 1; }
}

# -------------------------------
update_src
build_target world
build_target kernel

for d in ${pathlist}
do
	echo Updating ${d}
	install_target kernel  ${d}
	install_target world ${d}
	do_makeupgrade ${d}
	update_packages ${d}
done

# Once everything is successful, generate the current git revision
generate_rev
