#!/bin/bash
# libremakepkg
# analogous to devtools' archbuild

# Copyright 2010 - 2011 Nicolás Reynolds
# Copyright 2011 Joshua Ismael Haase Hernández
# Copyright 2012 Luke Shumaker

# ---------- 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/>.

. /etc/libretools.conf

##
# copy logs if they exist
##
copy_log() {
	find "${copydir}/build/" -maxdepth 1 -name "*\.log" -exec cp {} ./ \;
}

##
# End inmediately but print a useful message
##
trap_exit() {
	copy_log
	error "$@"
	exit 1
}

usage() {
    echo 'cd to a dir containing a PKGBUILD and run:'
    echo '$0 [options] [-- makechrootpkg args [-- makepkg args]]'
    echo 'This script will build your package in a chroot.'
    echo ''
    echo 'OPTIONS:'
    echo ' -h              Show this message'
    echo ''
    echo ' -c              Clean the chroot before building'
    echo ' -u              Update the chroot before building'
    echo ' -N              Do not check freedom issues (for fullpkg)'
    echo ''
    echo " -d <chrootdir>  Use this dir instead of \`$CHROOTDIR'"
    echo " -n <chroot>     Use this chroot instead of \`$CHROOT'"
    echo ' -l <copy>       Use this chroot copy instead of basing it'
    echo '                 on the username'
}

main() {
	# The logic for setting CHROOTCOPY is mirred from makechrootpkg
	CHROOTCOPY=$USER
	[[ -n $SUDO_USER ]] && CHROOTCOPY=$SUDO_USER
	[[ -z $CHROOTCOPY || $CHROOTCOPY = root ]] && CHROOTCOPY=copy

	CLEANFIRST=false
	UPDATEFIRST=false
	CHECKNONFREE=true

	makechrootpkg_args=()

	while getopts 'hcuNd:n:l:' arg ; do
		case "${arg}" in
			c) CLEANFIRST=true;;
			u) UPDATEFIRST=true;;
			N) CHECKNONFREE=false;;

			d) CHROOTDIR=$OPTARG;;
			n) CHROOT=$OPTARG;;
			l) CHROOTCOPY=$OPTARG;;

			h) usage; exit 0;;
			*) usage; exit 1;;
		esac
	done
	shift $(($OPTIND - 1))
	# Pass all arguments after -- right to makechrootpkg
	makechrootpkg_args+=("$@")

	# not local
	rootdir="${CHROOTDIR}/${CHROOT}/root"
	copydir="${CHROOTDIR}/${CHROOT}/${CHROOTCOPY}"

	if (( EUID )); then
		error "This script must be run as root"
		exit 1
	fi

	if [[ ! -e PKGBUILD ]]; then
		error "This isn't a build directory"
		exit 1
	fi

	# OK, we're starting now ###############################################

	# 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

	if $CHECKNONFREE; then
		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
				warning "PKGBUILD couldn't be check aganist non-free issues"
			fi
		fi
	fi

	if $CLEANFIRST; then
		librechroot -c -d "$CHROOTDIR" -l "$CHROOTCOPY" "$CHROOT"
	fi

	if $UPDATEFIRST; then
		librechroot -u -d "$CHROOTDIR" -l "$CHROOTCOPY" "$CHROOT"
	fi

	unset CLEANFIRST UPDATEFIRST librechroot_args

	makechrootpkg "${makechrootpkg_args[@]}" -d -r "$CHROOTDIR/$CHROOT" -l "$CHROOTCOPY"
	ev=$? # exit value
	copy_log
	exit $ev
}

main "$@"