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

. "${BASH_SOURCE%/*}/pbuilder-checkparams"
. "${BASH_SOURCE%/*}/pbuilder-buildpackage-funcs"

PACKAGENAME="$1"
if [ ! -f "$PACKAGENAME" ]; then
    log.e "Command line parameter [$PACKAGENAME] does not exist"
    exit 1;
fi;

if [ -n "$BUILDUSERNAME" -a -n "$BUILDUSERID" ]; then
    # Command to SU to user.
    # LD_PRELOAD: Normal users don't have write access to build
    # environment, so cowdancer shouldn't have to run, and fakeroot
    # should be running later, so it shouldn't matter.
    # LOGNAME and USER: set this to shut up some tools.
    SUTOUSER="LD_PRELOAD= LOGNAME=$BUILDUSERNAME USER=$BUILDUSERNAME /sbin/start-stop-daemon --start --pidfile /dev/null --chuid $BUILDUSERNAME --startas /bin/sh"
    DEBBUILDOPTS="${DEBBUILDOPTS:+$DEBBUILDOPTS }-rfakeroot"
    EXTRAPACKAGES="${EXTRAPACKAGES} fakeroot"
    log.i "using fakeroot in build."
else
    # run the build in root
    BUILDUSERID=0
    BUILDUSERNAME=root
    SUTOUSER="LOGNAME=$BUILDUSERNAME /bin/sh"
fi

UNSHARE=
case $USENETWORK in
    yes)
        if [ "$DEB_BUILD_ARCH_OS" = "linux" ]; then
            # omit the warning when running on kFreeBSD or Hurd
            log.w "pbuilder: network will not be disabled during build!"
        fi
        ;;
    *)
        if /usr/bin/unshare -n -- /usr/lib/pbuilder/pbuilder-unshare-wrapper true; then
            USENETWORK=no
            UNSHARE="/usr/bin/unshare -n -- /usr/lib/pbuilder/pbuilder-unshare-wrapper"
            log.i "pbuilder: network access will be disabled during build"
        else
            USENETWORK=yes
            if [ "$DEB_BUILD_ARCH_OS" = "linux" ]; then
                log.w "pbuilder: unshare CLONE_NEWNET not available"
            fi
            log.i "pbuilder: network access is available during build!"
        fi
        ;;
esac


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

echobacktime
extractbuildplace 
trap umountproc_cleanbuildplace_trap exit sighup sigpipe

if [ ! -d "${BUILDRESULT}" ]; then
    if [ -n "${BUILDRESULT}" ] ; then
        mkdir -p "${BUILDRESULT}"
    fi
    if [ -d "${BUILDRESULT}" ]; then
        log.i "created buildresult dir: ${BUILDRESULT}"
    else
        log.e "failed creating buildresult dir: ${BUILDRESULT}"
        exit 1
    fi
fi

if [ -z "${PBUILDER_BUILD_LOGFILE}" ]; then
    if [ "${PKGNAME_LOGFILE}" = "yes" ]; then
        PBUILDER_BUILD_LOGFILE="${BUILDRESULT}/$(basename "${PACKAGENAME}" .dsc)${PKGNAME_LOGFILE_EXTENSION}"
        exec > >(tee "${PBUILDER_BUILD_LOGFILE}") 2>&1
        PBUILDER_BUILD_LOGFILE=$(readlink -f "${PBUILDER_BUILD_LOGFILE}")
        log.i "Using pkgname logfile"
        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
createbuilduser
CCACHE_ENV=
setup_ccache
SUTOUSER="$CCACHE_ENV $SUTOUSER"
log.i "Installing the build-deps"
executehooks "D"
trap saveaptcache_umountproc_cleanbuildplace_trap exit sighup sigpipe
checkbuilddep "$PACKAGENAME"
save_aptcache
trap umountproc_cleanbuildplace_trap exit sighup sigpipe

log.i "Copying source file"
copydsc "$PACKAGENAME" "${BUILDPLACE}$BUILDDIR"
copyinputfile "${BUILDPLACE}$BUILDDIR"

log.i "Extracting source"
if echo "chown $BUILDUSERNAME:$BUILDUSERNAME $BUILDDIR $BUILDDIR/*" | $CHROOTEXEC /bin/bash; then
    : # success
else
    log.e "pbuilder: Failed chowning to $BUILDUSERNAME:$BUILDUSERNAME"
    exit 1;
fi
if echo "( cd $BUILDDIR; env PATH=\"$PATH\" /usr/bin/dpkg-source -x $(basename "$PACKAGENAME") )" | $UNSHARE $CHROOTEXEC env $SUTOUSER ; then
    : # success
else
    log.e "pbuilder: Failed extracting the source"
    exit 1;
fi

binNMU

log.i "Building the package"

executehooks "A"

DPKG_COMMANDLINE="env PATH=\"$PATH\" HOME=\"$BUILD_HOME\" dpkg-buildpackage -us -uc $DEBBUILDOPTS"

# https://launchpad.net/bugs/816556
unset DISPLAY

(
    : Build process
    if [ -n "$TWICE" ]; then
        DPKG_COMMANDLINE="$DPKG_COMMANDLINE && $DPKG_COMMANDLINE"
    fi
    DPKG_COMMANDLINE="cd ${BUILDDIR}/*/ && $DPKG_COMMANDLINE"
    log.i "Running $DPKG_COMMANDLINE"
    echo "$DPKG_COMMANDLINE" | $UNSHARE $CHROOTEXEC env $SUTOUSER
) &
BUILD_PID=$!
if [ -n "${TIMEOUT_TIME}" ]; then
    (
        : Timeout process
        sleep "${TIMEOUT_TIME}"
        log.i "Terminating build process due to timeout "
        kill "${BUILD_PID}" || true
    ) & # timeout process
    KILL_WAIT_PID="kill $! || true; echo \"I: Terminate timeout process\"; "
else
    KILL_WAIT_PID=""
fi

if ! wait "${BUILD_PID}"; then
    trap umountproc_cleanbuildplace_trap exit sighup sigpipe
    eval "${KILL_WAIT_PID}"
    log.e "Failed autobuilding of package"
    executehooks "C"
    exit 1;
else
    eval ${KILL_WAIT_PID}
    # build was successful
fi

executehooks "B"

if [ -d "${BUILDRESULT}" ]; then
    chown "${BUILDRESULTUID}:${BUILDRESULTGID}" "${BUILDPLACE}$BUILDDIR/"*
    chgrp "${BUILDRESULTGID}" "${BUILDPLACE}$BUILDDIR/"*
    for FILE in "${BUILDPLACE}$BUILDDIR"/*; do
        if [ -f "${FILE}" ]; then
            cp -p "${FILE}" "${BUILDRESULT}" || true
        fi
    done
    for FILE in "${ADDITIONAL_BUILDRESULTS[@]}"; do
        log.i "Trying to save additional result ${FILE}"
        cp -a "${BUILDPLACE}$BUILDDIR/"*"/${FILE}" "${BUILDRESULT}" || true
    done
    executehooks "I"
else
    log.e "BUILDRESULT=[$BUILDRESULT] is not a directory."
fi

# final cleanup
trap umountproc_cleanbuildplace_trap exit sighup sigpipe
save_aptcache
trap cleanbuildplace_trap exit sighup sigpipe
umountproc
:
cleanbuildplace
trap - exit sighup sigpipe
echobacktime
exit 0