diff options
Diffstat (limited to 'db-update')
-rw-r--r-- | db-update | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/db-update b/db-update new file mode 100644 index 0000000..24ca489 --- /dev/null +++ b/db-update @@ -0,0 +1,187 @@ +#!/bin/bash + +# where are the arch scripts located? +ARCHDIR="/arch" + +if [ $# -ne 2 ]; then + echo "usage: $(basename $0) <arch> <repo>" + exit 1 +fi + +#All this fun stuff used to be in the db-(whatever) files +# Let's make it cleaner +arch="$1" +reponame="$2" + +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 + +WORKDIR="~/.dbscripts" +CHECKOUTDIR="$WORKDIR/checkout" +LOCKFILE="/tmp/.repolck.$arch.$repoid" +DBFILE="$WORKDIR/$reponame.db.tar.gz" + +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() { + # unlock + rm -f "$LOCKFILE" + [ "$1" ] && exit $1 +} + +ctrl_c() { + echo "Interrupted" >&2 + cleanup 0 +} + +die() { + echo "$*" >&2 + cleanup 1 +} + +# check for locks +if [ -f "$LOCKFILE" ]; then + owner=$(/bin/ls -l $LOCKFILE | /bin/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 "$LOCKFILE" + +if [ -d $CHECKOUTDIR ]; then + cd $CHECKOUTDIR + svn update + if [ $? -gt 0 ]; then + die "==> SVN update failed, aborting!" + fi +else + echo "==> Checking out repo: $svnrepo ($arch) - Please be patient" + svn checkout file://$svnpath $CHECKOUTDIR + if [ $? -gt 0 ]; then + die "==> SVN checkout failed, aborting!" + fi +fi + +cd $CHECKOUTDIR + +# Checkout the SVN module if we need to +updatelists= +if [ "`ls $stagedir/add 2>/dev/null`" -o "`ls $stagedir/del 2>/dev/null`" ]; then + 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 + echo "==> Processing new/updated packages for repository '$reponame'..." >&2 + + # copy the db file into our working area + cp $ftppath/$reponame.db.tar.gz $DBFILE + + cd $stagedir/add + # run it thru fakeroot make sure everything is owned by root.root + echo "$ARCHDIR/updatesync-many add $DBFILE $CHECKOUTDIR $svnrepo" | fakeroot + + if [ $? -ne 0 ]; then + die "==> Error returned from updatesync-many" + fi + + cp $DBFILE $ftppath + + # only for i686 (for now) + if [ "$arch" = "i686" ]; then + echo "==> Scanning for New/Updated packages..." >&2 + cd $stagedir/add + $ARCHDIR/pkgdb1 $CHECKOUTDIR $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 + echo "==> Processing deleted packages for repository '$reponame'..." >&2 + + # copy the db file into our working area + cp $ftppath/$reponame.db.tar.gz $DBFILE + + cd $stagedir/del + # run it thru fakeroot make sure everything is owned by root.root + echo "$ARCHDIR/updatesync-many del $DBFILE NOT-USED ZOMGWOO" \ + | fakeroot + + if [ $? -ne 0 ]; then + die "==> Error returned from updatesync-many" + fi + + cp $DBFILE $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 $CHECKOUTDIR + $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: |