#! /bin/bash
#   pbuilder -- personal Debian package builder
#   Copyright (C) 2001-2006 Junichi Uekawa
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA


export LANG=C
export LC_ALL=C
set -e

. /usr/lib/pbuilder/pbuilder-checkparams
. /usr/lib/pbuilder/pbuilder-runhooks
. /usr/lib/pbuilder/pbuilder-buildpackage-funcs

PACKAGENAME="$1"
if [ ! -f "$PACKAGENAME" ]; then
    echo "Command line parameter [$PACKAGENAME] is not a valid .dsc file name" >&2
    exit 1;
fi;

if [ -n "$BUILDUSERNAME" -a -n "$BUILDUSERID" ]; then
    SUTOUSER="su -p $BUILDUSERNAME"
    DEBBUILDOPTS="$DEBBUILDOPTS -rfakeroot"
    EXTRAPACKAGES="${EXTRAPACKAGES} fakeroot"
    echo "I: using fakeroot in build."
else
    # run the build in root
    SUTOUSER="su -p "
    BUILDUSERID=0
    BUILDUSERNAME=root
fi


# created files should have these UID/GIDs outside of chroot.
BUILDRESULTUID="${BUILDRESULTUID:-${SUDO_UID:-0}}"
BUILDRESULTGID="${BUILDRESULTGID:-${SUDO_GID:-0}}"

export HOME="/tmp/buildd"

showbuildbanner '$Id: pbuilder-buildpackage,v 1.126 2006/06/10 15:09:52 dancer Exp $'
echobacktime
extractbuildplace 
trap umountproc_cleanbuildplace exit
loadhooks

if [ ! -d "${BUILDRESULT}" ]; then
    if [ -n "${BUILDRESULT}" ] ; then
	mkdir -p "${BUILDRESULT}"
    fi
    if [ -d "${BUILDRESULT}" ]; then
	echo " -> created buildresult dir: ${BUILDRESULT}"
    else
	echo "E: failed creating buildresult dir: ${BUILDRESULT}"
	exit 1
    fi
fi

if [ -z "${PBUILDER_BUILD_LOGFILE}" ]; then
    if [ "${USE_PKGNAME_LOGFILE}" = "yes" ]; then
	PBUILDER_BUILD_LOGFILE="${BUILDRESULT}/"$(basename "${PACKAGENAME}" .dsc)"${PKGNAME_LOGFILE_EXTENTION}"
	exec > "${PBUILDER_BUILD_LOGFILE}"
	exec 2>&1
	PBUILDER_BUILD_LOGFILE=$(readlink -f "${PBUILDER_BUILD_LOGFILE}")
	echo "I: Using pkgname logfile"
	showbuildbanner '$Id: pbuilder-buildpackage,v 1.126 2006/06/10 15:09:52 dancer Exp $'
	echobacktime
    fi
fi

# make logfile have the permissions, logfiles should already be created in all cases
if [ -f "${PBUILDER_BUILD_LOGFILE}" ]; then
    chown "${BUILDRESULTUID}:${BUILDRESULTGID}" "${PBUILDER_BUILD_LOGFILE}"
    chgrp "${BUILDRESULTGID}" "${PBUILDER_BUILD_LOGFILE}"
fi


recover_aptcache
echo "Installing the build-deps"
executehooks "D"
trap saveaptcache_umountproc_cleanbuildplace exit
checkbuilddep "$PACKAGENAME"
save_aptcache
trap umountproc_cleanbuildplace exit
createbuilduser

echo "Copying source file"
copydsc "$PACKAGENAME" "$BUILDPLACE/tmp/buildd"

echo "Extracting source"
if echo "chown $BUILDUSERNAME:$BUILDUSERNAME /tmp/buildd /tmp/buildd/*" | $CHROOTEXEC /bin/bash; then
    : # success
else
    echo "pbuilder: Failed chowning to $BUILDUSERNAME:$BUILDUSERNAME" >&2 
    exit 1;
fi
if echo "( cd tmp/buildd; /usr/bin/dpkg-source -x $(basename $PACKAGENAME) )" | $CHROOTEXEC $SUTOUSER ; then
    : # success
else
    echo "pbuilder: Failed extracting the source" >&2 
    exit 1;
fi

echo " -> Building the package"

executehooks "A"

if [ -z "$DEBEMAIL" ]; then
    DPKG_COMMANDLINE="cd tmp/buildd/*/; dpkg-buildpackage -us -uc $DEBBUILDOPTS"
else
    DPKG_COMMANDLINE="cd tmp/buildd/*/; dpkg-buildpackage -us -uc  \"-m$DEBEMAIL\" $DEBBUILDOPTS"
fi

(
    : Build process
    echo  "${DPKG_COMMANDLINE}" | $CHROOTEXEC $SUTOUSER
) &
BUILD_PID=$!
if [ -n "${TIMEOUT_TIME}" ]; then
    ( 
	: Timeout process
	sleep "${TIMEOUT_TIME}"
	echo " -> Terminating build process due to timeout "
	kill ${BUILD_PID} || true
    ) & # timeout process
    KILL_WAIT_PID="kill "$!" || true; echo \"  -> Terminate timeout process\"; "
else
    KILL_WAIT_PID=""
fi

if ! wait ${BUILD_PID}; then
    trap umountproc_cleanbuildplace exit
    eval "${KILL_WAIT_PID}"
    echo "pbuilder: Failed autobuilding of package" >&2
    executehooks "C"
    exit 1;
else
    eval ${KILL_WAIT_PID}
    # build was successful
fi

trap umountproc_cleanbuildplace exit
executehooks "B"
save_aptcache
trap cleanbuildplace exit
umountproc


if [ -d "${BUILDRESULT}" ]; then
    chown "${BUILDRESULTUID}:${BUILDRESULTGID}" "${BUILDPLACE}"/tmp/buildd/*
    chgrp "${BUILDRESULTGID}" "${BUILDPLACE}"/tmp/buildd/*
    cp -p "${BUILDPLACE}"/tmp/buildd/* "${BUILDRESULT}" 2>/dev/null || true
else
    echo "E: BUILDRESULT=[$BUILDRESULT] is not a directory." >&2
fi

echobacktime
