diff --git a/Makefile b/Makefile
index 6e41e5d..023c41d 100644
--- a/Makefile
+++ b/Makefile
@@ -326,7 +326,7 @@
 # of the checked out flashrom files.
 # Note to packagers: Any tree exported with "make export" or "make tarball"
 # will not require subversion. The downloadable snapshots are already exported.
-SVNVERSION := $(shell LC_ALL=C svnversion -cn . 2>/dev/null | sed -e "s/.*://" -e "s/\([0-9]*\).*/\1/" | grep "[0-9]" || LC_ALL=C svn info . 2>/dev/null | awk '/^Revision:/ {print $$2 }' | grep "[0-9]" || LC_ALL=C git svn info . 2>/dev/null | awk '/^Revision:/ {print $$2 }' | grep "[0-9]" || echo unknown)
+SVNVERSION := $(shell ./util/getrevision.sh -u)
 
 RELEASE := 0.9.7
 VERSION := $(RELEASE)-r$(SVNVERSION)
diff --git a/util/getrevision.sh b/util/getrevision.sh
new file mode 100755
index 0000000..678d66b
--- /dev/null
+++ b/util/getrevision.sh
@@ -0,0 +1,228 @@
+#!/bin/sh
+#
+# This file is part of the flashrom project.
+#
+# Copyright (C) 2005 coresystems GmbH <stepan@coresystems.de>
+# Copyright (C) 2009,2010 Carl-Daniel Hailfinger
+# Copyright (C) 2010 Chromium OS Authors
+#
+# 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+#
+
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+svn_revision() {
+	LC_ALL=C svnversion -cn . 2>/dev/null | \
+		sed -e "s/.*://" -e "s/\([0-9]*\).*/\1/" | \
+		grep "[0-9]" ||
+	LC_ALL=C svn info . 2>/dev/null | \
+		awk '/^Revision:/ {print $$2 }' | \
+		grep "[0-9]" ||
+	LC_ALL=C git svn info . 2>/dev/null | \
+		awk '/^Revision:/ {print $$2 }' | \
+		grep "[0-9]" ||
+	echo ''
+}
+
+svn_url() {
+	echo $(LC_ALL=C svn info 2>/dev/null |
+	       grep URL: |
+		   sed 's/.*URL:[[:blank:]]*//' |
+		   grep ^.
+	      )
+}
+
+svn_timestamp() {
+	local date_format="+%Y-%m-%d %H:%M:%S"
+	local timestamp
+
+	# are there local changes in the client?
+	if svn status | egrep '^ *[ADMR] *' > /dev/null ; then
+		timestamp=$(date "${date_format} +")
+	else
+		# No local changes, get date of the last log record.
+		local last_commit_date=$(svn info | grep '^Last Changed Date:' | \
+		                         awk '{print $4" "$5" "$6}')
+		timestamp=$(date --utc --date "${last_commit_date}" \
+			        "${date_format} UTC")
+	fi
+
+	echo "${timestamp}"
+}
+
+git_revision() {
+	echo $(git log --oneline | head -1 | awk '{print $1}')
+}
+
+# Retrieve svn revision using git log data (for git mirrors)
+gitsvn_revision() {
+	local r
+
+	git log|
+		grep git-svn-id|
+		sed 's/.*git-svn-id:[[:blank:]]*\([^@]\+\)@[0-9]\+[[:blank:]]\+\([^[:blank:]]\+\)/\1 \2/'|
+		sort|
+		uniq|
+		read url uuid
+
+	r=$(git log --grep="git-svn-id.*$uuid"| grep git-svn-id | \
+		sed 's/.*@//;s/[[:blank:]].*//'| \
+		sort -n | \
+		tail -1)
+
+	echo "${r}"
+}
+
+git_timestamp() {
+	local date_format="+%b %d %Y %H:%M:%S"
+	local timestamp
+
+	# are there local changes in the client?
+	if git status | \
+	   egrep '^# Change(s to be committed|d but not updated):$' > /dev/null
+	then
+		timestamp=$(date "${date_format} +")
+	else
+		# No local changes, get date of the last log record.
+		local last_commit_date=$(git log | head -3 | grep '^Date:' | \
+		                         awk '{print $3" "$4" "$6" "$5" "$7}')
+		timestamp=$(date --utc --date "${last_commit_date}" \
+		            "${date_format} UTC")
+	fi
+
+	echo "${timestamp}"
+}
+
+git_url() {
+	# Only the first line of `git remote' is considered.
+	echo $(LC_ALL=C git remote show origin 2>/dev/null |
+	       grep 'Fetch URL:' |
+	       sed 's/.*URL:[[:blank:]]*//' |
+	       grep ^.
+	      )
+}
+
+scm_url() {
+	local url
+
+	if [ -d ".svn" ] ; then
+		url=$(svn_url)
+	elif [ -d ".git" ] ; then
+		url=$(git_url)
+	fi
+
+	echo "${url}"
+}
+
+# Retrieve timestamp since last modification. If the sources are pristine,
+# then the timestamp will match that of the SCM's more recent modification
+# date.
+timestamp() {
+	local t
+
+	if [ -d ".svn" ] ; then
+		t=$(svn_timestamp)
+	elif [ -d ".git" ] ; then
+		t=$(git_timestamp)
+	fi
+
+	echo ${t}
+}
+
+# Retrieve local SCM revision info. This is useful if we're working in
+# a even different SCM than upstream.
+#
+# If local copy is svn, then there is nothing to do here.
+# If local copy is git, then retrieve useful git revision info
+local_revision() {
+	local r
+
+	if [ -d ".git" ] ; then
+		r=$(git_revision)
+	fi
+
+	echo ${r}
+}
+
+# Get the upstream flashrom revision stored in SVN metadata.
+#
+# If the local copy is svn, then use svnversion
+# If the local copy is git, then scrape upstream revision from git logs
+upstream_revision() {
+	local r
+
+	if [ -d ".svn" ] ; then
+		r=$(svn_revision)
+	elif [ -d ".git" ] ; then
+		r=$(gitsvn_revision)
+	fi
+
+	echo "${r}"
+}
+
+show_help() {
+	echo "Usage:
+	${0} <option>
+
+Options
+    -h or --help
+        Display this message.
+    -u or --upstream
+        upstream flashrom revision
+    -l or --local
+        local revision (if different from upstream)
+    -t or --timestamp
+        timestamp of most recent modification
+    -U or --url
+        url associated with local copy of flashrom
+	"
+	return
+}
+
+if [ ! -n "${1}" ]
+then
+	show_help;
+	echo "No options specified";
+	exit ${EXIT_SUCCESS}
+fi
+
+# The is the main loop
+while [[ ${1} = -* ]];
+do
+	case ${1} in
+	-h|--help)
+		show_help;
+		shift;;
+	-u|--upstream)
+		echo "$(upstream_revision)";
+		shift;;
+	-l|--local)
+		echo "$(local_revision)";
+		shift;;
+	-t|--timestamp)
+		echo "$(timestamp)";
+		shift;;
+	-U|--url)
+		echo "$(scm_url)";
+		shift;;
+	*)
+		show_help;
+		echo "invalid option: ${1}"
+		exit ${EXIT_FAILURE}
+	esac;
+done
+
+exit ${EXIT_SUCCESS}
