#!/bin/bash
# 
#   makeworld
#  
#   Copyright (c) 2002-2006 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.
#

version="3.0.0"
toplevel=$(pwd)

usage() {
	echo "makeworld version $version"
	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)"
}

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

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
		;;
		--*)
		usage
		exit 1
		;;
		-*)
		while getopts "chisSbdfrBCemoS-" 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
				;;
				-)
				OPTIND=0
				break
				;;
			esac
		done
		;;
		*)
		dest=$arg
		shift
		break
		;;
	esac
	shift
	if [ "$dest" != "" ]; then
		break
	fi
done

if [ "$dest" = "" ]; 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
				makepkg $MAKEPKG_OPTS -m -w $dest 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: