#! /bin/bash
#   pbuilder -- personal Debian package builder
#   Copyright (C) 2001,2002 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

function copydsc () {
    local DSCFILE="$1"
    local TARGET="$2"
    for FILE in \
      "$DSCFILE" \
	$(cat "$DSCFILE" | \
	awk 'BEGIN{p=0} /^$/ {p=0} {if (p){print "'$(dirname "$DSCFILE")'/" $3}} /^Files:/{p=1}' ) ; do
	echo "    -> copying [$FILE]"
        cp "$FILE" "$TARGET" ;
    done
}

function checkbuilddep () {
    if ! /usr/lib/pbuilder/pbuilder-satisfydepends --control "$BUILDPLACE/"tmp/buildd/*/debian/control --chroot "$BUILDPLACE" --binary-all ; then
	echo "E: pbuilder-satisfydepends failed." >&2
	saveaptcache_umountproc_cleanbuildplace
	exit 1
    fi
    # install extra packages to the chroot
    if [ -n "$EXTRAPACKAGES" ]; then 
	$CHROOTEXEC usr/bin/apt-get -y install ${EXTRAPACKAGES}
    fi
}

function echobacktime () {
    echo "Current time: $(date)"
    echo "pbuilder-time-stamp: $(date +%s)"
}

function showbuildbanner () {
    # show some banners for building
    echo "pbuilder-buildpackage/"$(dpkg --print-architecture) '$Id: pbuilder-buildpackage,v 1.83 2002/03/13 13:53:33 dancer Exp $'
    echo
}

function saveaptcache_umountproc_cleanbuildplace () {
    # save the apt cache, and call umountproc_cleanbuildplace
    save_aptcache
    umountproc_cleanbuildplace
}

function createbuilduser () {
    # create the build user
    if [ -n "$SUTOUSER" ]; then
	echo "$BUILDUSERNAME:x:$BUILDUSERID:$BUILDUSERID:,,,:/tmp/buildd:/bin/sh" >> $BUILDPLACE/etc/passwd
	echo "$BUILDUSERNAME:*:$BUILDUSERID:" >> $BUILDPLACE/etc/group
    fi
}

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

PACKAGENAME="$1"
CHROOTEXEC="chroot $BUILDPLACE "
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="HOME=/tmp/buildd su $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

showbuildbanner
echobacktime
extractbuildplace 
loadhooks
createbuilduser

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

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 
    umountproc_cleanbuildplace
    exit 1;
fi

recover_aptcache
echo "Installing the build-deps"
checkbuilddep
save_aptcache

echo " -> Building the package"
export PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin"

executehooks "A"

if [ -z "$DEBEMAIL" ]; then
    if ! $CHROOTEXEC /bin/bash -c "cd tmp/buildd/*/; $SUTOUSER dpkg-buildpackage -us -uc $DEBBUILDOPTS"; then
	echo "pbuilder: Failed autobuilding of package" >&2
	umountproc_cleanbuildplace
	exit 1;    
    fi
else
    if ! $CHROOTEXEC /bin/bash -c "cd tmp/buildd/*/;  $SUTOUSER dpkg-buildpackage -us -uc  \"-m$DEBEMAIL\" $DEBBUILDOPTS"; then
	echo "pbuilder: Failed autobuilding of package" >&2
	executehooks "C"
	umountproc_cleanbuildplace
	exit 1;    
    fi
fi

executehooks "B"
umountproc

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

cleanbuildplace

echobacktime
