#!/bin/bash
#
#   makeworld
#   @configure_input@
#
#   Copyright (c) 2002-2007 by Judd Vinet <jvinet@zeroflux.org>
#
#   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.
#

myver="@PACKAGE_VERSION@"
toplevel=$(pwd)

usage() {
	printf "makeworld (pacman) %s\n" "$myver"
	echo "usage: $0 [options] <destdir> <category> [category] ..."
	echo "options:"
	echo "  -b, --builddeps  Build missing dependencies from source"
	echo "  -B, --noccache   Do not use ccache during build"
	echo "  -c, --clean      Clean up work files after build"
	echo "  -C, --cleancache Clean up source files from the cache"
	echo "  -d, --nodeps     Skip all dependency checks"
	echo "  -e, --noextract  Do not extract source files (use existing src/ dir)"
	echo "  -f, --force      Overwrite existing packages"
	echo "  -i, --install    Install package after successful build"
	echo "  -m, --nocolor    Disable colorized output messages"
	echo "  -h, --help       This help"
	echo "  -o, --nobuild    Download and extract files only"
	echo "  -r, --rmdeps     Remove installed dependencies after a successful build"
	echo "  -s, --syncdeps   Install missing dependencies with pacman"
	echo "  -S, --usesudo    Use sudo when running pacman commands"
	echo
	echo "These options can be passed to pacman:"
	echo
	echo "  --noconfirm      Do not ask for confirmation when resolving dependencies"
	echo "  --noprogressbar  Do not show a progress bar when downloading files"
	echo
	echo "Where <category> is one or more directory names under the ABS root"
	echo "eg: makeworld -c /packages base lib editors"
	echo
	echo "This should be run from the toplevel directory of ABS (usually /var/abs)"
}

version() {
	printf "makeworld (pacman) %s\n" "$myver"
	printf "\
Copyright (C) 2002-2007 Judd Vinet <jvinet@zeroflux.org>.\n\n\
This is free software; see the source for copying conditions.\n\
There is NO WARRANTY, to the extent permitted by law.\n"
}

MAKEPKG_OPTS=
for arg in $*; do
	case $arg in
		# pacman
		--noconfirm)     MAKEPKG_OPTS="$MAKEPKG_OPTS --noconfirm" ;;
		--noprogressbar) MAKEPKG_OPTS="$MAKEPKG_OPTS --noprogressbar" ;;
		# makepkg
		--clean)      MAKEPKG_OPTS="$MAKEPKG_OPTS -c" ;;
		--install)    MAKEPKG_OPTS="$MAKEPKG_OPTS -i" ;;
		--syncdeps)   MAKEPKG_OPTS="$MAKEPKG_OPTS -s" ;;
		--usesudo)    MAKEPKG_OPTS="$MAKEPKG_OPTS -S" ;;
		--builddeps)  MAKEPKG_OPTS="$MAKEPKG_OPTS -b" ;;
		--nodeps)     MAKEPKG_OPTS="$MAKEPKG_OPTS -d" ;;
		--force)      MAKEPKG_OPTS="$MAKEPKG_OPTS -f" ;;
		--rmdeps)     MAKEPKG_OPTS="$MAKEPKG_OPTS -r" ;;
		--noccache)   MAKEPKG_OPTS="$MAKEPKG_OPTS -B" ;;
		--cleancache) MAKEPKG_OPTS="$MAKEPKG_OPTS -C" ;;
		--noextract)  MAKEPKG_OPTS="$MAKEPKG_OPTS -e" ;;
		--nobuild)    MAKEPKG_OPTS="$MAKEPKG_OPTS -o" ;;
		--nocolor)    MAKEPKG_OPTS="$MAKEPKG_OPTS -m" ;;
		--help)
			usage
			exit 0
			;;
		--version)
			version
			exit 0
			;;
		--*)
			usage
			exit 1
			;;
		-*)
			while getopts "chisSbdfrBCemoSV-" opt; do
				case $opt in
					c) MAKEPKG_OPTS="$MAKEPKG_OPTS -c" ;;
					i) MAKEPKG_OPTS="$MAKEPKG_OPTS -i" ;;
					s) MAKEPKG_OPTS="$MAKEPKG_OPTS -s" ;;
					b) MAKEPKG_OPTS="$MAKEPKG_OPTS -b" ;;
					d) MAKEPKG_OPTS="$MAKEPKG_OPTS -d" ;;
					f) MAKEPKG_OPTS="$MAKEPKG_OPTS -f" ;;
					r) MAKEPKG_OPTS="$MAKEPKG_OPTS -r" ;;
					B) MAKEPKG_OPTS="$MAKEPKG_OPTS -B" ;;
					C) MAKEPKG_OPTS="$MAKEPKG_OPTS -C" ;;
					e) MAKEPKG_OPTS="$MAKEPKG_OPTS -e" ;;
					m) MAKEPKG_OPTS="$MAKEPKG_OPTS -m" ;;
					o) MAKEPKG_OPTS="$MAKEPKG_OPTS -o" ;;
					S) MAKEPKG_OPTS="$MAKEPKG_OPTS -S" ;;
					h)
						usage
						exit 0
						;;
					V)
						version
						exit 0
						;;
					-)
						OPTIND=0
						break
						;;
				esac
			done
			;;
		*)
			dest=$arg
			shift
			break
			;;
	esac
	shift
	if [ "$dest" != "" ]; then
		break
	fi
done

if [ "$dest" = "" ]; then
	usage
	exit 1
fi

if [ $# -lt 1 ]; then
	usage
	exit 1
fi

# convert a (possibly) relative path to absolute
cd "$dest"
dest="$(pwd)"
cd - &>/dev/null

sd=$(date +"[%b %d %H:%M]")

for category in $*; do
	for port in $(find "$toplevel/$category" -maxdepth 1 -mindepth 1 -type d | sort); do
		cd $port
		if [ -f PKGBUILD ]; then
			. PKGBUILD
			buildstatus=0
			if [ ! -f "$dest/$pkgname-$pkgver-$pkgrel.pkg.tar.gz" ]; then
				PKGDEST="$dest" makepkg $MAKEPKG_OPTS -m 2>>$toplevel/makepkg.log
				if [ $? -gt 0 ]; then
					buildstatus=2
				else
					buildstatus=1
				fi
			fi
			d=$(date +"[%b %d %H:%M]")
			echo -n "$d  " >>$toplevel/build.log
			case $buildstatus in
				0) echo "$pkgname already built -- skipping" >>$toplevel/build.log ;;
				1) echo "$pkgname was built successfully" >>$toplevel/build.log ;;
				2) echo "$pkgname build failed" >>$toplevel/build.log ;;
			esac
		fi
	done
done
ed=$(date +"[%b %d %H:%M]")

echo "makeworld complete." >>$toplevel/build.log
echo "  started:  $sd" >>$toplevel/build.log
echo "  finished: $ed" >>$toplevel/build.log

exit 0

# vim: set ts=2 sw=2 noet: