summaryrefslogtreecommitdiff
path: root/updatesync-many
diff options
context:
space:
mode:
Diffstat (limited to 'updatesync-many')
-rwxr-xr-xupdatesync-many248
1 files changed, 248 insertions, 0 deletions
diff --git a/updatesync-many b/updatesync-many
new file mode 100755
index 0000000..150cd66
--- /dev/null
+++ b/updatesync-many
@@ -0,0 +1,248 @@
+#!/bin/bash
+#
+# updatesync-many
+#
+# Copyright (c) 2004 by Jason Chu <jason@archlinux.org>
+# Derived from gensync (c) 2002-2006 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.
+#
+
+usage() {
+ echo "updatesync-many"
+ echo "usage: $0 <action> <dbfile> <abs_dir>"
+ echo
+ echo "This should probably only be run from the Arch db-generation scripts"
+ echo
+ echo "Caveats:"
+ echo " - Make sure you run it from the staging directory"
+ echo " - Use absolute pathnames for dbfile and abs_dir"
+ echo
+ exit 0
+}
+
+die()
+{
+ echo "updatesync-many: $*" >&2
+ rm -rf $TMPDIR
+ exit 1
+}
+
+msg()
+{
+ echo "updatesync-many: $*" >&2
+}
+
+check_option() {
+ local i
+ for i in ${options[@]}; do
+ local uc=`echo $i | tr [:lower:] [:upper:]`
+ local lc=`echo $i | tr [:upper:] [:lower:]`
+ if [ "$uc" = "$1" -o "$lc" = "$1" ]; then
+ echo $1
+ return
+ fi
+ done
+}
+
+get_md5checksum()
+{
+ md5line=`md5sum $1`
+ [ ! -z "$md5line" ] && pkgmd5sum=${md5line% *}
+ echo $pkgmd5sum
+}
+
+db_write_entry()
+{
+ unset pkgname pkgver pkgrel pkgdesc license groups provides md5sums force
+ unset replaces depends conflicts backup source install build makedepends
+ unset options
+ source $1 || return 1
+ cd $TMPDIR
+ mkdir $pkgname-$pkgver-$pkgrel || return 1
+ cd $pkgname-$pkgver-$pkgrel
+ # desc
+ : >desc
+ echo "%NAME%" >>desc
+ echo "$pkgname" >>desc
+ echo "" >>desc
+ echo "%VERSION%" >>desc
+ echo "$pkgver-$pkgrel" >>desc
+ echo "" >>desc
+ echo "%DESC%" >>desc
+ echo "$pkgdesc" >>desc
+ echo "" >>desc
+ echo "%CSIZE%" >>desc
+ echo "$csize" >>desc
+ echo "" >>desc
+ if [ ! -z $pkgmd5sum ]; then
+ echo "%MD5SUM%" >>desc
+ echo "$pkgmd5sum" >>desc
+ echo "" >>desc
+ fi
+ if [ ${#groups[*]} -gt 0 ]; then
+ echo "%GROUPS%" >>desc
+ for it in "${groups[@]}"; do
+ echo "$it" >>desc
+ done
+ echo "" >>desc
+ fi
+ if [ ${#replaces[*]} -gt 0 ]; then
+ echo "%REPLACES%" >>desc
+ for it in "${replaces[@]}"; do
+ echo "$it" >>desc
+ done
+ echo "" >>desc
+ fi
+ if [ "$force" = "y" -o "$force" = "Y" -o "`check_option FORCE`" ]; then
+ echo "%FORCE%" >>desc
+ echo "" >>desc
+ fi
+ # depends
+ : >depends
+ if [ ${#depends[*]} -gt 0 ]; then
+ echo "%DEPENDS%" >>depends
+ for it in "${depends[@]}"; do
+ echo "$it" >>depends
+ done
+ echo "" >>depends
+ fi
+ if [ ${#conflicts[*]} -gt 0 ]; then
+ echo "%CONFLICTS%" >>depends
+ for it in "${conflicts[@]}"; do
+ echo "$it" >>depends
+ done
+ echo "" >>depends
+ fi
+ if [ ${#provides[*]} -gt 0 ]; then
+ echo "%PROVIDES%" >>depends
+ for it in "${provides[@]}"; do
+ echo "$it" >>depends
+ done
+ echo "" >>depends
+ fi
+}
+
+delete_entry()
+{
+ # strip to the basename
+ tmp=${1##*/}
+ # grab the pkgname
+ pkgname=${tmp%-*-*}
+ for i in *; do
+ if [ "${i%-*-*}" = "$pkgname" ]; then
+ rm -rf $i
+ fi
+ done
+}
+
+update_entry()
+{
+ pkgfile=$1
+ tmp=${pkgfile##*/}
+ pkgname=${tmp%-*-*};
+ fullname=${tmp%.pkg.tar.gz}
+
+ # find the matching PKGBUILD
+ tmpf=$(mktemp /tmp/updatesync-many.XXXXXXXXXX) || exit 1
+ find $ABSDIR -type d -name "$pkgname" >$tmpf
+ if [ "`cat $tmpf | wc -l`" != "1" ]; then
+ msg "WARNING: could not find PKGBUILD for $pkgname, cannot update this entry"
+ rm $tmpf
+ return
+ fi
+ pkgbuild="`cat $tmpf`/PKGBUILD"
+ rm $tmpf
+ if [ ! -f $pkgbuild ]; then
+ msg "WARNING: could not find PKGBUILD for $fullname, cannot update this entry"
+ return
+ fi
+
+ source $pkgbuild
+ if [ $? -ne 0 ]; then
+ msg "WARNING: PKGBUILD for $fullname has errors, cannot update this entry"
+ return
+ fi
+
+ # all good so far - delete the old entry
+ cd $TMPDIR
+ delete_entry $pkgfile
+
+ csize=`du -b $pkgfile | cut -f1`
+ pkgmd5sum=`get_md5checksum $pkgfile`
+ [ -z $pkgmd5sum ] && die "error generating checksum for $pkgfile"
+
+ db_write_entry $pkgbuild || die "error writing entry for $pkgname"
+ cd - >/dev/null
+}
+
+
+if [ $# -lt 3 ]; then
+ usage
+ exit 1
+fi
+
+if [ "$1" = "-h" -o "$1" = "--help" ]; then
+ usage
+ exit 0
+fi
+
+ACTION=$1
+PKGDB=$2
+ABSDIR=$3
+STAGEDIR="`pwd`"
+PKGDIR="`dirname $PKGDB`"
+if [ "$PKGDIR" = "." ]; then
+ PKGDIR=$STAGEDIR
+fi
+
+if [ "$ACTION" != "add" -a "$ACTION" != "del" ]; then
+ usage
+ exit 1
+fi
+
+# Prepare the sync db for modifications
+TMPDIR=$(mktemp -d /tmp/updatesync-many.XXXXXXXXXX) || exit 1
+cd $TMPDIR
+if [ ! -f $PKGDB ]; then
+ die "$PKGDB not found"
+fi
+msg "Unpacking db: $PKGDB"
+tar zxf $PKGDB || die "error unpacking $PKGDB"
+
+# Process packages in the staging directory
+for pkgfile in $STAGEDIR/*.pkg.tar.gz; do
+ tmp=${pkgfile##*/}
+ pkgname=${tmp%-*-*};
+ fullname=${tmp%.pkg.tar.gz}
+ if [ "$ACTION" = "del" ]; then
+ msg "Deleting entry: $pkgname"
+ delete_entry $pkgfile
+ else
+ msg "Updating entry: $pkgname"
+ update_entry $pkgfile
+ fi
+done
+
+# Repackage the DB
+msg "Repacking db: $PKGDB"
+cd $TMPDIR
+tar c * | gzip -9 >$PKGDB || die "error writing to $PKGDB"
+
+cd /
+rm -rf $TMPDIR
+
+exit 0