--- /usr/bin/makepkg	2007-09-16 16:33:23.000000000 -0600
+++ /usr/bin/makepkg2	2007-10-26 13:07:52.000000000 -0600
@@ -34,6 +34,8 @@
 source "/etc/abs/abs.conf"
 SRCROOT="$ABSROOT"
 
+FORCE_VER=""
+
 # Options
 CLEANUP=0
 CLEANCACHE=0
@@ -106,6 +108,10 @@
 	echo "$1" | sed 's|^.*://.*/||g'
 }
 
+update_pb() {
+	sed -i "1,11 s/pkgver=[^ ]*/pkgver=$1/" ./$BUILDSCRIPT
+}
+
 # checks to see if options are present in makepkg.conf or PKGBUILD;
 #   PKGBUILD options always take precedence
 check_option() {
@@ -457,7 +463,7 @@
 					exit 1
 					;;
 		-*)
-		while getopts "bcCdefghiLmop:rRsS-" opt; do
+		while getopts "bcCdefghiLmopz:rRsS-" opt; do
 			case $opt in
 				b) DEP_SRC=1 ;;
 				c) CLEANUP=1 ;;
@@ -479,6 +485,7 @@
 				R) REPKG=1 ;;
 				s) DEP_BIN=1 ;;
 				S) SUDO=1 ;;
+				z) FORCE_VER=$OPTARG ;;
 				-)
 						OPTIND=0
 						break
@@ -592,6 +599,67 @@
 	fi
 fi
 
+newpkgver=""
+if [ "$FORCE_VER" = "" ]; then
+	# Check if this is a svn/cvs/etc PKGBUILD; set $newpkgver if so.
+	# This will only be used on the first call to makepkg; subsequent
+	# calls to makepkg via fakeroot will explicitly pass the version
+	# number to avoid having to determine the version number twice.
+	oldpkgver=$pkgver
+	if [ ! -z ${_darcstrunk} ] && [ ! -z ${_darcsmod} ] ; then
+		msg "determining latest darcs revision... \c"
+		newpkgver=$(date +%Y%m%d)
+		echo $newpkgver
+	elif [ ! -z ${_cvsroot} ] && [ ! -z ${_cvsmod} ] ; then
+		msg "determining latest cvs revision... \c"
+		newpkgver=$(date +%Y%m%d)
+		echo $newpkgver
+	elif [ ! -z ${_gitroot} ] && [ ! -z ${_gitname} ] ; then
+		msg "determining latest git revision... \c"
+		newpkgver=$(date +%Y%m%d)
+		echo $newpkgver
+	elif [ ! -z ${_svntrunk} ] && [ ! -z ${_svnmod} ] ; then
+		msg "retrieving latest revision number from svn... \c"
+		newpkgver=$(svn log $_svntrunk --limit 1 | sed -n 's/^r\([^ ]*\) .*$/\1/p')
+		echo "$newpkgver"
+	elif [ ! -z ${_bzrtrunk} ] && [ ! -z ${_bzrmod} ] ; then
+	    msg "retrieving latest revision number from bzr... \c"
+	    newpkgver=$(bzr revno ${_bzrtrunk})
+	    echo "$newpkgver"
+	elif [ ! -z ${_hgroot} ] && [ ! -z ${_hgrepo} ] ; then
+		if [ -d ./src/$_hgrepo ] ; then
+			msg "retrieving latest revision number from hg... \c"
+			cd ./src/$_hgrepo
+			make clean
+			hg pull
+			hg update
+		else
+			msg "determining latest hg revision... \c"
+			[[ ! -d ./src/$_hgrepo ]] && mkdir -p ./src/$_hgrepo
+			hg clone $_hgroot/$_hgrepo ./src/$_hgrepo
+			cd ./src/$_hgrepo
+ 		fi
+		newpkgver=$(hg tip | sed -n '1s/[^0-9]*\([^:]*\):.*$/\1/p')
+		echo "$newpkgver"
+		cd ../../
+	fi
+
+	if [ "$newpkgver" != "$oldpkgver" ]; then
+		msg "newer revision detected: $newpkgver"
+	elif [ "$newpkgver" != "" ]; then
+		warning "PKGBUILD pkgver is $oldpkgver, no newer revision available"
+		if [ "$FORCE" = "1" ]; then
+			msg "forcing pkgver to $newpkgver... "
+		else
+			error "exiting now, use makepkg -f to force update"
+			exit 1
+		fi
+	fi
+else
+	# Version number retrieved from fakeroot->makepkg argument
+	newpkgver=$FORCE_VER
+fi
+
 # Enter the fakeroot environment if necessary.  This will call the makepkg
 # script again as the fake root user.  We detect this by passing a sentinel
 # option (-F) to makepkg.
@@ -599,7 +667,11 @@
 	if [ "$(check_buildenv fakeroot)" = "y" ]; then
 		if [ $(type -p fakeroot) ]; then
 			msg "Entering fakeroot environment"
-			fakeroot -- $0 -F $ARGLIST
+			if [ "$newpkgver" != "" ]; then
+				fakeroot -- $0 -F $ARGLIST -z $newpkgver
+			else
+				fakeroot -- $0 -F $ARGLIST
+			fi
 			exit $?
 		else
 			warning "Fakeroot is not installed. Building as an unprivileged user"
@@ -617,6 +689,18 @@
 	fi
 fi
 
+# This is lame, but if we're wanting to use an updated pkgver for
+# retrieving svn/cvs/etc sources, we'll update the PKGBUILD, re-source
+# it, and then revert it
+if [ "$newpkgver" != "" ]; then
+	if [ "newpkgver" != "$pkgver" ]; then
+		oldpkgver=$pkgver
+		update_pb $newpkgver
+		source $BUILDSCRIPT
+		update_pb $oldpkgver
+	fi
+fi
+
 msg "Making package: $pkgname $pkgver-$pkgrel ($(date))"
 
 # fix flyspray bug #5973
