#! /bin/bash
#   pbuilder -- personal Debian package builder
#   Copyright (C) 2001-2005 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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=""
    BUILDUSERID=0
    BUILDUSERNAME=root
fi

export HOME="/tmp/buildd"

showbuildbanner '$Id: pbuilder-buildpackage,v 1.113 2005/06/25 06:27:42 dancer Exp $'
echobacktime
extractbuildplace 
trap umountproc_cleanbuildplace exit
loadhooks

if [ -n "${BUILDRESULT}" ]; then
    echo " -> created buildresult dir :${BUILDRESULT}"
    mkdir -p "${BUILDRESULT}"
fi

if [ -z "${PBUILDER_BUILD_LOGFILE}" ]; then
    if [ "${USE_PKGNAME_LOGFILE}" = "yes" ]; then
	PBUILDER_BUILD_LOGFILE="${BUILDRESULT}/"$(basename "${PACKAGENAME}" .dsc)
	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.113 2005/06/25 06:27:42 dancer Exp $'
	echobacktime
    fi
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 ! $CHROOTEXEC /bin/bash -c "( cd tmp/buildd; chown $BUILDUSERNAME:$BUILDUSERNAME ../buildd *; $SUTOUSER /usr/bin/dpkg-source -x $(basename $PACKAGENAME) )"; then
    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 /bin/bash
) &
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
    if [ -n "${BUILDRESULTUID}" ]; then
	chown "${BUILDRESULTUID}:${BUILDRESULTGID}" "${BUILDPLACE}"/tmp/buildd/*
    fi
    if [ -n "${BUILDRESULTGID}" ]; then
	chgrp "${BUILDRESULTGID}" "${BUILDPLACE}"/tmp/buildd/*
    fi
    cp -p "${BUILDPLACE}"/tmp/buildd/* "${BUILDRESULT}" 2>/dev/null || true
else
    echo "E: BUILDRESULT=[$BUILDRESULT] is not a directory." >&2
fi

echobacktime

