#!/bin/bash

if [ $# -ne 2 ]; then
	echo "usage: $(basename $0) <arch> <reponame>"
	exit 1
fi

if [ -f "/etc/makepkg.conf" ]; then
	#Get some config info
	. /etc/makepkg.conf
else
	echo "/etc/makepkg.conf does not exist!"
	exit 1
fi

reponame="$1"
arch="$2"

export CARCH="$arch"

##### Arch specific stuff. TODO make this configurable #####
ftppath="/home/ftp/$reponame/os/$arch/"
svnpath="file:///home/svn-packages"
svnrepo="$reponame-$arch"
stagedir="$HOME/staging/$reponame"
############################################################

[ "$UID" = "" ] && UID=$(uid)

WORKDIR="/tmp/db-update.$svnrepo.$UID"
LOCKFILE="/tmp/.repolck.$arch.$reponame"
ADDPKGS=""
REMPKGS=""

if [ ! -d "$ftppath" ]; then
	echo "FTP path for this repo ($reponame) is missing"
	echo "Please contact a system administrator"
	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%$PKGEXT}
	tmp=${tmp%-$CARCH}
	echo ${tmp%-*-*}
}

cleanup() {
	# unlock
	rm -f "$LOCKFILE"
	rm -rf "$WORKDIR"
	[ "$1" ] && exit $1
}

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

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

# check for locks
if [ -f "$LOCKFILE" ]; then
	owner="$(/usr/bin/stat -c %U $LOCKFILE)"
	echo "error: db generation is already in progress (started by $owner)"
	exit 1
fi

trap ctrl_c 2
trap cleanup 0

/bin/touch "$LOCKFILE"

/bin/mkdir -p "$WORKDIR/build"
cd "$WORKDIR"

# copy the db file into our working area
if [ -f "$ftppath/$reponame.db.tar.$DB_COMPRESSION" ]; then
	cp "$ftppath/$reponame.db.tar.$DB_COMPRESSION" build/
else
	touch "build/$reponame.db.tar.$DB_COMPRESSION"
fi

echo "Updating DB for $reponame $arch"

if [ -d "${stagedir}64" ]; then
	echo "--------------------------------------------------"
	echo "It looks like you have an old staging dir"
	echo "Packages are now differentiated by the arch in the filename."
	echo "Please delete '${stagedir}64'"
	echo "--------------------------------------------------"
	/bin/cp -r "${stagedir}64/"* "$stagedir/"
fi

to_add=""
if [ -d "$stagedir/add" ]; then
	ADDPKGS="$(/bin/ls $stagedir/add/*-${arch}$PKGEXT 2>/dev/null)"
fi

if [ -n "$ADDPKGS" ]; then
	echo "==> Processing new/updated packages for repository '$reponame'..." >&2

	cd "$WORKDIR"
	/usr/bin/svn checkout -N $svnpath checkout
	cd checkout

	for pkg in $ADDPKGS; do
		_pkgfile=$(basename $pkg)
		_pkgname="$(getpkgname $pkg)"
		echo "    Checking SVN for $_pkgname"
		/usr/bin/svn up -q $_pkgname
		if [ -d "$_pkgname/repos/$svnrepo" ]; then
			. "$_pkgname/repos/$svnrepo/$BUILDSCRIPT"
			if [ "$_pkgfile" = "$pkgname-$pkgver-$pkgrel-$CARCH$PKGEXT" ]; then
				to_add="$to_add $pkg"
			else
				echo "    WARNING: $_pkgfile does not match $BUILDSCRIPT in $svnrepo"
			fi
		else
			echo "    WARNING: Package $_pkgname not found in $svnrepo"
		fi
	done

	if [ -n "$to_add" ]; then
		cd "$WORKDIR/build/"
		/bin/cp $to_add .

		pkgs=""
		for pkg in $to_add; do pkgs="$pkgs $(basename $pkg)"; done

		/usr/bin/repo-add "$reponame.db.tar.$DB_COMPRESSION" $pkgs
	else
		rm -f "build/$reponame.db.tar.$DB_COMPRESSION"
		echo "Errors found when adding packages"
	fi
else
	echo "No packages to add"
fi

to_rem=""
if [ -d "$stagedir/del" ]; then
	REMPKGS="$(/bin/ls $stagedir/del/*-${arch}$PKGEXT 2>/dev/null)"
fi

if [ -n "$REMPKGS" ]; then
	echo "==> Processing deleted packages for repository '$reponame'..." >&2

	if [ ! -d "$WORKDIR/checkout" ]; then
		cd "$WORKDIR"
		/usr/bin/svn checkout -N $svnpath checkout
	fi
	cd "$WORKDIR/checkout"

	#TODO removal shouldn't require a package file
	for pkg in $REMPKGS; do
		_pkgfile=$(basename $pkg)
		_pkgname="$(getpkgname $pkg)"
		echo "    Checking SVN for $_pkgname"
		svn up -q $_pkgname
		if [ -d "$_pkgname/repos/$svnrepo" ]; then
			echo "    WARNING: $_pkgname still exists in $svnrepo"
		else
			to_rem="$to_rem $_pkgname"
		fi
	done

	if [ -n "$to_rem" ]; then
		cd "$WORKDIR/build/"

		#NOTE: to_rem consists of package NAMES only
		/usr/bin/repo-remove "$reponame.db.tar.$DB_COMPRESSION" $to_rem

		for rem in $REMPKGS; do
			rem="$(basename $rem)"
			/bin/rm -f "$ftppath/$rem"
		done
	else
		rm -f "build/$reponame.db.tar.$DB_COMPRESSION"
		echo "Errors found when removing packages"
	fi
else
	echo "No packages to delete"
fi

# if non empty, move all build dirs
if [ $(/bin/ls "$WORKDIR/build/" 2>/dev/null | wc -l) != 0 ]; then
	echo "Copying new files to '$ftppath'"
	/bin/cp -r "$WORKDIR/build/"* "$ftppath" 

else
	echo "Nothing to copy, no work done"
fi

if [ -n "$ADDPKGS" -o -n "$REMPKGS" ]; then
	echo "Cleaning staging dir"
	/bin/rm $ADDPKGS $REMPKGS
fi

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