#!/bin/bash if [ $# -ne 2 ]; then echo "usage: $(basename $0) " exit 1 fi . "$(dirname $0)/db-functions" source_makepkg 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" 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 repo_unlock $reponame $arch rm -rf "$WORKDIR" [ "$1" ] && exit $1 } ctrl_c() { echo "Interrupted" >&2 cleanup 0 } die() { echo "$*" >&2 cleanup 1 } trap ctrl_c 2 trap cleanup 0 1 repo_lock $reponame $arch /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/mv "${stagedir}64/add/"* "$stagedir/add/" /bin/mv "${stagedir}64/del/"* "$stagedir/del/" 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'" if ! /bin/cp -r "$WORKDIR/build/"* "$ftppath"; then die "error: failure while copying files to $ftppath" fi 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: