#!/bin/bash
# Copyright 2010 - 2011 Nicolás Reynolds
# Copyright 2011 Joshua Ismael Haase Hernández

# ---------- GNU General Public License 3 ----------

# This file is part of Parabola.

# Parabola 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 3 of the License, or
# (at your option) any later version.

# Parabola 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 Parabola. If not, see <http://www.gnu.org/licenses/>.

source /etc/libretools.conf
source /etc/makepkg.conf

# Local vars may differ from chroot's
LOCALPKGDEST=${PKGDEST}
LOCALSRCDEST=${SRCDEST}
LOCALSRCPKGDEST=${SRCPKGDEST}

source ${CHROOTDIR}/${CHROOT}/etc/makepkg.conf

function usage {         # Display message and exit

    echo 'cd to a dir containing a PKGBUILD and run:'
    echo '$0 [options] [makepkg args]'
    echo 'This script will build your package on a chroot.'
    echo
    echo 'OPTIONS:'
    echo
    echo ' -h          show this message.'
    echo ' -c          cleans the chroot before building.'
    echo ' -u          updates the chroot before building.'
    echo ' -n          use this dir instead of "${CHROOT}".'
    echo ' -M <--arg>  passes long args to makepkg, use it as many times as needed.'
    echo
    exit 1
}

function buildenv {      # Mounts *DEST from makepkg.conf

    msg "Building env"
    for mp in SRCDEST PKGDEST SRCPKGDEST; do
# The host system directory
        lmp=LOCAL${mp}

        msg2 "Binding ${!lmp} to ${CHROOTDIR}/${CHROOT}${!mp}"

        mkdir -p "${CHROOTDIR}/${CHROOT}${!mp}"
        mount -o bind ${!lmp} "${CHROOTDIR}/${CHROOT}${!mp}" || exit 1
    done

}

function clean_chroot {  # Clean packages with pacman

    plain "making list of packages in ${CHROOTDIR}/${CHROOTNAME}/root/"
    cp "/etc/libretools.d/cleansystem" "${CHROOTDIR}/${CHROOTNAME}/root/cleansystem"
    (cat <<EOF
#!/bin/bash
export LANG=C

clean='false'

while [ "\$clean" = 'false' ]; do

    pkgs=(\$(comm -23 <(pacman -Qq | sort) <(sort /root/cleansystem)))

    if [ \${#pkgs[@]} -gt 0 ]; then
        pacman --noconfirm -Rcs \${pkgs[@]}
    else
        clean="true"
        echo "clean"
    fi
done
EOF
    ) > "${CHROOTDIR}/${CHROOTNAME}/clean"
    chmod +x "${CHROOTDIR}/${CHROOTNAME}/clean"
    mkarchroot -r "/clean" "${CHROOTDIR}/${CHROOTNAME}"

}

function copy_log {       # copy logs if they exist

    if [ "${USE_LOG}" == 'y' ]; then
        find ${CHROOTDIR}/${CHROOTNAME}/build/ -name "*\.log" -exec cp {} ./ \;
    fi

}

function trap_exit {      # End inmediately but print a useful message

# args are treated as part of the message

    for mp in ${SRCDEST} ${PKGDEST} ${SRCPKGDEST}; do
        umount "${CHROOTDIR}/${CHROOT}${mp}"
    done

    copy_log

    error "$@"

    exit 1
}

# Trap signals from makepkg
set -E
trap 'trap_exit "(libremakepkg): TERM signal caught. Exiting..."' TERM HUP QUIT
trap 'trap_exit "(libremakepkg): Aborted by user! Exiting..."' INT
trap 'trap_exit "(libremakepkg): An unknown error has occurred. Exiting..."' ERR

CLEAN_FIRST="n"
CLEAN_CACHE=""
UPDATE_FIRST="n"
USE_LOG='n'
CHROOTNAME=${CHROOT}
MAKEPKG_ARGS=""

libremakepkgargs='hcuUn:I:M:'      # libremakepkg own args
libremakepkgargs+='ACdefiLmop:rRs' # makepkg args

while getopts ${libremakepkgargs} arg ; do
    case "${arg}" in
        h) usage ;;
        c) CLEAN_FIRST="y" ;;
        u) UPDATE_FIRST="y" ;;
        n) CHROOTNAME="$OPTARG" ;;
        M) MAKEPKG_ARGS+=" $OPTARG" ;;
        L) MAKEPKG_ARGS+=" -$arg $OPTARG"
            USE_LOG='y';;
        *) MAKEPKG_ARGS+=" -$arg $OPTARG" ;;
    esac
done

if [ ${UID} -ne 0 ]; then
    error "This script must be run as root"
    exit 1
fi

if [ ! -r PKGBUILD ]; then  # Check if we are actually on a build directory. Do this early.
    error "This isn't a build directory"; usage
fi

msg "Checking PKGBUILD for non-free issues"
if ! pkgbuild-check-nonfree; then

    if [[ $? -eq 15 ]]; then    # other errors mean fail, not nonfree
        error "PKGBUILD contains non-free issues"
        exit 15
    else
        true
    fi

fi

buildenv

msg "Creating the package"
if [ ! -d "${CHROOTDIR}/${CHROOTNAME}" ]; then   # use chroot
    mkarchroot -c ${CACHEDIR} -u "${CHROOTDIR}/${CHROOT}" # -c option is for cache
fi

if [ "${CLEAN_FIRST}" = 'y' ]; then
    msg "Cleaning"
    clean_chroot
fi

if [ "${UPDATE_FIRST}" = 'y' ]; then
    msg "Updating the chroot in use..."
    mkarchroot -c ${CACHEDIR} -u "${CHROOTDIR}/${CHROOTNAME}" # -c option is for cache
fi

makechrootpkg -r "${CHROOTDIR}" -l "${CHROOTNAME}" -- "${MAKEPKG_ARGS}"
ev=$? # exit value

copy_log

exit $ev