#!/bin/bash

# where are the arch scripts located?
ARCHDIR="/arch"

#All this fun stuff used to be in the db-(whatever) files
# Let's make it cleaner
export CARCH="$arch"
ftppath="/home/ftp/$reponame/os/$arch/"
svnpath="/home/svn-packages"
svnrepo="$reponame-$arch"

#Hacky for now
if [ "$arch" = "x86_64" ]; then
	stagedir="$HOME/staging/${reponame}64"
else
	stagedir="$HOME/staging/$reponame"
fi

[ "$UID" = "" ] && UID=$(uid)
TMPDIR="/tmp/archpkg.$arch.$repoid.$UID"

if [ ! `type -p fakeroot` ]; then
		echo "error: fakeroot is missing" >&2
		exit 1
fi

if [ ! -d $stagedir ]; then
		echo "error: staging directory missing: $stagedir" >&2
		exit 1
fi

# Get the package name from the filename
# hackish, but should work for now
getpkgname() {
		local tmp

		tmp=${1##*/}
		tmp=${tmp%.pkg.tar.gz}
		tmp=${tmp%-i686}
		tmp=${tmp%-x86_64}
		echo ${tmp%-*-*}
}

cleanup() {
		rm -rf $TMPDIR
		# unlock
		rm -f /tmp/.repolck.$arch.$repoid
		[ "$1" ] && exit $1
}

ctrl_c() {
		echo "Interrupted" >&2
		cleanup 0
}

die() {
		echo "$*" >&2
		cleanup 1
}

# check for locks
if [ -f /tmp/.repolck.$arch.$repoid ]; then
		owner=`/bin/ls -l /tmp/.repolck.$arch.$repoid | awk '{print $3}'`
		echo "error: db generation is already in progress (started by $owner)"
		exit 1
fi

# catch ^C breaks
trap ctrl_c SIGINT
# lock
touch /tmp/.repolck.$arch.$repoid

# RedHat's mktemp is broken...
if [ -d $TMPDIR ]; then
		echo "==> Removing old temp dir..." >&2
		rm -rf $TMPDIR || exit 1
fi
mkdir $TMPDIR; [ $? -gt 0 ] && exit 1

cd $TMPDIR

# Checkout the SVN module if we need to
updatelists=
if [ "`ls $stagedir/add 2>/dev/null`" -o "`ls $stagedir/del 2>/dev/null`" ]; then
		# if $svndir is set, then use that instead of doing our own cvs checkout
		if [ "$svndir" ]; then
				mv $svndir $TMPDIR/checkout
		else
				echo "==> Checking out repo: $svnrepo ($arch) - Please be patient"
				svn export -q file://$svnpath $TMPDIR/checkout
				if [ $? -gt 0 ]; then
						die "==> SVN export failed!"
				fi
		fi
		updatelists=1
else
		echo "No files to process"
		cleanup 0
fi

# Right-O, now we look through the "add" and "del" subdirectories of
# $stagedir and process the packages there accordingly -- all packages
# in the "add" dir are added/updated, all packages in the "del" dir
# are removed.
#
# This means the sync db could actually be unpacked/repacked twice in
# one db-* invocation, but it's not a huge performance hit.

if [ -d $stagedir/add -a "`ls $stagedir/add`" ]; then
		cd $TMPDIR
		echo "==> Processing new/updated packages for repository '$reponame'..." >&2

		# copy the db file into our working area
		cp $ftppath/$reponame.db.tar.gz .

		cd $stagedir/add
		# run it thru fakeroot make sure everything is owned by root.root
		echo "$ARCHDIR/updatesync-many add $TMPDIR/$reponame.db.tar.gz $TMPDIR/checkout $svnrepo" \
		| fakeroot

		if [ $? -ne 0 ]; then
				die "==> Error returned from updatesync-many"
		fi

		cp $TMPDIR/$reponame.db.tar.gz $ftppath

		# only for i686 (for now)
		if [ "$arch" = "i686" ]; then
				echo "==> Scanning for New/Updated packages..." >&2
				cd $stagedir/add
				$ARCHDIR/pkgdb1 $TMPDIR/checkout $svnrepo | $ARCHDIR/pkgdb2-add $repoid $stagedir/add
		fi

		# move the package files into the ftp directory
		mv -f $stagedir/add/*.pkg.tar.gz $ftppath
fi

if [ -d $stagedir/del -a "`ls $stagedir/del`" ]; then
		cd $TMPDIR
		echo "==> Processing deleted packages for repository '$reponame'..." >&2

		# copy the db file into our working area
		cp $ftppath/$reponame.db.tar.gz .

		cd $stagedir/del
		# run it thru fakeroot make sure everything is owned by root.root
		echo "$ARCHDIR/updatesync-many del $TMPDIR/$reponame.db.tar.gz NOT-USED ZOMGWOO" \
		| fakeroot

		if [ $? -ne 0 ]; then
				die "==> Error returned from updatesync-many"
		fi

		cp $TMPDIR/$reponame.db.tar.gz $ftppath

		# only for i686 (for now)
		if [ "$arch" = "i686" ]; then
				echo "==> Scanning for Deleted packages..." >&2
				cd $stagedir/del
				(
				for i in *.pkg.tar.gz; do
						pkgname=$(getpkgname $i)
						echo $pkgname
				done
				) | $ARCHDIR/pkgdb2-del $repoid $stagedir/del
		fi

		# remove the package files
		rm -f $stagedir/del/*.pkg.tar.gz
fi

if [ "$updatelists" ]; then
		echo "==> Generating Text Package List..." >&2
		cd $TMPDIR/checkout
		$ARCHDIR/genpkglist $ftppath $svnrepo
		if [ -f packages.txt ]; then
			mv packages.txt $ftppath/packages.txt
		fi
fi

cleanup

# vim: set ts=4 sw=4 noet ft=sh: