new file mode 100755
@@ -0,0 +1,71 @@
+#!/bin/sh
+
+# Run command on every commit within the range specified. If no command is
+# provided, use the default one to clean and build the whole tree.
+#
+# The default rune is rather simple. To do a cross-build, please put your usual
+# build rune in a shell script and invoke it with this script.
+
+if ! test -f xen/common/kernel.c; then
+ echo "Please run this script from top-level directory"
+ exit 1
+fi
+
+if test $# -lt 2 ; then
+ echo "Usage: $0 <BASE> <TIP> [CMD]"
+ exit 1
+fi
+
+status=`git status -s`
+if test -n "$status"; then
+ echo "Tree is dirty, aborted"
+ exit 1
+fi
+
+BASE=$1; shift
+TIP=$1; shift
+
+ORIG_BRANCH=`git symbolic-ref -q --short HEAD`
+if test $? -ne 0; then
+ echo "Detached HEAD, aborted"
+ exit 1
+fi
+
+git rev-list $BASE..$TIP | nl -ba | tac | \
+while read num rev; do
+ echo "Testing $num $rev"
+
+ git checkout $rev
+ ret=$?
+ if test $ret -ne 0; then
+ echo "Failed to checkout $num $rev with $ret"
+ exit $ret
+ fi
+
+ if test $# -eq 0 ; then
+ git clean -fdx && ./configure && make -j4
+ else
+ "$@"
+ fi
+ ret=$?
+ if test $ret -ne 0; then
+ echo "Failed at $num $rev with $ret"
+ exit $ret
+ fi
+ echo
+done
+
+ret=$?
+
+echo "Restoring original HEAD"
+git checkout $ORIG_BRANCH
+gco_ret=$?
+if test $gco_ret -ne 0; then
+ echo "Failed to restore orignal HEAD. Check tree status before doing anything else!"
+ exit $gco_ret
+fi
+
+if test $ret -eq 0; then
+ echo "ok."
+fi
+exit $ret