Land sisyphus, bug 383286, r=rcampbell
authorbclary@bclary.com
Tue, 12 Jun 2007 08:46:42 -0700
changeset 2294 6c0d328240fc261f6231329b80dee479731ee9c2
parent 2293 bad09f00201b11eddc5555f01743a9b9caf971ae
child 2295 fdbcf68b6874ab3fd150a8909646b77728faf3ff
push idunknown
push userunknown
push dateunknown
reviewersrcampbell
bugs383286
milestone1.9a6pre
Land sisyphus, bug 383286, r=rcampbell
testing/sisyphus/bin/appinfo.js
testing/sisyphus/bin/build.sh
testing/sisyphus/bin/builder.sh
testing/sisyphus/bin/buildinfo.html
testing/sisyphus/bin/check-spider.sh
testing/sisyphus/bin/checkout.sh
testing/sisyphus/bin/clean.sh
testing/sisyphus/bin/combo.sh
testing/sisyphus/bin/create-directory.sh
testing/sisyphus/bin/create-profile.sh
testing/sisyphus/bin/download.sh
testing/sisyphus/bin/each-to-html.pl
testing/sisyphus/bin/edit-talkback.pl
testing/sisyphus/bin/edit-talkback.sh
testing/sisyphus/bin/firefox.diff
testing/sisyphus/bin/get-build-info.html
testing/sisyphus/bin/hdiutil-expect.ex
testing/sisyphus/bin/include.mk
testing/sisyphus/bin/install-build.sh
testing/sisyphus/bin/install-extensions-1.html
testing/sisyphus/bin/install-extensions-2.html
testing/sisyphus/bin/install-extensions.sh
testing/sisyphus/bin/install-plugins.sh
testing/sisyphus/bin/library.sh
testing/sisyphus/bin/master.sed
testing/sisyphus/bin/quit.js
testing/sisyphus/bin/run-mozilla.diff
testing/sisyphus/bin/sayvars.sh
testing/sisyphus/bin/set-build-env.sh
testing/sisyphus/bin/set-msvc6-env.sh
testing/sisyphus/bin/set-msvc8-env.sh
testing/sisyphus/bin/smoke-build.sh
testing/sisyphus/bin/spider.pl
testing/sisyphus/bin/start-spider.html
testing/sisyphus/bin/test-setup.sh
testing/sisyphus/bin/tester.sh
testing/sisyphus/bin/thunderbird.diff
testing/sisyphus/bin/timed_run.py
testing/sisyphus/bin/uninstall-build.sh
testing/sisyphus/bin/userhook-checkspider.js
testing/sisyphus/data/download-check,firefox-1.5.0-ftp,linux.data
testing/sisyphus/data/download-check,firefox-1.5.0-ftp,mac.data
testing/sisyphus/data/download-check,firefox-1.5.0-ftp,win32.data
testing/sisyphus/data/download-check,firefox-2.0.0-ftp,linux.data
testing/sisyphus/data/download-check,firefox-2.0.0-ftp,mac.data
testing/sisyphus/data/download-check,firefox-2.0.0-ftp,win32.data
testing/sisyphus/data/download-check,firefox-all,linux.data
testing/sisyphus/data/download-check,firefox-all,mac.data
testing/sisyphus/data/download-check,firefox-all,win32.data
testing/sisyphus/data/download-check,firefox-all-older,linux.data
testing/sisyphus/data/download-check,firefox-all-older,mac.data
testing/sisyphus/data/download-check,firefox-all-older,win32.data
testing/sisyphus/data/download-check,thunderbird-1.5.0-ftp,linux.data
testing/sisyphus/data/download-check,thunderbird-1.5.0-ftp,mac.data
testing/sisyphus/data/download-check,thunderbird-1.5.0-ftp,win32.data
testing/sisyphus/data/download-check,thunderbird-2.0.0-ftp,linux.data
testing/sisyphus/data/download-check,thunderbird-2.0.0-ftp,mac.data
testing/sisyphus/data/download-check,thunderbird-2.0.0-ftp,win32.data
testing/sisyphus/data/download-check,thunderbird-all,linux.data
testing/sisyphus/data/download-check,thunderbird-all,mac.data
testing/sisyphus/data/download-check,thunderbird-all,win32.data
testing/sisyphus/data/download-check,thunderbird-all-older,linux.data
testing/sisyphus/data/download-check,thunderbird-all-older,mac.data
testing/sisyphus/data/download-check,thunderbird-all-older,win32.data
testing/sisyphus/data/firefox,1.8.0,debug.data
testing/sisyphus/data/firefox,1.8.0,nightly-linux.data
testing/sisyphus/data/firefox,1.8.0,nightly-mac.data
testing/sisyphus/data/firefox,1.8.0,nightly-win32.data
testing/sisyphus/data/firefox,1.8.0,opt.data
testing/sisyphus/data/firefox,1.8.0-test,debug.data
testing/sisyphus/data/firefox,1.8.0-test,opt.data
testing/sisyphus/data/firefox,1.8.1,debug.data
testing/sisyphus/data/firefox,1.8.1,nightly-linux.data
testing/sisyphus/data/firefox,1.8.1,nightly-mac.data
testing/sisyphus/data/firefox,1.8.1,nightly-win32.data
testing/sisyphus/data/firefox,1.8.1,opt.data
testing/sisyphus/data/firefox,1.8.1-test,debug.data
testing/sisyphus/data/firefox,1.8.1-test,opt.data
testing/sisyphus/data/firefox,1.9.0,debug.data
testing/sisyphus/data/firefox,1.9.0,nightly-linux.data
testing/sisyphus/data/firefox,1.9.0,nightly-mac.data
testing/sisyphus/data/firefox,1.9.0,nightly-win32.data
testing/sisyphus/data/firefox,1.9.0,opt.data
testing/sisyphus/data/firefox,1.9.0-test,debug.data
testing/sisyphus/data/firefox,1.9.0-test,opt.data
testing/sisyphus/data/js,1.8.0,debug.data
testing/sisyphus/data/js,1.8.0,opt.data
testing/sisyphus/data/js,1.8.0-test,debug.data
testing/sisyphus/data/js,1.8.0-test,opt.data
testing/sisyphus/data/js,1.8.1,debug.data
testing/sisyphus/data/js,1.8.1,opt.data
testing/sisyphus/data/js,1.8.1-test,debug.data
testing/sisyphus/data/js,1.8.1-test,opt.data
testing/sisyphus/data/js,1.9.0,debug.data
testing/sisyphus/data/js,1.9.0,opt.data
testing/sisyphus/data/js,1.9.0-test,debug.data
testing/sisyphus/data/js,1.9.0-test,opt.data
testing/sisyphus/data/thunderbird,1.8.0,debug.data
testing/sisyphus/data/thunderbird,1.8.0-test,debug.data
testing/sisyphus/data/thunderbird,1.8.1,debug.data
testing/sisyphus/data/thunderbird,1.8.1-test,debug.data
testing/sisyphus/data/thunderbird,1.9.0,debug.data
testing/sisyphus/data/thunderbird,1.9.0-test,debug.data
testing/sisyphus/prefs/mail-user.js
testing/sisyphus/prefs/public-user.js
testing/sisyphus/prefs/test-user.js
testing/sisyphus/talkback/linux/Talkback.ini
testing/sisyphus/talkback/mac/Talkback.ini
testing/sisyphus/talkback/win32/Talkback.ini
testing/sisyphus/tests/mozilla.org/download-page/collect-urls-userhook.js
testing/sisyphus/tests/mozilla.org/download-page/test.sh
testing/sisyphus/tests/mozilla.org/download-page/userhook-ftp.js
testing/sisyphus/tests/mozilla.org/download-page/userhook.js
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/appinfo.js
@@ -0,0 +1,90 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is The Original Code is Mozilla Automated Testing Code
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2005
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary <bob@bclary.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+function AppInfo()
+{
+  // See http://developer.mozilla.org/en/docs/Using_nsIXULAppInfo
+  var appInfo;
+
+  this.vendor          = 'unknown';
+  this.name            = 'unknown';
+  this.ID              = 'unknown';
+  this.version         = 'unknown';
+  this.appBuildID      = 'unknown';
+  this.platformVersion = 'unknown';
+  this.platformBuildID = 'unknown';
+
+  try
+  {
+    netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
+
+    if('@mozilla.org/xre/app-info;1' in Components.classes) 
+    {
+      // running under Mozilla 1.8 or later
+      appInfo = Components
+                  .classes['@mozilla.org/xre/app-info;1']
+                  .getService(Components.interfaces.nsIXULAppInfo);
+
+      this.vendor          = appInfo.vendor;
+      this.name            = appInfo.name;
+      this.ID              = appInfo.ID;
+      this.version         = appInfo.version;
+      this.appBuildID      = appInfo.appBuildID;
+      this.platformVersion = appInfo.platformVersion;
+      this.platformBuildID = appInfo.platformBuildID;
+    }
+  }
+  catch(e)
+  {
+  }
+
+  if (this.vendor == 'unknown')
+  {
+    var ua = navigator.userAgent;
+    var cap = ua.match(/rv:([\d.ab+]+).*Gecko\/(\d{8,8}) ([\S]+)\/([\d.]+)/);
+
+    if (cap && cap.length == 5)
+    {
+      this.vendor          = navigator.vendor ? navigator.vendor : 'Mozilla';
+      this.name            = cap[3];
+      this.version         = cap[4];
+      this.appBuildID      = cap[2] + '00';
+      this.platformVersion = cap[1];
+      this.platformBuildID =  this.appBuildID;
+    }
+  }
+}
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/build.sh
@@ -0,0 +1,121 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+source $TEST_BIN/set-build-env.sh $@
+
+case $product in
+    firefox|thunderbird)
+	cd $TREE/mozilla
+
+	if ! make -f client.mk build 2>&1; then
+	    error "during build"
+	fi
+
+	case "$OSID" in
+	    "mac") 
+		if [[ "$buildtype" == "debug" ]]; then
+		    if [[ "$product" == "firefox" ]]; then
+			executablepath=$product-$buildtype/dist/FirefoxDebug.app/Contents/MacOS
+		    elif [[ "$product" == "thunderbird" ]]; then
+			executablepath=$product-$buildtype/dist/ThunderbirdDebug.app/Contents/MacOS
+		    fi
+		else
+		    if [[ "$product" == "firefox" ]]; then
+			executablepath=$product-$buildtype/dist/Firefox.app/Contents/MacOS
+		    elif [[ "$product" == "thunderbird" ]]; then
+			executablepath=$product-$buildtype/dist/Thunderbird.app/Contents/MacOS
+		    fi
+		fi
+		;;
+	    "linux")
+		executablepath=$product-$buildtype/dist/bin
+		;;
+	esac
+
+	if [[ "$OSID" != "win32" ]]; then
+    #
+    # patch unix-like startup scripts to exec instead of 
+    # forking new processes
+    #
+	    executable=`get_executable $product $branch $executablepath`
+	    if [[ -z "$executable" ]]; then
+		error "get_executable $product $branch $executablepath returned empty path"
+	    fi
+
+
+	    executabledir=`dirname $executable`
+
+    # patch to use exec to prevent forked processes
+	    cd "$executabledir"
+	    if [ -e "$product" ]; then
+		echo "$SCRIPT: patching $product"
+		cp $TEST_BIN/$product.diff .
+		patch -N -p0 < $product.diff
+	    fi
+	    if [ -e run-mozilla.sh ]; then
+		echo "$SCRIPT: patching run-mozilla.sh"
+		cp $TEST_BIN/run-mozilla.diff .
+		patch -N -p0 < run-mozilla.diff
+	    fi
+	fi
+	;;
+    js)
+	cd $TREE/mozilla/js/src
+
+	if [[ $buildtype == "debug" ]]; then
+	    export JSBUILDOPT=
+	else
+	    export JSBUILDOPT=BUILD_OPT=1
+	fi
+
+	if ! make -f Makefile.ref ${JSBUILDOPT} clean 2>&1; then
+	    error "during js/src clean"
+	fi 
+
+	if ! make -f Makefile.ref ${JSBUILDOPT} 2>&1; then
+	    error "during js/src build"
+	fi
+	;;
+esac
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/builder.sh
@@ -0,0 +1,152 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+TEST_LOG=/dev/null
+
+trap 'echo -e "\n*** ERROR ***\n\b" && tail $TEST_LOG' ERR
+
+#
+# options processing
+#
+options="p:b:B:T:e:d:"
+function usage()
+{
+    cat<<EOF
+usage: 
+$SCRIPT -p products -b branches -B buildcommands -T buildtypes [-e extra]
+
+variable            description
+===============     ===========================================================
+-p products         required. one or more of firefox thunderbird
+-b branches         required. one or more of 1.8.0 1.8.1 1.9.0
+-B buildcommands    required. one or more of clean checkout build
+-T buildtypes       required. one or more of opt debug
+-e extra            optional. extra qualifier to pick build tree and mozconfig.
+-d datafiles        optional. one or more filenames of files containing 
+                    environment variable definitions to be included.
+
+                    note that the environment variables should have the same 
+                    names as in the "variable" column.
+EOF
+    exit 2
+}
+
+unset products branches buildcommands buildtypes extra extraflag datafiles
+
+while getopts $options optname ; 
+  do 
+  case $optname in
+      p) products="$OPTARG";;
+      b) branches="$OPTARG";;
+      B) buildcommands="$OPTARG";;
+      T) buildtypes="$OPTARG";;
+      e) extra="-$OPTARG"
+          extraflag="-e $OPTARG";;
+      d) datafiles=$OPTARG;;
+  esac
+done
+
+# include environment variables
+if [[ -n "$datafiles" ]]; then
+    for datafile in $datafiles; do 
+        cat $datafile | sed 's|^|data: |'
+        source $datafile
+    done
+fi
+
+if [[ -z "$products" || -z "$branches" || -z "$buildcommands" || \
+    -z "$buildtypes" ]]; then
+    usage
+fi
+
+# clean first in case checkout changes the configuration
+if echo "$buildcommands" | grep -iq clean; then
+    for product in $products; do
+        for branch in $branches; do
+            for buildtype in $buildtypes; do
+
+                TEST_DATE=`date -u +%Y-%m-%d-%H-%M-%S``date +%z`
+                TEST_LOG="${TEST_DIR}/results/${TEST_DATE},$product,$branch$extra,$buildtype,$OSID,${MACHINE},clean.log"
+
+                echo "writing results to $TEST_LOG"
+
+                clean.sh -p $product -b $branch -T $buildtype $extraflag > $TEST_LOG 2>&1
+
+            done
+        done
+    done
+fi
+
+# if checkout, ignore buildtypes
+if echo "$buildcommands" | grep -iq checkout; then
+    for product in $products; do
+        for branch in $branches; do
+
+            TEST_DATE=`date -u +%Y-%m-%d-%H-%M-%S``date +%z`
+            TEST_LOG="${TEST_DIR}/results/${TEST_DATE},$product,$branch$extra,$buildtype,$OSID,${MACHINE},checkout.log"
+
+            echo "writing results to $TEST_LOG"
+
+
+            checkout.sh -p $product -b $branch -T opt $extraflag > $TEST_LOG 2>&1
+
+        done
+    done
+fi
+
+if echo "$buildcommands" | grep -iq build; then
+    for product in $products; do
+        for branch in $branches; do
+            for buildtype in $buildtypes; do
+
+                TEST_DATE=`date -u +%Y-%m-%d-%H-%M-%S``date +%z`
+                TEST_LOG="${TEST_DIR}/results/${TEST_DATE},$product,$branch$extra,$buildtype,$OSID,${MACHINE}-build.log"
+
+                echo "writing results to $TEST_LOG"
+
+                build.sh -p $product -b $branch -T $buildtype $extraflag > $TEST_LOG 2>&1
+            done
+        done
+    done
+fi
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/buildinfo.html
@@ -0,0 +1,16 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Get Build Information</title>
+<script type="text/javascript" src="appinfo.js"></script>
+</head>
+<body>
+<h1>Get Build Information</h1>
+<script type="text/javascript">
+
+var appInfo = new AppInfo();
+
+document.write(appInfo.toSource());
+
+</script>
+</body>
+</html>
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/check-spider.sh
@@ -0,0 +1,140 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+#
+# options processing
+#
+options="p:b:x:N:d:"
+function usage()
+{
+    cat <<EOF
+usage: 
+$SCRIPT -p product -b branch -x executablepath -N profilename 
+       [-d datafiles]
+
+variable            description
+===============     ============================================================
+-p product          required. firefox|thunderbird
+-b branch           required. 1.8.0|1.8.1|1.9.0
+-x executablepath   required. directory-tree containing executable named 
+                    'product'
+-N profilename      required. name of profile to be used
+-d datafiles        optional. one or more filenames of files containing 
+                    environment variable definitions to be included.
+
+                    note that the environment variables should have the same 
+                    names as in the "variable" column.
+
+Checks if the Spider extension is installed either in the named profile
+or as a global extension, by attempting up to 3 times to launch the Spider.
+
+If Spider fails to launch, the script returns exit code 66.
+
+EOF
+    exit 1
+}
+
+unset product branch executablepath profilename datafiles
+
+while getopts $options optname ; 
+do 
+    case $optname in
+        p) product=$OPTARG;;
+        b) branch=$OPTARG;;
+        x) executablepath=$OPTARG;;
+        N) profilename=$OPTARG;;
+        d) datafiles=$OPTARG;;
+    esac
+done
+
+# include environment variables
+if [[ -n "$datafiles" ]]; then
+    for datafile in $datafiles; do 
+        cat $datafile | sed 's|^|data: |'
+        source $datafile
+    done
+fi
+
+if [[ -z "$product" || -z "$branch" || -z "$executablepath" || -z "$profilename" ]]; 
+then
+    usage
+fi
+
+if [[ "$product" != "firefox" && "$product" != "thunderbird" ]]; then
+    error "product \"$product\" must be one of firefox or thunderbird"
+fi
+
+if [[ "$branch" != "1.8.0" && "$branch" != "1.8.1" && "$branch" != "1.9.0" ]]; 
+then
+    error "branch \"$branch\" must be one of 1.8.0, 1.8.1, 1.9.0"
+fi
+
+executable=`get_executable $product $branch $executablepath`
+
+if [[ -z "$executable" ]]; then
+    error "get_executable $product $branch $executablepath returned empty path"
+fi
+
+if [[ ! -x "$executable" ]]; then 
+    error "executable \"$executable\" is not executable"
+fi
+
+if echo "$profilename" | egrep -qiv '[a-z0-9_]'; then
+    error "profile name must consist of letters, digits or _"
+fi
+
+echo # attempt to force Spider to load
+
+tries=1
+while ! $TEST_BIN/timed_run.py ${TEST_STARTUP_TIMEOUT} "Start Spider: try $tries" \
+    "$executable" -P "$profilename" \
+    -spider -start -quit \
+    -uri "http://${TEST_HTTP}/bin/start-spider.html" \
+    -hook "http://${TEST_HTTP}/bin/userhook-checkspider.js"; do
+  let tries=tries+1
+  if [ "$tries" -gt 3 ]; then
+      echo "Failed to start spider. Exiting..."
+      exit 66
+  fi
+done
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/checkout.sh
@@ -0,0 +1,97 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+source /work/mozilla/mozilla.com/test.mozilla.com/www/bin/set-build-env.sh $@
+
+if [[ -z "$TREE" ]]; then
+    error "source tree not specified!"
+fi
+
+cd $TREE
+
+case $product in
+    firefox|thunderbird)
+        if [[ ! ( -d mozilla && \
+            -e mozilla/client.mk && \
+            -e "mozilla/$project/config/mozconfig" ) ]]; then
+            if ! cvs -z3 -q co $BRANCH_CO_FLAGS \
+                mozilla/client.mk mozilla/$project/config/mozconfig; then
+                error "during checkout of mozconfig"
+            fi
+        fi
+
+        cd mozilla
+
+        if ! make -f client.mk checkout 2>&1; then
+            error "during checkout of tree"
+        fi
+        ;;
+    js) 
+        if [[ ! ( -d mozilla && \
+            -e mozilla/js && \
+            -e mozilla/js/src ) ]]; then
+            cvs -z3 -q co mozilla/js/src
+        fi
+
+        cd mozilla/js/src
+
+        if ! cvs -z3 -q update -d -P 2>&1; then
+            error "during checkout of js/src"
+        fi
+
+        if ! cvs -z3 -q update -d -P -A editline config  2>&1; then
+            error "during checkout of js/src"
+        fi
+# end for js shell
+        ;;
+    *)
+        error "unknown product $product"
+        ;;
+esac
+
+
+
+
+
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/clean.sh
@@ -0,0 +1,62 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+source /work/mozilla/mozilla.com/test.mozilla.com/www/bin/set-build-env.sh $@
+
+case $product in
+    firefox|thunderbird)
+	cd $TREE/mozilla
+
+	if ! make -f client.mk distclean 2>&1; then
+	    error "during client.mk clean"
+	fi
+	;;
+
+    js)
+	cd $TREE/mozilla/js/src
+
+	if ! make -f Makefile.ref clean 2>&1; then
+	    error "during SpiderMonkey clean"
+	fi
+	;;
+esac
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/combo.sh
@@ -0,0 +1,50 @@
+#!/bin/bash -e
+
+delim=,
+
+while getopts "d:" optname;
+  do
+  case $optname in
+      d) delim=$OPTARG;;
+  esac
+done
+
+if [[ $OPTIND -gt 1 ]]; then
+    shift 2
+fi
+    
+
+if [[ -n "$4" ]]; then
+    for a in $1; do for b in $2; do for c in $3; do for d in $4; do echo $a$delim$b$delim$c$delim$d; done; done; done; done
+elif [[ -n "$3" ]]; then
+    for a in $1; do for b in $2; do for c in $3; do echo $a$delim$b$delim$c; done; done; done
+elif [[ -n "$2" ]]; then
+    for a in $1; do for b in $2; do echo $a$delim$b; done; done
+elif [[ -n "$1" ]]; then
+    for a in $1; do echo $a; done
+else
+    cat<<EOF 
+usage: combo.sh [-d delim] list1 [list2 [list3 [list4]]]
+
+output combinations of items in each list using delim as the delimiter
+
+-d delim specifies the delimiter. The default is comma (,).
+
+$combo.sh "a b" 
+a
+b
+
+combo.ah "a b" "1 2" 
+a,1 
+a,2 
+b,1 
+b,2
+
+combo.ah -d "-" "a b" "1 2" 
+a-1 
+a-2 
+b-1 
+b-2
+
+EOF
+fi
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/create-directory.sh
@@ -0,0 +1,119 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+#
+# options processing
+#
+options="d:n"
+function usage()
+{
+    cat <<EOF
+usage: 
+$SCRIPT -d directory [-n] 
+
+-d directory    directory to be created.
+-n              never prompt when removing existing directory.
+
+Attempts to safely create an empty directory. If -n is not
+specified, the script will prompt before deleting any files 
+or directories. If -n is specified, it will not prompt.
+
+The safety measures include refusing to run if run by user
+root and by refusing to create directories unless there are 
+a subdirectory of /tmp or have at least two ancestor 
+directories... /grandparent/parent/child.
+
+******************** WARNING ********************
+This script will destroy existing directories and
+their contents. It can potentially wipe out your
+disk. Use with caution.
+******************** WARNING ********************
+
+EOF
+    exit 2
+}
+
+unset directory
+
+rmopt="-i"
+
+while getopts $options optname ; 
+do 
+    case $optname in
+        d) directory=$OPTARG;;
+        n) unset rmopt;;
+    esac
+done
+
+if [[ -z $directory ]]
+then
+    usage
+fi
+
+if [[ `whoami` == "root" ]]; then
+    error "can not be run as root"
+fi
+
+# get the cannonical name directory name
+mkdir -p "$directory"
+if ! pushd "$directory" > /dev/null ; then 
+    error "$directory is not accessible"
+fi
+directory=`pwd`
+popd > /dev/null
+
+if [[ "$directory" == "/" ]]; then
+    error "directory $directory can not be root"
+fi
+
+parent=`dirname "$directory"`
+grandparent=`dirname "$parent"`
+
+if [[ "$parent" != "/tmp" && ( "$parent" == "/" || "$grandparent" == "/" ) ]]; then
+    error "directory $directory can not be a subdirectory of $parent"
+fi
+
+
+# clean the directory if requested
+rm -fR $rmopt $directory
+mkdir -p "$directory"
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/create-profile.sh
@@ -0,0 +1,155 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+#
+# options processing
+#
+options="p:b:x:D:N:L:U:d:"
+function usage()
+{
+    cat <<EOF
+usage: 
+$SCRIPT -p product -b branch -x executablepath -D directory -N profilename 
+       [-L profiletemplate] [-U user] [-d datafiles]
+
+variable            description
+===============     ============================================================
+-p product          required. firefox|thunderbird
+-b branch           required. 1.8.0|1.8.1|1.9.0
+-x executablepath   required. directory-tree containing executable 'product'
+-D directory        required. directory where profile is to be created.
+-N profilename      required. profile name 
+-L profiletemplate  optional. location of a template profile to be used. 
+-U user             optional. user.js preferences file.
+-d datafiles        optional. one or more filenames of files containing 
+                    environment variable definitions to be included.
+
+                    note that the environment variables should have the same 
+                    names as in the "variable" column.
+EOF
+    exit 1
+}
+
+unset product branch executablepath directory profilename profiletemplate user datafiles
+
+while getopts $options optname ; 
+do 
+    case $optname in
+        p) product=$OPTARG;;
+        b) branch=$OPTARG;;
+        x) executablepath=$OPTARG;;
+        D) directory=$OPTARG;;
+        N) profilename=$OPTARG;;
+        L) profiletemplate=$OPTARG;;
+        U) user=$OPTARG;;
+        d) datafiles=$OPTARG;;
+    esac
+done
+
+# include environment variables
+if [[ -n "$datafiles" ]]; then
+    for datafile in $datafiles; do 
+        cat $datafile | sed 's|^|data: |'
+        source $datafile
+    done
+fi
+
+if [[ -z "$product" || -z "$branch" || -z "$executablepath" || \
+    -z "$directory" || -z "$profilename" ]]; then
+    usage
+fi
+
+if [[ "$product" != "firefox" && "$product" != "thunderbird" ]]; then
+    error "product \"$product\" must be one of firefox or thunderbird"
+fi
+
+if [[ "$branch" != "1.8.0" && "$branch" != "1.8.1" && "$branch" != "1.9.0" ]]; 
+then
+    error "branch \"$branch\" must be one of 1.8.0, 1.8.1, 1.9.0"
+fi
+
+executable=`get_executable $product $branch $executablepath`
+
+if [[ -z "$executable" ]]; then
+    error "get_executable $product $branch $executablepath returned empty path"
+fi
+
+if [[ ! -x "$executable" ]]; then 
+    error "executable \"$executable\" is not executable"
+fi
+
+$TEST_BIN/create-directory.sh -d "$directory" -n 
+
+if echo "$profilename" | egrep -qiv '[a-z0-9_]'; then
+    error "profile name \"$profilename\" must consist of letters, digits or _"
+fi
+
+if [ $OSID == "win32" ]; then
+    directoryospath=`cygpath -a -w $directory`
+    if [[ -z "$directoryospath" ]]; then
+	    error "unable to convert unix path to windows path"
+    fi
+else
+    directoryospath="$directory"
+fi
+
+echo "creating profile $profilename in directory $directory"
+
+if ! $TEST_BIN/timed_run.py ${TEST_STARTUP_TIMEOUT} "-" $executable -CreateProfile "$profilename $directoryospath"; then
+	error "creating profile $directory"
+fi
+
+if [[ -n $profiletemplate ]]; then
+	if [[ ! -d $profiletemplate ]]; then
+	    error "profile template directory $profiletemplate does not exist"
+	fi
+	echo "copying template profile $profiletemplate to $directory"
+	cp -R $profiletemplate/* $directory
+fi
+
+if [[ ! -z $user ]]; then
+    cp $user $directory/user.js
+fi
+
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/download.sh
@@ -0,0 +1,132 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2005.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+args=$@
+script=`basename $0`
+
+#
+# options processing
+#
+options="u:c:f:t:d:"
+function usage()
+{
+    cat <<EOF
+$SCRIPT $args
+
+usage: 
+$SCRIPT -u url [-c credentials] -f filepath [-t timeout] [-d datafiles]
+
+variable            description
+===============     ============================================================
+-u url              required. url to download build from
+-c credentials      optional. username:password
+-f filepath         required. path to filename to store downloaded file
+-t timeout          optional. timeout in seconds before download fails.
+                    default 300 seconds
+-d datafiles        optional. one or more filenames of files containing 
+                    environment variable definitions to be included.
+
+                    note that the environment variables should have the same 
+                    names as in the "variable" column.
+
+downloads file from url with optional authentication credentials
+saving the file to filepath. If the path to the file does not exist,
+it is created. If the download takes longer than timeout seconds,
+the download is cancelled.
+
+EOF
+    exit 2
+}
+
+unset url credentials filepath timeout datafiles
+
+while getopts $options optname ; 
+  do 
+  case $optname in
+      u) url=$OPTARG;;
+      c) credentials=$OPTARG;;
+      f) filepath=$OPTARG;;
+      t) timeout=$OPTARG;;
+      d) datafiles=$OPTARG;;
+  esac
+done
+
+# include environment variables
+if [[ -n "$datafiles" ]]; then
+    for datafile in $datafiles; do 
+        cat $datafile | sed 's|^|data: |'
+        source $datafile
+    done
+fi
+
+if [[ -z $url || -z $filepath ]]
+    then
+    usage
+fi
+
+if [[ -n "$credentials" ]]; then
+    auth="--user $credentials"
+fi
+
+timeout=${timeout:-300}
+
+
+path=`dirname $filepath`
+
+if [[ -z "$path" ]]; then
+    echo "$SCRIPT: ERROR filepath path is empty"
+    exit 2
+fi
+
+echo "url=$url filepath=$filepath credentials=$credentials timeout=$timeout"
+
+# curl options
+# -S show error if failure
+# -s silent mode
+# -L follow 3XX redirections
+# -m $timeout time out 
+# -D - dump headers to stdout
+# --create-dirs create path if needed
+
+if ! curl -LsS -m $timeout "$url" -D - --create-dirs -o $filepath $auth; then
+    echo "$SCRIPT: FAIL Unable to download $url"
+    exit 2
+fi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/each-to-html.pl
@@ -0,0 +1,97 @@
+#!/usr/bin/perl
+# -*- Mode: Perl; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is Mozilla Automated Testing Code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s): Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+use URI::Escape;
+use lib "$ENV{HOME}/projects/mozilla.com/test.mozilla.com/www/bin/";
+
+my $hook       = shift @ARGV || usage("hook");
+my $sitelist   = shift @ARGV || usage("sitelist");
+
+open SITES, "<$sitelist" || die "unable to open $sitelist\n";
+
+my @sites = <SITES>;
+
+close SITES;
+
+my $site;
+
+my $chromeurl;
+my $testUrl;
+
+print "<html><body>\n";
+
+foreach $site (@sites)
+{
+
+    chomp $site;
+
+    my $spider = "chrome://spider/content/spider.xul?" .
+        "depth=0&timeout=120&waittime=5&hooksignal=on&autostart=on&autoquit=on&javascripterrors=off&" .
+        "javascriptwarnings=off&chromeerrors=on&xblerrors=on&csserrors=off&" .
+        "scripturl=" . 
+        uri_escape("http://" . 
+                   $ENV{TEST_HTTP} . 
+                   $hook) . 
+                   "&" .
+                   "url=" . uri_escape(uri_escape($site));
+
+    print "<a href=\"$spider\">$site\</a><br>\n";
+}
+print "</html>\n";
+
+sub usage
+{
+    my $arg = shift @_;
+    
+    print <<USAGE;
+
+Error in $arg.
+
+Usage: each-to-html.pl hook sitelist
+
+Create an HTML page containing links to invoke Spider with the 
+appropriate URL and parameters.
+
+hook       - path to userhook script
+sitelist   - path to text file containing list of sites, 
+             one to a line
+USAGE
+
+exit 2;
+}
+
+1;
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/edit-talkback.pl
@@ -0,0 +1,380 @@
+#!/usr/bin/perl
+# -*- Mode: Perl; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is Mozilla Automated Testing Code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s): Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+use File::Basename;
+use File::Copy;
+use Cwd;
+
+#my $DEBUG = 0;
+#editTalkback("/tmp/test/firefox-1.5-nightly-opt/firefox/firefox", "talkbackid");
+
+1;
+
+sub editTalkback
+{
+    my ($binary, $talkbackid) = @_;
+    my $rc;
+    my $signal;
+    my $home = $ENV{HOME};
+    my $os = undef;
+    my $ostype = "";
+
+    # prevent replacements due to & in urls
+    $talkbackid =~ s/&/\\&/g;
+    
+    # hack around lack of available environment entries in both
+    # cygwin perl and redhat perl
+    open OSTYPE, "set | grep OSTYPE |" || die "Unable to open OSTYPE: $!";
+    while (<OSTYPE>)
+    {
+        chomp;
+        $ostype .= $_;
+    }
+    close OSTYPE;
+
+    die "Unable to determine OSTYPE" if (!$ostype);
+
+    if ($ostype =~ /cygwin/i)
+    {
+        $os = "win32";
+    }
+    elsif ($ostype =~ /linux/i)
+    {
+        $os = "linux";
+    }
+    elsif ($ostype =~ /darwin/)
+    {
+        $os = "mac";
+    }
+    else
+    {
+        die "Unknown Operating System: $ostype";
+    }
+
+    if (!$binary)
+    {
+        die "binary argument missing";
+    }
+
+    if (! -f $binary)
+    {
+        die "$binary does not exist";
+    }
+
+    my $installpath = dirname($binary);
+
+    #print "installpath=$installpath\n";
+
+    if (! -d $installpath)
+    {
+        die "$installpath does not exist";
+    }
+
+#
+# edit talkback to automatically submit
+#
+    my $talkback=1;
+
+    if ( -e "$installpath/extensions/talkback\@mozilla.org/components/master.ini")
+    {
+        chdir "$installpath/extensions/talkback\@mozilla.org/components/";
+    }
+    elsif ( -e "$installpath/extensions/talkback\@mozilla.org/components/talkback/master.ini")
+    {
+        chdir "$installpath/extensions/talkback\@mozilla.org/components/talkback/";
+    }
+    elsif ( -e "$installpath/components/master.ini")
+    {
+        chdir "$installpath/components";
+    }
+    else
+    { 
+        #print "Talkback not installed.\n";
+        $talkback=0 ;
+    }
+
+    if ( $talkback == 1 )
+    {
+        # edit to automatically send talkback incidents
+        if ( -e "master.sed")
+        {
+            #print "talkback master.ini already edited\n";
+        }
+        else
+        {
+            #print "editing talkback master.ini in " . cwd() . "\n";
+            copy("/work/mozilla/mozilla.com/test.mozilla.com/www/bin/master.sed", "master.sed");
+            system(("sed", "-ibak", "-f", "master.sed", "master.ini"));
+
+            $rc = $? >> 8;
+            $signal = $? & 127;
+            $dumped = $? & 128;
+            if ($rc != 0)
+            {
+                die "non zero exitcode editing master.ini: $!";
+            }
+            if ($signal)
+            {
+                #print "signal $signal editing master.ini\n";
+            }
+        }
+
+        open MASTER, "master.ini" || die "unable to open master.ini: $!";
+        while (<MASTER>)
+        {
+            chomp $_;
+            if (/VendorID = "([^"]*)"/)
+	    {
+		($vendorid) = $1;
+	    }
+	    elsif (/ProductID = "([^"]*)"/)
+                              {
+                                  ($productid) = $1;
+                              }
+                              elsif (/PlatformID = "([^"]*)"/)
+	    {
+		($platformid) = $1;
+	    }
+	    elsif (/BuildID = "([^"]*)"/)
+                            {
+                                ($buildid) = $1;
+                            }
+                        }
+        close MASTER;
+
+        if ("$DEBUG")
+        {
+            print "vendorid=$vendorid\n";
+            print "productid=$productid\n";
+            print "platformid=$platformid\n";
+            print "buildid=$buildid\n";
+        }
+
+        my $appdata;
+
+        if ($os eq "win32")
+        {
+            # get application data directory in windows format
+            $appdata = $ENV{APPDATA};
+            if (!$appdata)
+            {
+                die "Empty Windows Application Data directory\n";
+            }
+
+            open PATH, "cygpath -d \"$appdata\"|" || die "Unable to open cygpath: $!";
+            my $path = "";
+            while (<PATH>)
+            {
+                chomp;
+                $path .= $_;
+            }
+            close PATH;
+            $path =~ s/\\/\\\\/g;
+
+            if (!$path)
+            {
+                die "Unable to convert Windows Application Data directory to short format\n";
+            }
+
+            # convert application data directory to unix format
+            $appdata = "";
+            open PATH, "cygpath -u $path|" || die "unable to open cygpath: $!";
+            while (<PATH>)
+            {
+                chomp;
+                $appdata .= $_;
+            }
+            close PATH;
+            if (!$appdata)
+            {
+                die "Unix format Windows Application Data directory is empty\n";
+            }
+            $talkbackdir = "$appdata/Talkback";
+        }
+        elsif ($os eq "linux")
+        {
+            $talkbackdir="$home/.fullcircle";
+        }
+        elsif ($os eq "mac")
+        {
+            $talkbackdir="$home/Library/Application\ Support/FullCircle";
+        }
+        else
+        {
+            die "unknown os $os";
+        }
+
+
+        if ( ! -e "$talkbackdir" )
+        {
+            if (! mkdir "$talkbackdir", 755)
+            {
+                die "unable to create $talkbackdir\n: $!";
+            }
+        }
+
+        my $talkbackinidir;
+
+        if ($os eq "win32")
+        {
+            $talkbackinidir="$talkbackdir/$vendorid/$productid/$platformid/$buildid/";
+
+            if ( ! -e "$talkbackdir/$vendorid" )
+            {
+                if (! mkdir "$talkbackdir/$vendorid", 755)
+                {
+                    die "unable to make $talkbackdir/$vendorid: $!";
+                }
+            }
+
+            if (! -e "$talkbackdir/$vendorid/$productid")
+            {
+                if (! mkdir "$talkbackdir/$vendorid/$productid", 755)
+                {
+                    die "unable to make $talkbackdir/$vendorid/$productid: $!";
+                }
+            }
+
+
+            if (! -e "$talkbackdir/$vendorid")
+            {
+                if (! mkdir "$talkbackdir/$vendorid/$productid/$platformid", 755)
+                {
+                    die "unable to make $talkbackdir/$vendorid/$productid/$platformid: $!";
+                }
+            }
+
+
+            if (! -e "$talkbackdir/$vendorid/$productid/$platformid")
+            {
+                if (! mkdir "$talkbackdir/$vendorid/$productid/$platformid", 755)
+                {
+                    die "unable to make $talkbackdir/$vendorid/$productid/$platformid: $!";
+                }
+            }
+
+            if ( ! -e "$talkbackdir/$vendorid/$productid/$platformid/$buildid")
+            {
+                if (! mkdir "$talkbackdir/$vendorid/$productid/$platformid/$buildid", 755)
+                {
+                    die "unable to make $talkbackdir/$vendorid/$productid/$platformid/$buildid: $!";
+                }
+            }
+        }
+        elsif ($os eq "linux")
+        {
+            $talkbackinidir="$talkbackdir/$vendorid$productid$platformid$buildid";
+            if (! -e "$talkbackdir/$vendorid$productid$platformid$buildid" )
+            {
+                if (! mkdir "$talkbackdir/$vendorid$productid$platformid$buildid", 755)
+                {
+                    die "unable to make $talkbackdir/$vendorid$productid$platformid$buildid: $!";
+                }
+            }
+        }
+        elsif ($os eq "mac")
+        {
+            $talkbackinidir="$talkbackdir/$vendorid$productid$platformid$buildid";
+            if (! -e "$talkbackdir/$vendorid$productid$platformid$buildid" )
+            {
+                if (! mkdir "$talkbackdir/$vendorid$productid$platformid$buildid", 755)
+                {
+                    die "unable to make $talkbackdir/$vendorid$productid$platformid$buildid: $!";
+                }
+            }
+        }
+        else
+        {
+            die "$os not supported yet";
+        }
+
+        if (! chdir $talkbackinidir)
+        {
+            die "unable to cd $talkbackinidir: $!";
+        }
+
+
+        if (!copy("/work/mozilla/mozilla.com/test.mozilla.com/www/talkback/$os/Talkback.ini", "Talkback.ini"))
+        {
+            die "unable to copy Talkback.ini: $!";
+        }
+        
+        #print "patching Talkback.ini\n";
+        if ($os eq "win32")
+        {
+            $rc = system(("sed", 
+                          "-ibak", 
+                          "-e", 
+                          "s|URLEdit .*|URLEdit = \"mozqa:$talkbackid\"|", 
+                          "Talkback.ini")) & 0xffff;
+            if ($rc != 0)
+            {
+                die "unable to edit Talkback.ini: $!";
+            }
+        }
+        elsif ($os eq "linux")
+        {
+            $rc = system(("sed", 
+                          "-ibak", 
+                          "-e",
+                          "s|URLEditControl .*|URLEditControl = \"mozqa:$talkbackid\"|", 
+                          "Talkback.ini")) & 0xffff;
+            if ($rc != 0)
+            {
+                die "unable to edit Talkback.ini: $!";
+            }
+        }
+        elsif ($os eq "mac")
+        {
+            $rc = system(("sed", 
+                          "-ibak", 
+                          "-e",
+                          "s|URLEditControl .*|URLEditControl = \"mozqa:$talkbackid\"|", 
+                          "Talkback.ini")) & 0xffff;
+            if ($rc != 0)
+            {
+                die "unable to edit Talkback.ini: $!";
+            }
+        }
+        else
+        {
+            die "$os not supported yet";
+        }
+    }
+}
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/edit-talkback.sh
@@ -0,0 +1,201 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+#
+# options processing
+#
+options="p:b:x:i:d:"
+function usage()
+{
+    cat <<EOF
+usage: 
+$SCRIPT -p product -b branch -x executablepath -i talkbackid [-d datafiles]
+
+variable            description
+===============     ============================================================
+-p product          required. firefox|thunderbird
+-b branch           required. 1.8.0|1.8.1|1.9.0
+-x executablepath   required. directory-tree containing executable named 
+                    'product'
+-i talkbackid       required. identifier to add to talkback url
+-d datafiles        optional. one or more filenames of files containing 
+                    environment variable definitions to be included.
+
+                    note that the environment variables should have the same 
+                    names as in the "variable" column.
+EOF
+    exit 1
+}
+
+unset product branch executablepath talkbackid datafiles
+
+while getopts $options optname ; 
+do 
+    case $optname in
+        p) product=$OPTARG;;
+        b) branch=$OPTARG;;
+        x) executablepath=$OPTARG;;
+        i) talkbackid=$OPTARG;;
+        d) datafiles=$OPTARG;;
+    esac
+done
+
+# include environment variables
+if [[ -n "$datafiles" ]]; then
+    for datafile in $datafiles; do 
+        cat $datafile | sed 's|^|data: |'
+        source $datafile
+    done
+fi
+
+if [[ -z "$product" || -z "$branch" || \
+    -z "$executablepath" || -z "$talkbackid" ]]; then
+    usage
+fi
+
+executable=`get_executable $product $branch $executablepath`
+
+if [[ -z "$executable" ]]; then
+    error "get_executable $product $branch $executablepath returned empty path"
+fi
+
+if [[ ! -x "$executable" ]]; then 
+    error "executable \"$executable\" is not executable"
+fi
+
+executablepath=`dirname $executable`
+
+# escape & in talkback id to prevent replacements
+talkbackid=`echo $talkbackid | sed 's@&@\\\\&@g'`
+
+#
+# edit talkback to automatically submit
+#
+talkback=1
+
+if [[ -e "$executablepath/extensions/talkback@mozilla.org/components/master.ini" ]]; then
+    cd "$executablepath/extensions/talkback@mozilla.org/components/"
+elif [[ -e "$executablepath/extensions/talkback@mozilla.org/components/talkback/master.ini" ]]; then
+    cd "$executablepath/extensions/talkback@mozilla.org/components/talkback/"
+elif [[ -e "$executablepath/components/master.ini" ]]; then
+    cd "$executablepath/components"
+else 
+    # talkback not found
+    talkback=0 
+fi
+
+if [[ $talkback -eq 1 ]]; then
+    # edit to automatically send talkback incidents
+    if [[ ! -e master.sed ]]; then
+    #echo "$0: editing talkback master.ini in `pwd`"
+        cp $TEST_BIN/master.sed .
+        sed -f master.sed -ibak master.ini
+    fi
+
+    if [[ "$OSID" == "mac" ]]; then
+        vendorid=`grep '^VendorID = "' master.ini | sed 's@VendorID = "\([^"]*\)"@\1@'`
+        productid=`grep '^ProductID = "' master.ini | sed 's@ProductID = "\([^"]*\)"@\1@'`
+        platformid=`grep '^PlatformID = "' master.ini | sed 's@PlatformID = "\([^"]*\)"@\1@'`
+        buildid=`grep '^BuildID = "' master.ini | sed 's@BuildID = "\([^"]*\)"@\1@'`
+    else
+        vendorid=`dos2unix < master.ini | grep '^VendorID = "' | sed 's@VendorID = "\([^"]*\)"@\1@'`
+        productid=`dos2unix < master.ini | grep '^ProductID = "' | sed 's@ProductID = "\([^"]*\)"@\1@'`
+        platformid=`dos2unix < master.ini | grep '^PlatformID = "' | sed 's@PlatformID = "\([^"]*\)"@\1@'`
+        buildid=`dos2unix < master.ini | grep '^BuildID = "' | sed 's@BuildID = "\([^"]*\)"@\1@'`
+    fi
+
+    case $OSID in
+        "win32")
+            appdata=`cygpath -a -d "$APPDATA"`
+            talkbackdir="`cygpath -a -u $appdata`/Talkback"
+            ;;
+        "linux")
+            talkbackdir="$HOME/.fullcircle"
+            ;;
+        "mac" )
+            # hack around Mac's use of spaces in directory names
+            talkbackdir="$HOME/Library/Application Support/FullCircle"
+            IFS=:
+            ;;
+        *)
+            error "unknown os $OSID"
+            ;;
+    esac
+
+    if [[ -z "$talkbackdir" ]]; then
+        error "empty talkback directory"
+    fi
+
+    mkdir -p "$talkbackdir"
+    
+    case $OSID in
+        win32)
+            talkbackinidir="$talkbackdir/$vendorid/$productid/$platformid/$buildid"
+            ;;
+        "linux" | "mac" )
+            talkbackinidir="$talkbackdir/$vendorid$productid$platformid$buildid"
+            ;;
+    esac
+    
+    if [[ ! -d "$talkbackinidir" ]]; then
+        create-directory.sh -d "$talkbackinidir" -n
+    fi
+
+    cd $talkbackinidir
+
+    cp /work/mozilla/mozilla.com/test.mozilla.com/www/talkback/$OSID/Talkback.ini .
+
+    case "$OSID" in
+        "win32")
+            sed -ibak "s@URLEdit .*@URLEdit = \"mozqa:$talkbackid\"@" Talkback.ini
+            ;;
+        "linux" )
+            sed -ibak "s@URLEditControl .*@URLEditControl = \"mozqa:$talkbackid\"@" Talkback.ini
+            ;;
+        "mac" )
+            sed -ibak "s@URLEditControl .*@URLEditControl = \"mozqa:$talkbackid\"@" Talkback.ini
+            ;;
+        *)
+            error "unknown os=$OSID"
+    esac
+fi
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/firefox.diff
@@ -0,0 +1,11 @@
+--- firefox	2005-08-18 06:28:49.000000000 -0700
++++ firefox.test	2005-08-18 19:39:34.813357354 -0700
+@@ -178,7 +178,7 @@
+ then
+   echo $dist_bin/run-mozilla.sh $script_args $dist_bin/$MOZILLA_BIN "$@"
+ fi
+-"$dist_bin/run-mozilla.sh" $script_args "$dist_bin/$MOZILLA_BIN" "$@"
++exec "$dist_bin/run-mozilla.sh" $script_args "$dist_bin/$MOZILLA_BIN" "$@"
+ exitcode=$?
+ 
+ ## Stop addon scripts
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/get-build-info.html
@@ -0,0 +1,20 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Get Build Information</title>
+<script type="text/javascript" src="quit.js"></script>
+<script type="text/javascript" src="appinfo.js"></script>
+</head>
+<body>
+<h1>Get Build Information</h1>
+<script type="text/javascript">
+
+
+var appInfoSource = (new AppInfo()).toSource();
+
+document.write(appInfoSource);
+dump(appInfoSource);
+
+goQuitApplication();
+</script>
+</body>
+</html>
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/hdiutil-expect.ex
@@ -0,0 +1,9 @@
+#!/usr/bin/expect 
+
+spawn hdiutil attach $argv
+
+expect {
+"byte" {send "G"; exp_continue}
+"Y/N"  {send "Y\r"; exp_continue}
+}
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/include.mk
@@ -0,0 +1,9 @@
+dashes   = ----------
+msg = @echo "$(1)": $(dashes) $(2) $(dashes)
+prepend = sed 's/^/$(1): /'
+html2text = lynx --dump $(1)
+TEST_PROFILE?=TEST
+
+dumpvars = echo TARGETS=$$targets && for var in `echo $${!TEST_*}`; do echo $${var}=$${!var}; done
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/install-build.sh
@@ -0,0 +1,174 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+#
+# options processing
+#
+options="p:b:x:f:d:"
+function usage()
+{
+    cat <<EOF
+usage: 
+$SCRIPT -p product -b branch  -x executablepath -f filename [-d datafiles]
+
+variable            description
+===============     ============================================================
+-p product          required. firefox|thunderbird
+-b branch           required. 1.8.0|1.8.1|1.9.0
+-x executablepath   required. directory where to install build
+-f filename         required. path to filename where installer is stored
+-d datafiles        optional. one or more filenames of files containing 
+                    environment variable definitions to be included.
+
+                    note that the environment variables should have the same 
+                    names as in the "variable" column.
+
+EOF
+    exit 2
+}
+
+unset product branch executablepath filename datafiles
+
+while getopts $options optname ; 
+do 
+    case $optname in
+        p) product=$OPTARG;;
+        b) branch=$OPTARG;;
+        x) executablepath=$OPTARG;;
+        f) filename=$OPTARG;;
+        d) datafiles=$OPTARG;;
+    esac
+done
+
+# include environment variables
+if [[ -n "$datafiles" ]]; then
+    for datafile in $datafiles; do 
+        cat $datafile | sed 's|^|data: |'
+        source $datafile
+    done
+fi
+
+if [[ -z "$product" || -z "$branch" || -z "$executablepath" || -z "$filename" ]]
+then
+    usage
+fi
+
+${TEST_BIN}/uninstall-build.sh -p "$product" -b "$branch" -x "$executablepath"
+
+${TEST_BIN}/create-directory.sh -d "$executablepath" -n
+
+filetype=`file $filename`
+
+if [[ $OSID == "win32" ]]; then
+
+    if echo $filetype | grep -iq windows; then
+	    chmod u+x "$filename"
+	    if [[ $branch == "1.8.0" ]]; then
+	        $filename -ms -hideBanner -dd `cygpath -a -w "$executablepath"`
+	    else
+	        $filename /S /D=`cygpath -a -w "$executablepath"`
+	    fi
+    elif echo  $filetype | grep -iq 'zip archive'; then
+	    unzip -o -d "$executablepath" "$filename"
+    else
+	    error "$unknown file type $filetype"
+    fi
+
+else
+    
+    if [[ $OSID == "linux" ]]; then
+
+	    if echo $filetype | grep -iq 'bzip2'; then
+	        tar -jxvf $filename -C "$executablepath"
+	    elif echo $filetype | grep -iq 'gzip'; then
+	        tar -zxvf $filename -C "$executablepath" 
+	    else
+	        error "unknown file type $filetype"
+	    fi
+
+    elif [[ $OSID == "mac" ]]; then
+        # answer license prompt
+        result=`${TEST_BIN}/hdiutil-expect.ex $filename`
+        # now get the volume data
+	    #result=`hdiutil attach $filename`
+	    disk=`echo $result | sed 's@.*\(/dev/[^ ]*\).*/dev.*/dev.*@\1@'`
+        # remove the carriage return inserted by expect
+	    volume=`echo $result | sed "s|[^a-zA-Z0-9/]||g" | sed 's@.*\(/Volumes/.*\)@\1@'`
+	    echo "disk=$disk"
+	    echo "volume=$volume"
+	    if [[ -z "$disk" || -z "$volume" ]]; then
+	        error "mounting disk image: $result"
+	    fi
+
+        for app in $volume/*.app; do
+            cp -R $app $executablepath
+        done
+
+	    hdiutil detach $disk
+
+    fi
+
+    #
+    # patch unix-like startup scripts to exec instead of 
+    # forking new processes
+    #
+    executable=`get_executable $product $branch $executablepath`
+    if [[ -z "$executable" ]]; then
+        error "get_executable $product $branch $executablepath returned empty directory"
+    fi
+    executabledir=`dirname $executable`
+
+    # patch to use exec to prevent forked processes
+    cd "$executabledir"
+    if [ -e "$product" ]; then
+	    echo "$SCRIPT: patching $product"
+	    cp $TEST_BIN/$product.diff .
+	    patch -N -p0 < $product.diff
+    fi
+    if [ -e run-mozilla.sh ]; then
+	    echo "$SCRIPT: patching run-mozilla.sh"
+	    cp $TEST_BIN/run-mozilla.diff .
+	    patch -N -p0 < run-mozilla.diff
+    fi
+fi
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/install-extensions-1.html
@@ -0,0 +1,15 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Install Extensions - 1</title>
+<script type="text/javascript" src="quit.js"></script>
+</head>
+<body>
+<h1>Install Extensions - 1</h1>
+<p>
+First restart to install extensions...
+</p>
+<script type="text/javascript">
+	setTimeout("goQuitApplication()", 10000);
+</script>
+</body>
+</html>
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/install-extensions-2.html
@@ -0,0 +1,15 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Install Extensions - 2</title>
+<script type="text/javascript" src="quit.js"></script>
+</head>
+<body>
+<h1>Install Extensions - 2</h1>
+<p>
+Second restart to install extensions...
+</p>
+<script type="text/javascript">
+	setTimeout("goQuitApplication()", 10000);
+</script>
+</body>
+</html>
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/install-extensions.sh
@@ -0,0 +1,166 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2005.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+echo "$SCRIPT $@"
+
+#
+# options processing
+#
+options="p:b:x:N:E:d:"
+function usage()
+{
+    cat <<EOF
+usage: 
+$SCRIPT -p product -b branch -x executablepath -N profilename -E extensions 
+       [-d datafiles]
+
+variable            description
+===============     ============================================================
+-p product          required. firefox|thunderbird
+-b branch           required. 1.8.0|1.8.1|1.9.0
+-x executablepath   required. directory-tree containing executable named 
+                    'product'
+-N profilename      required. profile name 
+-E extensions       required. path to directory containing xpis to be installed
+-d datafiles        optional. one or more filenames of files containing 
+                    environment variable definitions to be included.
+
+                    note that the environment variables should have the same 
+                    names as in the "variable" column.
+
+EOF
+    exit 1
+}
+
+unset product branch executablepath profilename extensions datafiles
+
+while getopts $options optname ; 
+do 
+    case $optname in
+        p) product=$OPTARG;;
+        b) branch=$OPTARG;;
+        x) executablepath=$OPTARG;;
+        N) profilename=$OPTARG;;
+        E) extensions=$OPTARG;;
+        d) datafiles=$OPTARG;;
+    esac
+done
+
+# include environment variables
+if [[ -n "$datafiles" ]]; then
+    for datafile in $datafiles; do 
+        cat $datafile | sed 's|^|data: |'
+        source $datafile
+    done
+fi
+
+if [[ -z "$product" || -z "$branch" || \
+    -z "$executablepath" || -z "$profilename" || -z "$extensions" ]]; then
+    usage
+fi
+
+if [[ "$product" != "firefox" && "$product" != "thunderbird" ]]; then
+    error "product \"$product\" must be one of firefox or thunderbird"
+fi
+
+if [[ "$branch" != "1.8.0" && "$branch" != "1.8.1" && "$branch" != "1.9.0" ]]; 
+then
+    error "branch \"$branch\" must be one of 1.8.0, 1.8.1, 1.9.0"
+fi
+
+executable=`get_executable $product $branch $executablepath`
+
+if [[ -z "$executable" ]]; then
+    error "get_executable $product $branch $executablepath returned empty path"
+fi
+
+if [[ ! -x "$executable" ]]; then 
+    error "executable \"$executable\" is not executable"
+fi
+
+if echo $profilename | egrep -qiv '[a-z0-9_]'; then
+    error "profile name must consist of letters, digits or _"
+fi
+
+for extension in $extensions/all/*; do 
+    if [[ $extension == "$extensions/all/*" ]]; then
+	    break
+    fi
+    if [[ "$OSID" == "win32" ]]; then
+        extensionos=`cygpath -a -w $extension`
+    else
+        extensionos="$extension"
+    fi
+
+    echo installing $extension
+    $TEST_BIN/timed_run.py ${TEST_STARTUP_TIMEOUT} "-" $executable -P $profilename -install-global-extension "$extensionos"
+    # there is no reliable method of determining if the install worked 
+    # from the output or from the exit code.
+done
+
+for extension in $extensions/$OSID/*; do 
+    if [[ $extension == "$extensions/$OSID/*" ]]; then
+	    break
+    fi
+    if [[ "$OSID" == "win32" ]]; then
+        extensionos=`cygpath -a -w $extension`
+    else
+        extensionos="$extension"
+    fi
+
+    echo installing $extension
+    $TEST_BIN/timed_run.py ${TEST_STARTUP_TIMEOUT} "-" $executable -P $profilename -install-global-extension "$extensionos"
+done
+
+# restart twice to make extension manager happy
+
+if ! $TEST_BIN/timed_run.py ${TEST_STARTUP_TIMEOUT} "install extensions - first restart" \
+    $executable -P $profilename "http://${TEST_HTTP}/bin/install-extensions-1.html"; then
+    echo "Ignoring 1st failure to load the install-extensions page"
+fi
+
+if ! $TEST_BIN/timed_run.py ${TEST_STARTUP_TIMEOUT} "install extensions - second restart" \
+    $executable -P $profilename "http://${TEST_HTTP}/bin/install-extensions-2.html"; then
+    echo "Ignoring 2nd failure to load the install-extensions page"
+fi
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/install-plugins.sh
@@ -0,0 +1,118 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+#
+# options processing
+#
+options="p:b:x:D:d:"
+function usage()
+{
+    cat <<EOF
+usage: 
+$SCRIPT -p product -b branch -x executablepath -D directory [-d datafiles]
+
+variable            description
+===============     ============================================================
+-p product          required. firefox|thunderbird
+-b branch           required. 1.8.0|1.8.1|1.9.0
+-x executablepath   required. path to browser executable
+-D directory        required. path to location of plugins/components
+-d datafiles        optional. one or more filenames of files containing 
+                    environment 
+                    variable definitions to be included.
+
+                    note that the environment variables should have the same 
+                    names as in the "variable" column.
+
+EOF
+    exit 1
+}
+
+unset product branch executablepath directory datafiles
+
+while getopts $options optname ; 
+do 
+    case $optname in
+        p) product=$OPTARG;;
+        b) branch=$OPTARG;;
+        x) executablepath=$OPTARG;;
+        D) directory=$OPTARG;;
+        d) datafiles=$OPTARG;;
+    esac
+done
+
+# include environment variables
+if [[ -n "$datafiles" ]]; then
+    for datafile in $datafiles; do 
+        cat $datafile | sed 's|^|data: |'
+        source $datafile
+    done
+fi
+
+if [[ -z "$product" || -z "$branch" || \
+    -z "$executablepath" || -z "$directory" ]]; then
+    usage
+fi
+
+if [[ "$product" != "firefox" && "$product" != "thunderbird" ]]; then
+    error "product \"$product\" must be one of firefox or thunderbird"
+fi
+
+executable=`get_executable $product $branch $executablepath`
+
+if [[ -z "$executable" ]]; then
+    error "get_executable $product $branch $executablepath returned empty path"
+fi
+
+if [[ ! -x "$executable" ]]; then 
+    error "executable \"$executable\" is not executable"
+fi
+
+executablepath=`dirname $executable`
+
+#
+# install plugins and components
+#
+echo "$SCRIPT: installing plugins from $directory/ in $executablepath/"
+cp -r "$directory/$OSID/" "$executablepath/"
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/library.sh
@@ -0,0 +1,167 @@
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+# This script contains a number of variables, functions, etc which 
+# are reused across a number of scripts. It should be included in each
+# script as follows:
+#
+# TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+# TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+# source ${TEST_BIN}/library.sh
+#
+
+echo "calling $0 $@"
+
+# export variables
+set -a 
+
+# error message
+# output error message end exit 2
+
+error()
+{
+    echo "error in script $SCRIPT: $1"
+    if [[ "$0" == "-bash" || "$0" == "bash" ]]; then
+        return 0
+    fi
+    exit 2
+} 
+
+# get_executable product branch directory
+# writes path to product executable to stdout
+
+get_executable()
+{
+    get_executable_product="$1"
+    get_executable_branch="$2"
+    get_executable_directory="$3"
+
+    if [[ -z "$get_executable_product" || \
+        -z "$get_executable_branch" || \
+        -z "$get_executable_directory" ]]; then
+        error "usage: get_executable product branch directory"
+    elif [[ ! -d "$get_executable_directory" ]]; then
+        error "get_executable: executable directory \"$get_executable_directory\" does not exist"
+    else
+        # should use /u+x,g+x,a+x but mac os x uses an obsolete find
+        # filter the output to remove extraneous file in dist/bin for
+        # cvs builds on mac os x.
+        get_executable_name="$get_executable_product${EXE_EXT}"
+        if [[ "$OSID" == "mac" ]]; then
+            get_executable_filter="Contents/MacOS/$get_executable_product"
+            if [[ "$get_executable_product" == "thunderbird" ]]; then
+                get_executable_name="$get_executable_product-bin"
+            fi
+        else
+            get_executable_filter="$get_executable_product"
+        fi
+        if find "$get_executable_directory" -perm +111 -type f \
+            -name "$get_executable_name" | \
+            grep "$get_executable_filter"; then
+            true
+        fi
+    fi
+}
+
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+TEST_HTTP=${TEST_HTTP:-test.mozilla.com}
+TEST_STARTUP_TIMEOUT=${TEST_STARTUP_TIMEOUT:-30}
+
+# set path to make life easier
+PATH=${TEST_DIR}/bin:$PATH
+
+# make pipelines return exit code of intermediate steps
+# requires bash 3.x
+set -o pipefail 
+
+if [[ "$0" == "-bash" || "$0" == "bash" ]]; then
+    SCRIPT="library.sh"
+else
+    SCRIPT=`basename $0`
+fi
+
+# save starting directory
+STARTDIR=`pwd`
+
+# change working directory to the location of the script.
+SCRIPTDIR=`dirname $0`
+cd $SCRIPTDIR
+
+# set time format for pipeline timing reports
+TIMEFORMAT="Elapsed time %0R seconds, User %0U seconds, System %0S seconds, CPU %P%%"
+
+# don't attach to running instance
+MOZ_NO_REMOTE=1
+
+# don't restart
+NO_EM_RESTART=1
+
+# bypass profile manager
+MOZ_BYPASS_PROFILE_AT_STARTUP=1
+
+# ah crap handler timeout
+MOZ_GDB_SLEEP=10
+
+# no dialogs on asserts
+XPCOM_DEBUG_BREAK=warn
+
+#leak gauge
+#NSPR_LOG_MODULES=DOMLeak:5,DocumentLeak:5,nsDocShellLeak:5
+
+MALLOC_CHECK_=2
+
+MACHINE=`uname -n`
+
+ulimit -c 0
+
+if echo $OSTYPE | grep -iq cygwin; then
+    OSID=win32
+    EXE_EXT=".exe"
+elif echo $OSTYPE | grep -iq Linux; then
+    OSID=linux
+    EXE_EXT=
+elif echo $OSTYPE | grep -iq darwin; then
+    OSID=mac
+    EXE_EXT=
+else
+    error "Unknown OS $OSTYPE"
+fi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/master.sed
@@ -0,0 +1,3 @@
+s/DisableDontAsk = 0/DisableDontAsk = 1/
+s/DisableUI = 0/DisableUI = 1/
+s/DisableWizard = 0/DisableWizard = 1/
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/quit.js
@@ -0,0 +1,143 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is The Original Code is Mozilla Automated Testing Code
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2005
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary <bob@bclary.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*
+  From mozilla/toolkit/content
+  These files did not have a license
+*/
+
+function canQuitApplication()
+{
+  var os = Components.classes["@mozilla.org/observer-service;1"]
+    .getService(Components.interfaces.nsIObserverService);
+  if (!os) 
+  {
+    return true;
+  }
+  
+  try 
+  {
+    var cancelQuit = Components.classes["@mozilla.org/supports-PRBool;1"]
+      .createInstance(Components.interfaces.nsISupportsPRBool);
+    os.notifyObservers(cancelQuit, "quit-application-requested", null);
+    
+    // Something aborted the quit process. 
+    if (cancelQuit.data)
+    {
+      return false;
+    }
+  }
+  catch (ex) 
+  {
+  }
+  os.notifyObservers(null, "quit-application-granted", null);
+  return true;
+}
+
+function goQuitApplication()
+{
+  const privs = 'UniversalPreferencesRead UniversalPreferencesWrite ' +
+    'UniversalXPConnect';
+
+  try
+  {
+    netscape.security.PrivilegeManager.enablePrivilege(privs);
+  }
+  catch(ex)
+  {
+    throw('goQuitApplication: privilege failure ' + ex);
+  }
+
+  if (!canQuitApplication())
+  {
+    return false;
+  }
+
+  const kAppStartup = '@mozilla.org/toolkit/app-startup;1';
+  const kAppShell   = '@mozilla.org/appshell/appShellService;1';
+  var   appService;
+  var   forceQuit;
+
+  if (kAppStartup in Components.classes)
+  {
+    appService = Components.classes[kAppStartup].
+      getService(Components.interfaces.nsIAppStartup);
+    forceQuit  = Components.interfaces.nsIAppStartup.eForceQuit;
+
+  }
+  else if (kAppShell in Components.classes)
+  {
+    appService = Components.classes[kAppShell].
+      getService(Components.interfaces.nsIAppShellService);
+    forceQuit = Components.interfaces.nsIAppShellService.eForceQuit;
+  }
+  else
+  {
+    throw 'goQuitApplication: no AppStartup/appShell';
+  }
+
+  var windowManager = Components.
+    classes['@mozilla.org/appshell/window-mediator;1'].getService();
+
+  var windowManagerInterface = windowManager.
+    QueryInterface(Components.interfaces.nsIWindowMediator);
+
+  var enumerator = windowManagerInterface.getEnumerator(null);
+
+  while (enumerator.hasMoreElements())
+  {
+    var domWindow = enumerator.getNext();
+    if (("tryToClose" in domWindow) && !domWindow.tryToClose())
+    {
+      return false;
+    }
+    domWindow.close();
+  }
+
+  try
+  {
+    appService.quit(forceQuit);
+  }
+  catch(ex)
+  {
+    throw('goQuitApplication: ' + ex);
+  }
+
+  return true;
+}
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/run-mozilla.diff
@@ -0,0 +1,11 @@
+--- run-mozilla.sh	2004-04-18 10:17:09.000000000 -0400
++++ run-mozilla.sh.test	2005-08-18 22:27:42.906250000 -0400
+@@ -163,7 +163,7 @@
+ 	##
+ 	## Run the program
+ 	##
+-	"$prog" ${1+"$@"}
++	exec "$prog" ${1+"$@"}
+ 	exitcode=$?
+ 	if [ "$DEBUG_CORE_FILES" ]
+ 	then
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/sayvars.sh
@@ -0,0 +1,6 @@
+#!/usr/local/bin/bash -e 
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+
+    for var in `echo ${!TEST_*}`; do 
+	echo ${var}=${!var} >> $TEST_LOG 
+    done
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/set-build-env.sh
@@ -0,0 +1,226 @@
+#!/usr/local/bin/bash
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+export BUILDDIR=/work/mozilla/builds
+export SHELL=/usr/local/bin/bash
+export CONFIG_SHELL=/usr/local/bin/bash
+export CONFIGURE_ENV_ARGS=/usr/local/bin/bash 
+export MOZ_CVS_FLAGS="-z3 -q"
+export CVSROOT=:pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot
+export MOZILLA_OFFICIAL=1
+export BUILD_OFFICIAL=1
+
+#
+# options processing
+#
+options="p:b:T:e:"
+usage()
+{
+    cat <<EOF
+
+usage: set-build-env.sh -p product -b branch -T buildtype [-e extra]
+
+-p product      [firefox|thunderbird]
+-b branch       [1.8.0|1.8.1|1.9.0]
+-T buildtype    [opt|debug]
+-e extra        extra qualifier to pick mozconfig and tree
+
+EOF
+}
+
+myexit()
+{
+    myexit_status=$1
+
+    case $0 in
+	*bash*)
+	  # prevent "sourced" script calls from 
+          # exiting the current shell.
+	    break 99;;
+	*)
+	    exit $myexit_status;;
+    esac
+}
+
+for step in step1; do # dummy loop for handling exits
+
+    unset product branch buildtype extra
+
+    while getopts $options optname ; 
+      do 
+      case $optname in
+	  p) product=$OPTARG;;
+	  b) branch=$OPTARG;;
+	  T) buildtype=$OPTARG;;
+	  e) extra=$OPTARG;;
+      esac
+    done
+
+# echo product=$product, branch=$branch, buildtype=$buildtype, extra=$extra
+
+    if [[ -z "$product" || -z "$branch" || -z "$buildtype" ]]; then
+	echo -n "missing"
+	if [[ -z "$product" ]]; then
+	    echo -n " -p product"
+	fi
+	if [[ -z "$branch" ]]; then
+	    echo -n " -b branch"
+	fi
+	if [[ -z "$buildtype" ]]; then
+	    echo -n " -T buildtype"
+	fi
+	usage
+	myexit 2
+    fi
+
+    if [[ $branch == "1.8.0" ]]; then
+	export BRANCH_CO_FLAGS="-r MOZILLA_1_8_0_BRANCH"
+    elif [[ $branch == "1.8.1" ]]; then
+	export BRANCH_CO_FLAGS="-r MOZILLA_1_8_BRANCH"
+    elif [[ $branch == "1.9.0" ]]; then
+	export BRANCH_CO_FLAGS="";
+    else
+	echo "Unknown branch: $branch"
+	myexit 2
+    fi
+
+    if [[ -n "$WINDIR" ]] ; then
+	OSID=win32
+#	app=bin
+	export platform=i686
+
+	if echo $branch | egrep -q '^1\.8'; then
+	    export MOZ_TOOLS="/work/mozilla/moztools"
+	    source /work/mozilla/mozilla.com/test.mozilla.com/www/bin/set-msvc6-env.sh
+	else
+	    export MOZ_TOOLS="/work/mozilla/moztools-static"
+	    source /work/mozilla/mozilla.com/test.mozilla.com/www/bin/set-msvc8-env.sh
+	fi
+
+	echo moztools Location: $MOZ_TOOLS
+
+    elif uname | grep -iq darwin ; then
+	OSID=mac
+	export platform=`uname -p`
+#	if [[ "$product" == "firefox" ]]; then
+#	    app=Firefox
+#	elif [[ "$product" == "thunderbird" ]]; then
+#	    app=Thunderbird
+#	else
+#	    echo "Unsupported product: $product"
+#	    myexit 2
+#	fi
+#	if [[ "$buildtype" == "debug" ]]; then
+#	    app="${app}Debug"
+#	fi
+#	app="${app}.app"
+#	export APPBIN="$app/Content/MacOS"
+    else
+	OSID=linux
+#	export APPBIN=bin
+	export platform=i686
+    fi
+
+    if [[ -z $extra ]]; then
+	export TREE="$BUILDDIR/$branch"
+    else
+	export TREE="$BUILDDIR/$branch-$extra"
+
+	#
+	# extras can't be placed in mozconfigs since not all parts
+	# of the build system use mozconfig (e.g. js shell) and since
+	# the obj directory is not configurable for them as well thus
+	# requiring separate source trees
+	#
+
+	if [[ "$extra" == "too-much-gc" ]]; then
+	    export XCFLAGS="-DWAY_TOO_MUCH_GC=1"
+	    export CFLAGS="-DWAY_TOO_MUCH_GC=1"
+	    export CXXFLAGS="-DWAY_TOO_MUCH_GC=1"
+	elif [[ "$extra" == "gcov" ]]; then
+
+	    if [[ "$OSID" == "win32" ]]; then
+		echo "win32 does not support gcov"
+		myexit 2
+	    fi
+	    export CFLAGS="--coverage"
+	    export CXXFLAGS="--coverage"
+	    export XCFLAGS="--coverage"
+	    export OS_CFLAGS="--coverage"
+	    export LDFLAGS="--coverage"
+	    export XLDOPTS="--coverage"	
+	fi
+    fi
+
+    if [[ ! -d $TREE ]]; then
+	echo "Build directory $TREE does not exist"
+	myexit 2
+    fi
+
+    # here project refers to either browser or mail
+    # and is used to find mozilla/(browser|mail)/config/mozconfig
+    if [[ $product == "firefox" ]]; then
+	project=browser
+	export MOZCONFIG="$TREE/mozconfig-firefox-$OSID-$platform-$buildtype"
+    elif [[ $product == "thunderbird" ]]; then
+	project=mail
+	export MOZCONFIG="$TREE/mozconfig-thunderbird-$OSID-$platform-$buildtype"
+    else
+	echo "Assuming project=browser for product: $product"
+	project=browser
+	export MOZCONFIG="$TREE/mozconfig-firefox-$OSID-$platform-$buildtype"
+    fi
+
+    # js shell builds
+    if [[ $buildtype == "debug" ]]; then
+	unset BUILD_OPT
+    else
+	export BUILD_OPT=1
+    fi
+
+    if [[ $OSID == "mac" ]]; then
+	export JS_EDITLINE=1 # required for mac
+    fi
+    # end js shell builds
+
+    set | sed 's/^/environment: /'
+    echo "mozconfig: $MOZCONFIG"
+    cat $MOZCONFIG | sed 's/^/mozconfig: /'
+done
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/set-msvc6-env.sh
@@ -0,0 +1,69 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+# Root of Visual Developer Studio Common files.
+export VSCommonDir='C:\Program Files\Microsoft Visual Studio\Common'
+export VSCommonDir_cyg=`cygpath -u "$VSCommonDir"`
+
+# Root of Visual Developer Studio installed files.
+export MSDevDir='C:\Program Files\Microsoft Visual Studio\Common\MSDev98'
+export MSDevDir_cyg=`cygpath -u "$MSDevDir"`
+
+# Root of Visual C++ installed files.
+export MSVCDir='C:\Program Files\Microsoft Visual Studio\VC98'
+export MSVCDir_cyg=`cygpath -u "$MSVCDir"`
+
+# VcOsDir is used to help create either a Windows 95 or Windows NT specific path.
+export VcOsDir=WIN95
+if [[ "$OS" == "Windows_NT" ]]; then
+    export VcOsDir=WINNT
+fi
+
+echo Setting environment for using Microsoft Visual C++ tools.
+
+if [[ "$OS" == "Windows_NT" ]]; then
+    export PATH="$MSDevDir_cyg/Bin":"$MSVCDir_cyg/Bin":"$VSCommonDir_cyg/Tools/$VcOsDir":"$VSCommonDir_cyg/Tools":"$MOZ_TOOLS/bin":"$PATH"
+elif [[ "$OS" == "" ]]; then
+    export PATH="$MSDevDir_cyg/Bin":"MSVCDir_cyg/Bin":"$VSCommonDir_cyg/Tools/$VcOsDir":"$VSCommonDir_cyg/Tools":"$windir/SYSTEM":$MOZ_TOOLS/bin:"$PATH"
+fi
+
+export INCLUDE="$MSVCDir\\ATL\\Include;$MSVCDir\\Include;$MSVCDir\\MFC\\Include;$INCLUDE"
+export LIB="$MSVCDir\\Lib;$MSVCDir\\MFC\\Lib;$LIB"
+
+unset VcOsDir
+unset VSCommonDir
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/set-msvc8-env.sh
@@ -0,0 +1,95 @@
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+export VSINSTALLDIR='C:\Program Files\Microsoft Visual Studio 8'
+export VS80COMNTOOLS='C:\Program Files\Microsoft Visual Studio 8\Common7\Tools\'
+export VCINSTALLDIR='C:\Program Files\Microsoft Visual Studio 8\VC'
+export FrameworkDir='C:\WINDOWS\Microsoft.NET\Framework'
+export FrameworkVersion='v2.0.50727'
+export FrameworkSDKDir='C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0'
+
+export VSINSTALLDIR_cyg="/cygdrive/c/Program Files/Microsoft Visual Studio 8"
+export VCINSTALLDIR_cyg="/cygdrive/c/Program Files/Microsoft Visual Studio 8/VC"
+
+export DevEnvDir="$VSINSTALLDIR\\Common7\\IDE"
+export DevEnvDir_cyg="$VSINSTALLDIR_cyg/Common7/IDE"
+
+export MSVCDir="$VCINSTALLDIR"
+export MSVCDir_cyg="$VCINSTALLDIR_cyg"
+
+
+if [ -d "$MSVCDir_cyg"/PlatformSDK ] ; then
+    export PlatformSDKDir="$MSVCDir"\\PlatformSDK
+    export PlatformSDKDir_cyg="$MSVCDir_cyg"/PlatformSDK
+elif [ -d "/cygdrive/c/Program Files/Microsoft Platform SDK" ] ; then
+    export PlatformSDKDir='C:\Program Files\Microsoft Platform SDK'
+    export PlatformSDKDir_cyg='/cygdrive/c/Program Files/Microsoft Platform SDK'
+else
+    echo Can\'t find Platform SDK\!
+    break 2
+fi
+
+echo Platform SDK Location: $PlatformSDKDir_cyg
+
+if [ ! -f "$MOZ_TOOLS"/lib/libIDL-0.6_s.lib ] ; then
+    echo Can\'t find moztools\!  Edit this file and check MOZ_TOOLS path.
+fi
+
+
+export PATH="\
+$DevEnvDir_cyg:\
+$PlatformSDKDir_cyg/bin:\
+$MSVCDir_cyg/bin:\
+$VSINSTALLDIR_cyg/Common7/Tools:\
+$VSINSTALLDIR_cyg/Common7/Tools/bin:\
+$MOZ_TOOLS/bin:\
+$PATH"
+
+        export INCLUDE="\
+$MSVCDir\ATLMFC\INCLUDE;\
+$MSVCDir\INCLUDE;\
+$PlatformSDKDir\include;\
+$FrameworkSDKDir\include;\
+$INCLUDE"
+
+         export LIB="\
+$MSVCDir\ATLMFC\LIB;\
+$MSVCDir\LIB;\
+$PlatformSDKDir\lib;\
+$FrameworkSDKDir\lib;\
+$LIB" 
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/smoke-build.sh
@@ -0,0 +1,90 @@
+#!/usr/local/bin/bash -e
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+if [[ -z "$1" ]]; then
+  echo smoke-build.sh directorypattern
+  exit 2
+fi
+
+for filepath in $@; do
+    echo $filepath
+
+    base=`basename $filepath`
+
+    version=`echo $base|sed 's/[^0-9.]*\([0-9]*\).*/\1/'`
+    product=`echo $base|sed 's/\([^-]*\)-.*/\1/'`
+
+    case $version in
+	1) branch=1.8.0;;
+	2) branch=1.8.1;;
+	3) branch=1.9.0;;
+    esac
+
+    echo $product $branch
+
+    install-build.sh  -p "$product" -b "$branch" -x "/tmp/$product-$branch" \
+	-f "$filepath"
+
+    if [[ "$product" == "thunderbird" ]]; then
+	template="-L ${TEST_DIR}/profiles/imap"
+    else
+	unset template
+    fi
+
+    create-profile.sh -p "$product" -b "$branch" \
+	-x "/tmp/$product-$branch" \
+	-D "/tmp/$product-$branch-profile" -N "$product-$branch-profile" \
+	-U ${TEST_DIR}/prefs/test-user.js \
+	$template
+
+    install-extensions.sh -p "$product" -b "$branch" \
+	-x "/tmp/$product-$branch" \
+	-N "$product-$branch-profile" \
+	-E ${TEST_DIR}/xpi
+
+    check-spider.sh -p "$product" -b "$branch" \
+	-x "/tmp/$product-$branch" \
+	-N "$product-$branch-profile"
+
+    uninstall-build.sh  -p "$product" -b "$branch" -x "/tmp/$product-$branch"
+
+done
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/spider.pl
@@ -0,0 +1,257 @@
+#!/usr/bin/perl
+# -*- Mode: Perl; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is Mozilla Automated Testing Code
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2005
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s): Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+# make unbuffered
+select STDERR; $| = 1;
+select STDOUT; $| = 1;
+
+my $TEST_BIN  = $ENV{TEST_BIN} || "/work/mozilla/mozilla.com/test.mozilla.com/www/bin/";
+
+use File::Temp qw/ tempfile tempdir /;
+use File::Basename;
+use Getopt::Mixed "nextOption";
+use URI::Escape;
+use Time::HiRes qw(sleep);
+
+my $DEBUG = 0;
+
+my $product      = "";
+my $executable   = "";
+my $profile      = "";
+my $url          = "";
+my $domain       = "";
+my $depth        = 0;
+my $timeout      = 0;
+my $wait         = 0;
+my $hook         = "";
+my $start        = "off";
+my $quit         = "off";
+my $robot        = "off";
+my $debug        = "off";
+my $jserrors     = "off";
+my $jswarnings   = "off";
+my $chromeerrors = "off";
+my $xblerrors    = "off";
+my $csserrors    = "off";
+
+parse_options();
+
+my $hookon       = ($hook ? "on" : "off");
+my $runtime = dirname($executable);
+
+chdir $runtime or 
+    die "spider.pl: unable to change directory to runtime $runtime";
+
+
+my $chromeurl;
+
+my $testUrl;
+
+my $spider = "chrome://spider/content/spider.xul?" .
+    "domain=$domain&" .
+    "depth=$depth&" . 
+    "timeout=$timeout" .
+    "&waittime=$wait&" .
+    "autostart=$start&" .
+    "autoquit=$quit&" .
+    "javascripterrors=$jserrors&" .
+    "javascriptwarnings=$jswarnings&" .
+    "chromeerrors=$chromeerrors&" .
+    "xblerrors=$xblerrors&" .
+    "csserrors=$csserrors&" .
+    "hooksignal=$hookon&" .
+    "url=" . uri_escape(uri_escape($url));
+
+if ($hook)
+{
+    $spider .= "&scripturl=" .  uri_escape($hook);
+}
+
+my @args;
+my $rc;
+my $signal;
+my $dumped;
+
+if ($product eq "thunderbird")
+{
+    @args = ($executable, "-P", $profile, $spider);
+}
+else
+{
+    @args = ($executable, "-P", $profile, "-chrome", $spider);
+}
+
+system @args;
+$rc = $? >> 8;
+
+if ($rc == 99)
+{
+    exit $rc;
+}
+
+sub usage
+{
+    my $arg   = shift @_;
+    my $value = shift @_;
+
+    print <<USAGE;
+
+    Error in $arg: $value
+
+Usage: spider.pl --product=product --executable=exe --profile=profile --url=url --domain=domain --depth=depth --timeout=timeout --wait=wait --hook=hook 
+--start --quit --robot --debug --jserrors --jswarnings --chromeerrors --xblerrors --csserrors
+
+Invoke Spider a set of urls.
+
+product      - firefox|thunderbird
+exe          - path to browser executable
+profile      - profile name
+url          - url to spider
+domain       - domain
+depth        - depth each url is to be spidered
+timeout      - time in seconds before Spider times out loading a page
+wait         - pause spider after each page
+hook         - url to Spider userhook script
+start        - auto start
+quit         - auto quit
+robot        - obey robots.txt
+debug        - spider debug
+jserrors     - javascript errors
+jswarnings   - javascript warnings
+chromeerrors - chrome errors
+xblerrors    - xbl errors
+csserrors    - css errors
+USAGE
+exit(2);
+}
+
+sub parse_options {
+    my ($option_data, $option, $value, $lastop);
+
+    $option_data = 'product=s executable=s profile=s url=s domain=i depth=i timeout=i wait=i hook=s wait=i start  quit robot debug jserrors jswarnings chromeerrors xblerrors csserrors';
+
+    Getopt::Mixed::init ($option_data);
+    $Getopt::Mixed::order = $Getopt::Mixed::RETURN_IN_ORDER;
+
+    $valgrind = 0;
+
+    while (($option, $value) = nextOption()) 
+    {
+        if ($option eq "product")
+        {
+            $product = $value;
+        }
+        elsif ($option eq "executable")
+        {
+            $executable = $value;
+        }
+        elsif ($option eq "profile")
+        {
+            $profile = $value;
+        }
+        elsif ($option eq "url")
+        {
+            $url = $value;
+        }
+        elsif ($option eq "domain")
+        {
+            $domain = $value;
+        }
+        elsif ($option eq "depth")
+        {
+            $depth = $value;
+        }
+        elsif ($option eq "timeout")
+        {
+            $timeout = $value;
+        }
+        elsif ($option eq "wait")
+        {
+            $wait = $value;
+        }
+        elsif ($option eq "hook")
+        {
+            $hook = $value;
+        }
+        elsif ($option eq "start")
+        {
+            $start = "on";
+        }
+        elsif ($option eq "quit")
+        {
+            $quit = "on";
+        }
+        elsif ($option eq "robot")
+        {
+            $robot = "on";
+        }
+        elsif ($option eq "debug")
+        {
+            $debug = "on";
+        }
+        elsif ($option eq "jserrors")
+        {
+            $jserrors = "on";
+        }
+        elsif ($option eq "jswarnings")
+        {
+            $jswarnings = "on";
+        }
+        elsif ($option eq "chromeerrors")
+        {
+            $chromeerrors = "on";
+        }
+        elsif ($option eq "xblerrors")
+        {
+            $xblerrors = "on";
+        }
+        elsif ($option eq "csserrors")
+        {
+            $csserrors = "on";
+        }
+        $lastopt = $option;
+    }
+
+    Getopt::Mixed::cleanup();
+
+    if ($product ne "firefox" && $product ne "thunderbird")
+    {
+        usage("product", $product);
+    }
+}
+1;
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/start-spider.html
@@ -0,0 +1,11 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Start Spider</title>
+</head>
+<body>
+<h1>Start Spider</h1>
+<p>
+Initialize Spider...
+</p>
+</body>
+</html>
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/test-setup.sh
@@ -0,0 +1,252 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+#
+# options processing
+#
+options="p:b:u:f:c:B:T:x:N:D:L:U:E:d:"
+function usage()
+{
+    cat<<EOF
+usage: 
+$SCRIPT -p product -b branch
+       [-u url [-f filepath] [-c credentials]] 
+       [-B buildcommands -T buildtype] 
+       [-x executablepath]
+       [-N profilename [-D profiledirectory [-L profiletemplate 
+         [-U userpreferences]]]]
+       [-E extensiondir]
+       [-d datafiles] 
+
+variable            description
+===============     ===========================================================
+-p product          required. one of firefox thunderbird
+-b branch           required. one of 1.8.0 1.8.1 1.9.0
+-u url              optional. url where to download build
+-f filepath         optional. location to save downloaded build or to find
+                    previously downloaded build. If not specified, the
+                    default will be the basename of the url saved to the
+                    /tmp directory. If there is no basename, then the
+                    filepath will be /tmp/\$product-\$branch-file.
+-B buildcommands    optional. one or more of clean checkout build
+-T buildtype        optional. one of opt debug
+-x executablepath   optional. directory tree containing executable with same 
+                    name as product. If the build is downloaded and executable 
+                    path is not specified, it will be defaulted to 
+                    /tmp/\$product-\$branch. 
+                    For cvs builds it will be defaulted to the appropriate 
+                    directory in 
+                    /work/mozilla/builds/\$branch/mozilla/\$product-\$buildtype/
+-N profilename      optional. profilename. profilename is required if 
+                    profiledirectory or extensiondir are specified.
+-D profiledirectory optional. If profiledirectory is specified, a new profile 
+                    will be created in the directory.
+-L profiletemplate  optional. If a new profile is created, profiletemplate is 
+                    the path to an existing profile which will be copied over 
+                    the new profile.
+-U userpreferences  optional. If a new profile is created, userpreferences is 
+                    the path to a user.js file to be copied into the new 
+                    profile.
+                    If userpreferences is not specified when a new profile is 
+                    created, it is defaulted to
+                    /work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+-E extensiondir     optional. path to directory tree containing extensions to 
+                    be installed.
+-d datafiles        optional. one or more filenames of files containing 
+                    environment variable definitions to be included.
+
+                    note that the environment variables should have the same 
+                    names as in the "variable" column.
+EOF
+    exit 2
+}
+
+unset product branch url filepath credentials buildcommands buildtype executablepath profilename profiledirectory profiletemplate userpreferences extenstiondir datafiles
+
+while getopts $options optname ; 
+  do 
+  case $optname in
+      p) product="$OPTARG";;
+      b) branch="$OPTARG";;
+
+      u) url="$OPTARG";;
+      f) filepath="$OPTARG";;
+      c) credentials="$OPTARG";;
+
+      B) buildcommands="$OPTARG";;
+      T) buildtype="$OPTARG";;
+
+      x) executablepath="$OPTARG";;
+
+      N) profilename="$OPTARG";;
+      D) profiledirectory="$OPTARG";;
+      L) profiletemplate="$OPTARG";;
+      U) userpreferences="$OPTARG";;
+
+      E) extensiondir="$OPTARG";;
+
+      d) datafiles="$OPTARG";;
+  esac
+done
+
+# include environment variables
+if [[ -n "$datafiles" ]]; then
+    for datafile in $datafiles; do 
+        cat $datafile | sed 's|^|data: |'
+        source $datafile
+    done
+fi
+
+if [[ -z "$product" || -z "$branch" ]]; then
+    echo "product and branch are required"
+    usage
+fi
+
+if [[ ( -n "$url" || -n "$filepath" ) && ( -n "$buildcommands" ) ]]; then
+    echo "you can not both download and build cvs builds at the same time"
+    usage
+fi
+
+if [[ -n "$buildcommands" && -n "$executablepath" ]]; then
+    echo "You can not specify the executable path and build cvs builds at the same time"
+    usage
+fi
+
+if [[ (-n "$profiledirectory" || -n "$extensiondir" ) && -z "$profilename" ]]; then
+    echo "You must specify a profilename if you specify a profiledirectory or extensiondir"
+    usage
+fi
+
+# if the url is specified but not the filepath
+# generate a default path where to save the 
+# downloaded build.
+if [[ -n "$url" && -z "$filepath" ]]; then
+    filepath=`basename $url`
+    if [[ -z "$filepath" ]]; then
+        filepath="$product-$branch-file"
+    fi
+    filepath="/tmp/$filepath"
+fi
+
+if [[ -n "$url" ]]; then
+    download.sh -u "$url" -c "$credentials" -f "$filepath" -t "$TEST_DOWNLOAD_TIMEOUT"
+fi
+
+# install the build at the specified filepath
+if [[ -n "$filepath" ]]; then
+    if [[ -z "$executablepath" ]]; then
+        executablepath="/tmp/$product-$branch"
+    fi
+    install-build.sh -p $product -b $branch -x $executablepath -f $filepath
+fi
+
+if [[ -n "$buildcommands" ]]; then
+
+    if [[ -z "$buildtype" ]]; then
+        echo "You must specify a buildtype if you are building from cvs"
+        usage
+    elif [[ "$buildtype" != "opt" && "$buildtype" != "debug" ]]; then
+        echo "buildtype must be one of opt debug"
+        usage
+    fi
+
+    if [[ "$OSID" == "mac" ]]; then
+        if [[ "$product" == "firefox" ]]; then
+            App=Firefox
+        elif [[ "$product" == "thunderbird" ]]; then
+            App=Thunderbird
+        fi
+        if [[ "$buildtype" == "debug" ]]; then
+            AppType=Debug
+        fi
+        executablepath="/work/mozilla/builds/$branch/mozilla/$product-$buildtype/dist/$App$AppType.app/Contents/MacOS"
+    else
+        executablepath="/work/mozilla/builds/$branch/mozilla/$product/$buildtype/dist/bin"
+    fi
+
+    if echo "$buildcommands" | grep -iq clean; then
+        clean.sh -p $product -b $branch -t $buildtype
+    fi
+
+    if echo "$buildcommands" | grep -iq checkout; then
+        checkout.sh -p $product -b $branch -t $buildtype
+    fi
+
+    if echo "$buildcommands" | grep -iq build; then
+        build.sh -p $product -b $branch -t $buildtype
+    fi
+
+fi
+
+if [[ -n "$profiledirectory" ]]; then
+
+    if [[ -z "$userpreferences" ]]; then
+        userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+    fi
+
+    unset optargs
+    if [[ -n "$profiletemplate" ]]; then
+        optargs="$optargs -L $profiletemplate"
+    fi
+    if [[ -n "$userpreferences" ]]; then
+        optargs="$optargs -U $userpreferences"
+    fi
+
+    create-profile.sh -p $product -b $branch \
+        -x $executablepath -D $profiledirectory -N $profilename \
+        $optargs
+fi
+
+if [[ -n "$extensiondir" ]]; then
+
+    install-extensions.sh -p $product -b $branch \
+        -x $executablepath -N $profilename -E $extensiondir
+
+    check-spider.sh -p $product -b $branch \
+        -x $executablepath -N $profilename
+
+fi
+
+        
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/tester.sh
@@ -0,0 +1,107 @@
+#!/usr/local/bin/bash
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+TEST_LOG=/dev/null
+
+#trap 'echo -e "\n*** ERROR ***\n\b" && tail $TEST_LOG' ERR
+
+#
+# options processing
+#
+options="p:b:e:T:t:"
+function usage()
+{
+    cat<<EOF
+usage: 
+$SCRIPT -t testscript datalist1 [datalist2 [datalist3 [datalist4]]]
+
+variable            description
+===============     ===========================================================
+-t testscript       required. quoted test script with required arguments.
+
+
+executes the testscript using the input data files in 
+$TEST_DIR/data constructed from each 
+combination of the input parameters:
+
+{item1},{item2},{item3},{item4}
+
+EOF
+    exit 2
+}
+
+unset testscript testargs
+
+while getopts $options optname ; 
+  do 
+  case $optname in
+      t) 
+          testscript="$OPTARG"
+          if echo $testscript | grep -iq ' ' ; then
+              testargs=`echo $testscript | sed 's|\([^ ]*\) \+\(.*\)|\2|'`
+              testscript=`echo $testscript | sed 's|\( .*\)||'`
+          fi
+          ;;
+  esac
+done
+
+if [[ -z "$testscript" ]]; then
+    usage
+fi
+
+shift 2
+
+datalist=`combo.sh "$@"`
+
+TEST_ID=`dirname $testscript | sed "s|$TEST_DIR/||" | sed "s|/|_|g"`
+
+for data in $datalist; do
+    TEST_DATE=`date -u +%Y-%m-%d-%H-%M-%S``date +%z`
+    TEST_LOG="${TEST_DIR}/results/${TEST_DATE},$data,$OSID,${MACHINE},$TEST_ID.log"
+
+    echo "writing results to $TEST_LOG"
+
+    test-setup.sh -d $TEST_DIR/data/$data.data >> $TEST_LOG 2>&1
+
+    $testscript $testargs -d $TEST_DIR/data/$data.data >> $TEST_LOG 2>&1
+done
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/thunderbird.diff
@@ -0,0 +1,11 @@
+--- thunderbird	2006-03-08 07:04:19.000000000 -0500
++++ thunderbird.new	2006-04-20 14:14:41.864224000 -0400
+@@ -179,7 +179,7 @@
+ then
+   echo $dist_bin/run-mozilla.sh $script_args $dist_bin/$MOZILLA_BIN "$@"
+ fi
+-"$dist_bin/run-mozilla.sh" $script_args "$dist_bin/$MOZILLA_BIN" "$@"
++exec "$dist_bin/run-mozilla.sh" $script_args "$dist_bin/$MOZILLA_BIN" "$@"
+ exitcode=$?
+ 
+ ## Stop addon scripts
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/timed_run.py
@@ -0,0 +1,114 @@
+#!/usr/bin/python -u
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Foundation.
+# Portions created by the Initial Developer are Copyright (C) 2004
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s): Chris Cooper
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+# Usage: timed_run timeout prefix command args
+import os, signal, sys, time
+
+#
+# returns exit code as follows:
+# 
+exitOSError   = 66
+exitSignal    = 77
+exitTimeout   = 88
+exitInterrupt = 99
+
+pid = None
+prefix = sys.argv[2]
+elapsedtime = 0
+
+if prefix == "-":
+    prefix = ''
+else:
+    prefix = prefix + ':'
+
+def alarm_handler(signum, frame):
+    global pid
+    global prefix
+    try:
+        print "%s EXIT STATUS: TIMED OUT (%s seconds)" % (prefix, sys.argv[1])
+        os.kill(pid, signal.SIGKILL)
+    except:
+        pass
+    sys.exit(exitTimeout)
+
+def forkexec(command, args):
+    global prefix
+    global elapsedtime
+    #print command
+    #print args
+    try:
+        pid = os.fork()
+        if pid == 0:  # Child
+            os.execvp(command, args)
+        else:  # Parent
+            return pid
+    except OSError, e:
+        print "%s ERROR: %s %s failed: %d (%s) (%f seconds)" % (prefix, command, args, e.errno, e.strerror, elapsedtime)
+        sys.exit(exitOSError)
+
+signal.signal(signal.SIGALRM, alarm_handler)
+signal.alarm(int(sys.argv[1]))
+starttime = time.time()
+try:
+	pid = forkexec(sys.argv[3], sys.argv[3:])
+	status = os.waitpid(pid, 0)[1]
+	signal.alarm(0) # Cancel the alarm
+	stoptime = time.time()
+	elapsedtime = stoptime - starttime
+	if os.WIFEXITED(status):
+	    rc = os.WEXITSTATUS(status)
+	    msg = ''
+	    if rc == 0:
+	        msg = 'NORMAL'
+	    elif rc < 3:
+	        msg = 'ABNORMAL ' + str(rc)
+		rc = exitSignal
+	    else:
+	        msg = 'CRASHED ' + str(rc)
+		rc = exitSignal
+
+	    print "%s EXIT STATUS: %s (%f seconds)" % (prefix, msg, elapsedtime)
+	    sys.exit(rc)
+	elif os.WIFSIGNALED(status):
+	    print "%s EXIT STATUS: CRASHED signal %d (%f seconds)" % (prefix, os.WTERMSIG(status), elapsedtime)
+	    sys.exit(exitSignal)
+	else:
+	    print "%s EXIT STATUS: NONE (%f seconds)" % (prefix, elapsedtime)
+	    sys.exit(0)
+except KeyboardInterrupt:
+	os.kill(pid, 9)
+	sys.exit(exitInterrupt)
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/uninstall-build.sh
@@ -0,0 +1,163 @@
+#!/usr/local/bin/bash -e
+# -*- Mode: Shell-script; tab-width: 4; indent-tabs-mode: nil; -*-
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is
+# Mozilla Corporation.
+# Portions created by the Initial Developer are Copyright (C) 2006.
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#  Bob Clary <bob@bclary.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 2 or later (the "GPL"), or
+# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+#
+# options processing
+#
+options="p:b:x:d:"
+function usage()
+{
+    cat <<EOF
+usage: 
+$SCRIPT -p product -b branch  -x executablepath [-d datafiles]
+
+variable            description
+===============     ============================================================
+-p product          required. firefox|thunderbird
+-b branch           required. 1.8.0|1.8.1|1.9.0
+-x executablepath   required. directory where build is installed
+-d datafiles        optional. one or more filenames of files containing 
+                    environment variable definitions to be included.
+
+                    note that the environment variables should have the same 
+                    names as in the "variable" column.
+
+Uninstalls build located in directory-tree 'executablepath'
+then removes the directory upon completion.
+
+EOF
+    exit 1
+}
+
+unset product branch executablepath datafiles
+
+while getopts $options optname ; 
+do 
+    case $optname in
+        p) product=$OPTARG;;
+        b) branch=$OPTARG;;
+        x) executablepath=$OPTARG;;
+        d) datafiles=$OPTARG;;
+    esac
+done
+
+# include environment variables
+if [[ -n "$datafiles" ]]; then
+    for datafile in $datafiles; do 
+        cat $datafile | sed 's|^|data: |'
+        source $datafile
+    done
+fi
+
+if [[ -z "$product" || -z "$branch" || -z "$executablepath" ]]
+then
+    usage
+fi
+
+
+if [[ ! -d "$executablepath" ]]; then
+    exit 0
+fi
+
+executable=`get_executable $product $branch $executablepath`
+
+if [[ -z "$executable" ]]; then
+    exit 0
+fi
+
+executabledir=`dirname $executable`
+
+if [[ $OSID == "win32" ]]; then
+    # see http://nsis.sourceforge.net/Docs/Chapter3.html
+
+    # if the directory already exists, attempt to uninstall
+    # any existing installation.
+
+    if [[ -d "$executabledir/uninstall" ]]; then
+
+        if [[ $branch == "1.8.0" ]]; then
+            uninstallexe="$executabledir/uninstall/uninstall.exe"
+            uninstallini="$executabledir/uninstall/uninstall.ini"
+            if [[ -n "$uninstallexe"  && -e "$uninstallexe" ]]; then
+                if sed -i.bak 's/Run Mode=Normal/Run Mode=Silent/' $uninstallini; 
+                then
+                    # uninstall.exe will return non zero exit codes 
+                    # for no damn reason.
+                    if $uninstallexe; then
+                        true
+                    fi
+                fi
+            fi
+        elif [[ $branch == "1.8.1" || $branch == "1.9.0" ]]; then
+            uninstalloldexe="$executabledir/uninstall/uninst.exe"
+            uninstallnewexe="$executabledir/uninstall/helper.exe"
+            if [[ -n "$uninstallnewexe" && -e "$uninstallnewexe" ]]; then
+                $uninstallnewexe /S /D=`cygpath -a -w $executabledir | sed 's@\\\\@\\\\\\\\@g'`
+            elif [[ -n "$uninstalloldexe" && -e "$uninstalloldexe" ]]; then
+                $uninstalloldexe /S /D=`cygpath -a -w $executabledir | sed 's@\\\\@\\\\\\\\@g'`
+            else
+                uninstallexe="$executabledir/$product/uninstall/uninstaller.exe"
+                if [[ -n "$uninstallexe" && -e "$uninstallexe" ]]; then
+                    $uninstallexe /S /D=`cygpath -a -w "$executabledir"  | sed 's@\\\\@\\\\\\\\@g'`
+                fi
+            fi
+        else
+            error "Unknown branch $branch"
+        fi
+        # the NSIS uninstaller will copy itself, then fork to the new
+        # copy so that it can delete itself. This causes a race condition
+        # between the uninstaller deleting the files and the rm command below
+        # sleep for 10 seconds to give the uninstaller time to complete before
+        # the installation directory is removed.
+        sleep 10
+    fi
+fi
+
+
+# safely creates/deletes a directory. If we pass this,
+# then we know it is safe to remove the directory.
+
+${TEST_BIN}/create-directory.sh -d "$executablepath" -n
+
+rm -fR "$executablepath"
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/bin/userhook-checkspider.js
@@ -0,0 +1,65 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is JavaScript Engine testing utilities.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2006
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Bob Clary
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*
+ * Spider hook function to check if spider is working.
+ */
+
+
+function userOnStart()
+{
+}
+
+function userOnBeforePage()
+{
+}
+
+function userOnAfterPage()
+{
+  gPageCompleted = true;
+}
+
+function userOnStop()
+{
+}
+
+
+gConsoleListener.onConsoleMessage = 
+function userOnConsoleMessage(s)
+{
+  dump(s);
+};
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-1.5.0-ftp,linux.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/1.5.0.12-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/linux-i686/en-US/firefox-2.0.0.3.tar.gz
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-1.5.0-ftp,mac.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/1.5.0.12-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/mac/en-US/Firefox%202.0.0.3.dmg
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-1.5.0-ftp,win32.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/1.5.0.12-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/win32/en-US/Firefox%20Setup%202.0.0.3.exe
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-2.0.0-ftp,linux.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/2.0.0.4-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/linux-i686/en-US/firefox-2.0.0.3.tar.gz
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-2.0.0-ftp,mac.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/2.0.0.4-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/mac/en-US/Firefox%202.0.0.3.dmg
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-2.0.0-ftp,win32.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/2.0.0.4-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/win32/en-US/Firefox%20Setup%202.0.0.3.exe
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-all,linux.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/firefox/all.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/linux-i686/en-US/firefox-2.0.0.3.tar.gz
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-all,mac.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/firefox/all.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/mac/en-US/Firefox%202.0.0.3.dmg
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-all,win32.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/firefox/all.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/win32/en-US/Firefox%20Setup%202.0.0.3.exe
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-all-older,linux.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/firefox/all-older.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/linux-i686/en-US/firefox-2.0.0.3.tar.gz
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-all-older,mac.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/firefox/all-older.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/mac/en-US/Firefox%202.0.0.3.dmg
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,firefox-all-older,win32.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/firefox/all-older.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/win32/en-US/Firefox%20Setup%202.0.0.3.exe
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-1.5.0-ftp,linux.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/thunderbird/nightly/1.5.0.12-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/linux-i686/en-US/firefox-2.0.0.3.tar.gz
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-1.5.0-ftp,mac.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/thunderbird/nightly/1.5.0.12-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/mac/en-US/Firefox%202.0.0.3.dmg
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-1.5.0-ftp,win32.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/thunderbird/nightly/1.5.0.12-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/win32/en-US/Firefox%20Setup%202.0.0.3.exe
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-2.0.0-ftp,linux.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/thunderbird/nightly/2.0.0.4-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/linux-i686/en-US/firefox-2.0.0.3.tar.gz
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-2.0.0-ftp,mac.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/thunderbird/nightly/2.0.0.4-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/mac/en-US/Firefox%202.0.0.3.dmg
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-2.0.0-ftp,win32.data
@@ -0,0 +1,12 @@
+allurl=http://stage.mozilla.org/pub/mozilla.org/firefox/thunderbird/2.0.0.4-candidates/rc2/
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/win32/en-US/Firefox%20Setup%202.0.0.3.exe
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=ftp
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-all,linux.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/thunderbird/all.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/linux-i686/en-US/firefox-2.0.0.3.tar.gz
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-all,mac.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/thunderbird/all.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/mac/en-US/Firefox%202.0.0.3.dmg
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-all,win32.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/thunderbird/all.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/win32/en-US/Firefox%20Setup%202.0.0.3.exe
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-all-older,linux.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/thunderbird/all-older.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/linux-i686/en-US/firefox-2.0.0.3.tar.gz
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-all-older,mac.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/thunderbird/all-older.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/mac/en-US/Firefox%202.0.0.3.dmg
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/download-check,thunderbird-all-older,win32.data
@@ -0,0 +1,12 @@
+allurl=http://khan.landfill.bugzilla.org/en-US/thunderbird/all-older.html
+product=firefox
+branch=1.8.1
+url=http://releases.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/win32/en-US/Firefox%20Setup%202.0.0.3.exe
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+test=all
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.0,debug.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.8.0
+profilename=firefox-1.8.0-profile
+profiledirectory=/tmp/firefox-1.8.0-profile
+executablepath=/work/mozilla/builds/1.8.0/mozilla/firefox-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.0,nightly-linux.data
@@ -0,0 +1,10 @@
+product=firefox
+branch=1.8.0
+url=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/latest-mozilla1.8.0/firefox-1.5.0.12pre.en-US.linux-i686.tar.gz
+profilename=firefox-1.8.0-profile
+profiledirectory=/tmp/firefox-1.8.0-profile
+executablepath=/tmp/firefox-1.8.0
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.0,nightly-mac.data
@@ -0,0 +1,10 @@
+product=firefox
+branch=1.8.0
+url=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/latest-mozilla1.8.0/firefox-1.5.0.12pre.en-US.mac.dmg
+profilename=firefox-1.8.0-profile
+profiledirectory=/tmp/firefox-1.8.0-profile
+executablepath=/tmp/firefox-1.8.0
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.0,nightly-win32.data
@@ -0,0 +1,10 @@
+product=firefox
+branch=1.8.0
+url=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/latest-mozilla1.8.0/firefox-1.5.0.12pre.en-US.win32.zip
+profilename=firefox-1.8.0-profile
+profiledirectory=/tmp/firefox-1.8.0-profile
+executablepath=/tmp/firefox-1.8.0
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.0,opt.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.8.0
+profilename=firefox-1.8.0-profile
+profiledirectory=/tmp/firefox-1.8.0-profile
+executablepath=/work/mozilla/builds/1.8.0/mozilla/firefox-opt/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.0-test,debug.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.8.0
+profilename=firefox-1.8.0-test-profile
+profiledirectory=/tmp/firefox-1.8.0-test-profile
+executablepath=/work/mozilla/builds/1.8.0-test/mozilla/firefox-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.0-test,opt.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.8.0
+profilename=firefox-1.8.0-test-profile
+profiledirectory=/tmp/firefox-1.8.0-test-profile
+executablepath=/work/mozilla/builds/1.8.0-test/mozilla/firefox-opt/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.1,debug.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.8.1
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/work/mozilla/builds/1.8.1/mozilla/firefox-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.1,nightly-linux.data
@@ -0,0 +1,10 @@
+product=firefox
+branch=1.8.1
+url=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/latest-mozilla1.8/firefox-2.0.0.4pre.en-US.linux-i686.tar.gz
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.1,nightly-mac.data
@@ -0,0 +1,10 @@
+product=firefox
+branch=1.8.1
+url=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/latest-mozilla1.8/firefox-2.0.0.4pre.en-US.mac.dmg
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.1,nightly-win32.data
@@ -0,0 +1,10 @@
+product=firefox
+branch=1.8.1
+url=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/latest-mozilla1.8/firefox-2.0.0.4pre.en-US.win32.zip
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/tmp/firefox-1.8.1
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.1,opt.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.8.1
+profilename=firefox-1.8.1-profile
+profiledirectory=/tmp/firefox-1.8.1-profile
+executablepath=/work/mozilla/builds/1.8.1/mozilla/firefox-opt/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.1-test,debug.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.8.1
+profilename=firefox-1.8.1-test-profile
+profiledirectory=/tmp/firefox-1.8.1-test-profile
+executablepath=/work/mozilla/builds/1.8.1-test/mozilla/firefox-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.8.1-test,opt.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.8.1
+profilename=firefox-1.8.1-test-profile
+profiledirectory=/tmp/firefox-1.8.1-test-profile
+executablepath=/work/mozilla/builds/1.8.1-test/mozilla/firefox-opt/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.9.0,debug.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.9.0
+profilename=firefox-1.9.0-profile
+profiledirectory=/tmp/firefox-1.9.0-profile
+executablepath=/work/mozilla/builds/1.9.0/mozilla/firefox-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.9.0,nightly-linux.data
@@ -0,0 +1,10 @@
+product=firefox
+branch=1.9.0
+url=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/firefox-3.0a5pre.en-US.linux-i686.tar.bz2
+profilename=firefox-1.9.0-profile
+profiledirectory=/tmp/firefox-1.9.0-profile
+executablepath=/tmp/firefox-1.9.0
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.9.0,nightly-mac.data
@@ -0,0 +1,10 @@
+product=firefox
+branch=1.9.0
+url=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/firefox-3.0a5pre.en-US.mac.dmg
+profilename=firefox-1.9.0-profile
+profiledirectory=/tmp/firefox-1.9.0-profile
+executablepath=/tmp/firefox-1.9.0
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.9.0,nightly-win32.data
@@ -0,0 +1,10 @@
+product=firefox
+branch=1.9.0
+url=http://stage.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/firefox-3.0a5pre.en-US.win32.zip
+profilename=firefox-1.9.0-profile
+profiledirectory=/tmp/firefox-1.9.0-profile
+executablepath=/tmp/firefox-1.9.0
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.9.0,opt.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.9.0
+profilename=firefox-1.9.0-profile
+profiledirectory=/tmp/firefox-1.9.0-profile
+executablepath=/work/mozilla/builds/1.9.0/mozilla/firefox-opt/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.9.0-test,debug.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.9.0
+profilename=firefox-1.9.0-test-profile
+profiledirectory=/tmp/firefox-1.9.0-test-profile
+executablepath=/work/mozilla/builds/1.9.0-test/mozilla/firefox-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/firefox,1.9.0-test,opt.data
@@ -0,0 +1,9 @@
+product=firefox
+branch=1.9.0
+profilename=firefox-1.9.0-test-profile
+profiledirectory=/tmp/firefox-1.9.0-test-profile
+executablepath=/work/mozilla/builds/1.9.0-test/mozilla/firefox-opt/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.8.0,debug.data
@@ -0,0 +1,6 @@
+product=js
+branch=1.8.0
+sourcepath=/work/mozilla/builds/1.8.0/mozilla/js/src
+buildtype=debug
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.8.0,opt.data
@@ -0,0 +1,6 @@
+product=js
+branch=1.8.0
+sourcepath=/work/mozilla/builds/1.8.0/mozilla/js/src
+buildtype=opt
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.8.0-test,debug.data
@@ -0,0 +1,6 @@
+product=js
+branch=1.8.0
+sourcepath=/work/mozilla/builds/1.8.0-test/mozilla/js/src
+buildtype=debug
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.8.0-test,opt.data
@@ -0,0 +1,6 @@
+product=js
+branch=1.8.0
+sourcepath=/work/mozilla/builds/1.8.0-test/mozilla/js/src
+buildtype=opt
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.8.1,debug.data
@@ -0,0 +1,6 @@
+product=js
+branch=1.8.1
+sourcepath=/work/mozilla/builds/1.8.1/mozilla/js/src
+buildtype=debug
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.8.1,opt.data
@@ -0,0 +1,7 @@
+product=js
+branch=1.8.1
+sourcepath=/work/mozilla/builds/1.8.1/mozilla/js/src
+buildtype=opt
+
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.8.1-test,debug.data
@@ -0,0 +1,6 @@
+product=js
+branch=1.8.1
+sourcepath=/work/mozilla/builds/1.8.1-test/mozilla/js/src
+buildtype=debug
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.8.1-test,opt.data
@@ -0,0 +1,7 @@
+product=js
+branch=1.8.1
+sourcepath=/work/mozilla/builds/1.8.1-test/mozilla/js/src
+buildtype=opt
+
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.9.0,debug.data
@@ -0,0 +1,6 @@
+product=js
+branch=1.9.0
+sourcepath=/work/mozilla/builds/1.9.0/mozilla/js/src
+buildtype=debug
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.9.0,opt.data
@@ -0,0 +1,6 @@
+product=js
+branch=1.9.0
+sourcepath=/work/mozilla/builds/1.9.0/mozilla/js/src
+buildtype=opt
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.9.0-test,debug.data
@@ -0,0 +1,6 @@
+product=js
+branch=1.9.0
+sourcepath=/work/mozilla/builds/1.9.0-test/mozilla/js/src
+buildtype=debug
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/js,1.9.0-test,opt.data
@@ -0,0 +1,6 @@
+product=js
+branch=1.9.0
+sourcepath=/work/mozilla/builds/1.9.0-test/mozilla/js/src
+buildtype=opt
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/thunderbird,1.8.0,debug.data
@@ -0,0 +1,10 @@
+product=thunderbird
+branch=1.8.0
+profilename=thunderbird-1.8.0-profile
+profiledirectory=/tmp/thunderbird-1.8.0-profile
+executablepath=/work/mozilla/builds/1.8.0/mozilla/thunderbird-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+profiletemplate=/work/mozilla/mozilla.com/test.mozilla.com/www/profiles/imap
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/thunderbird,1.8.0-test,debug.data
@@ -0,0 +1,10 @@
+product=thunderbird
+branch=1.8.0
+profilename=thunderbird-1.8.0-test-profile
+profiledirectory=/tmp/thunderbird-1.8.0-test-profile
+executablepath=/work/mozilla/builds/1.8.0-test/mozilla/thunderbird-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+profiletemplate=/work/mozilla/mozilla.com/test.mozilla.com/www/profiles/imap
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/thunderbird,1.8.1,debug.data
@@ -0,0 +1,10 @@
+product=thunderbird
+branch=1.8.1
+profilename=thunderbird-1.8.1-profile
+profiledirectory=/tmp/thunderbird-1.8.1-profile
+executablepath=/work/mozilla/builds/1.8.1/mozilla/thunderbird-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+profiletemplate=/work/mozilla/mozilla.com/test.mozilla.com/www/profiles/imap
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/thunderbird,1.8.1-test,debug.data
@@ -0,0 +1,10 @@
+product=thunderbird
+branch=1.8.1
+profilename=thunderbird-1.8.1-test-profile
+profiledirectory=/tmp/thunderbird-1.8.1-test-profile
+executablepath=/work/mozilla/builds/1.8.1-test/mozilla/thunderbird-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+profiletemplate=/work/mozilla/mozilla.com/test.mozilla.com/www/profiles/imap
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/thunderbird,1.9.0,debug.data
@@ -0,0 +1,10 @@
+product=thunderbird
+branch=1.9.0
+profilename=thunderbird-1.9.0-profile
+profiledirectory=/tmp/thunderbird-1.9.0-profile
+executablepath=/work/mozilla/builds/1.9.0/mozilla/thunderbird-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+profiletemplate=/work/mozilla/mozilla.com/test.mozilla.com/www/profiles/imap
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/data/thunderbird,1.9.0-test,debug.data
@@ -0,0 +1,10 @@
+product=thunderbird
+branch=1.9.0
+profilename=thunderbird-1.9.0-test-profile
+profiledirectory=/tmp/thunderbird-1.9.0-test-profile
+executablepath=/work/mozilla/builds/1.9.0-test/mozilla/thunderbird-debug/dist
+userpreferences=/work/mozilla/mozilla.com/test.mozilla.com/www/prefs/test-user.js
+extensiondir=/work/mozilla/mozilla.com/test.mozilla.com/www/xpi
+profiletemplate=/work/mozilla/mozilla.com/test.mozilla.com/www/profiles/imap
+
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/prefs/mail-user.js
@@ -0,0 +1,22 @@
+user_pref("app.update.enabled", false);
+user_pref("browser.dom.window.dump.enabled", true);
+user_pref("browser.sessionstore.resume_from_crash", false);
+user_pref("browser.shell.checkDefaultBrowser", false);
+user_pref("capability.policy.policynames", "trusted");
+user_pref("capability.policy.trusted.sites", "http://test.mozilla.com http://test.bclary.com");
+user_pref("capability.principal.codebase.p0.granted", "UniversalPreferencesWrite UniversalXPConnect UniversalBrowserWrite UniversalPreferencesRead UniversalBrowserRead");
+user_pref("capability.principal.codebase.p0.id", "http://test.mozilla.com");
+user_pref("capability.principal.codebase.p1.granted", "UniversalPreferencesWrite UniversalXPConnect UniversalBrowserWrite UniversalPreferencesRead UniversalBrowserRead");
+user_pref("capability.principal.codebase.p1.id", "http://test.bclary.com");
+user_pref("dom.allow_scripts_to_close_windows", true);
+user_pref("dom.max_script_run_time", 1800);
+user_pref("extensions.update.enabled", false);
+user_pref("extensions.update.notifyUser", false);
+user_pref("javascript.allow.mailnews", true);
+user_pref("mail.startup.enabledMailCheckOnce", false);
+user_pref("security.enable_java", false);
+user_pref("security.warn_submit_insecure", false);
+user_pref("signed.applets.codebase_principal_support", true);
+user_pref("mailnews.start_page.override_url", "http://test.mozilla.com/bin/install-extensions-1.html");
+user_pref("mailnews.start_page.url", "http://test.mozilla.com/bin/install-extensions-1.html");
+user_pref("mailnews.start_page.welcome_url", "http://test.mozilla.com/bin/install-extensions-1.html");
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/prefs/public-user.js
@@ -0,0 +1,28 @@
+user_pref("app.update.enabled", false);
+user_pref("browser.dom.window.dump.enabled", true);
+user_pref("browser.sessionstore.resume_from_crash", false);
+user_pref("browser.shell.checkDefaultBrowser", false);
+user_pref("browser.xul.error_pages.enabled", true);
+user_pref("capability.policy.policynames", "trusted");
+user_pref("capability.policy.trusted.sites", "http://test.mozilla.com http://test.bclary.com");
+user_pref("capability.principal.codebase.p0.granted", "UniversalPreferencesWrite UniversalXPConnect UniversalBrowserWrite UniversalPreferencesRead UniversalBrowserRead");
+user_pref("capability.principal.codebase.p0.id", "http://test.mozilla.com");
+user_pref("capability.principal.codebase.p1.granted", "UniversalPreferencesWrite UniversalXPConnect UniversalBrowserWrite UniversalPreferencesRead UniversalBrowserRead");
+user_pref("capability.principal.codebase.p1.id", "http://test.bclary.com");
+user_pref("dom.allow_scripts_to_close_windows", false);
+user_pref("dom.disable_move_resize", true);
+user_pref("dom.disable_open_during_load", true);
+user_pref("dom.disable_window_flip", true);
+user_pref("dom.disable_window_open_feature.status", true);
+user_pref("dom.max_script_run_time", 1800);
+user_pref("dom.max_chrome_script_run_time", 1800);
+user_pref("javascript.allow.mailnews", false);
+user_pref("javascript.options.showInConsole", true);
+user_pref("layout.css.report_errors", true);
+user_pref("security.enable_java", false);
+user_pref("security.warn_entering_secure", false);
+user_pref("security.warn_entering_weak", false);
+user_pref("security.warn_leaving_secure", false);
+user_pref("security.warn_submit_insecure", false);
+user_pref("security.warn_viewing_mixed", false);
+user_pref("signed.applets.codebase_principal_support", true);
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/prefs/test-user.js
@@ -0,0 +1,25 @@
+user_pref("app.update.enabled", false);
+user_pref("browser.dom.window.dump.enabled", true);
+user_pref("browser.sessionstore.resume_from_crash", false);
+user_pref("browser.shell.checkDefaultBrowser", false);
+user_pref("browser.xul.error_pages.enabled", true);
+user_pref("capability.policy.policynames", "trusted");
+user_pref("capability.policy.trusted.sites", "http://test.mozilla.com http://test.bclary.com");
+user_pref("capability.principal.codebase.p0.granted", "UniversalPreferencesWrite UniversalXPConnect UniversalBrowserWrite UniversalPreferencesRead UniversalBrowserRead");
+user_pref("capability.principal.codebase.p0.id", "http://test.mozilla.com");
+user_pref("capability.principal.codebase.p1.granted", "UniversalPreferencesWrite UniversalXPConnect UniversalBrowserWrite UniversalPreferencesRead UniversalBrowserRead");
+user_pref("capability.principal.codebase.p1.id", "http://test.bclary.com");
+user_pref("dom.allow_scripts_to_close_windows", true);
+user_pref("dom.disable_open_during_load", false);
+user_pref("dom.max_script_run_time", 1800);
+user_pref("dom.max_chrome_script_run_time", 1800);
+user_pref("javascript.allow.mailnews", true);
+user_pref("javascript.options.showInConsole", true);
+user_pref("layout.css.report_errors", true);
+user_pref("security.enable_java", false);
+user_pref("security.warn_entering_secure", false);
+user_pref("security.warn_entering_weak", false);
+user_pref("security.warn_leaving_secure", false);
+user_pref("security.warn_submit_insecure", false);
+user_pref("security.warn_viewing_mixed", false);
+user_pref("signed.applets.codebase_principal_support", true);
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/talkback/linux/Talkback.ini
@@ -0,0 +1,8 @@
+HistorySettings = 3, 10, 100
+EnableAgentFromWizard = 1
+SeenIntro = 1
+EmailControl = "mozqa@mozilla.com"
+URLEditControl = 
+PromptUser = 0
+LocalKey = B9591F218C
+RandomPool = 0C1ED3B691EEF8D151CFFEC84FD73F6CFC01B4020911D1EA423672E9E283166049807247DCD80E4DB824C97E1519B54194689137D48F7D78E50ED406219AB674577942AFCAD115A5574CA22F1A95F73F40A1FA581FC6921A3F08540E054E75358208074043AE72B963092E6023B984FC78294069BF039970CB4E444889DF0DD3
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/talkback/mac/Talkback.ini
@@ -0,0 +1,8 @@
+HistorySettings = 3, 10, 100
+EnableAgentFromWizard = 1
+SeenIntro = 1
+UserEmailAddress = "mozqa@mozilla.com"
+URLEditControl = 
+PromptUser = 0
+LocalKey = BFAF47F801
+RandomPool = A21DF17FEA8D8A9F5155C3D45CA2AC367763CB23915C6F6BF6F810F264DFCE67EF4067E0CEA849A3A9C25D74D26CA10B08A9D03D1BB34D51A5DD4186721B3C4A38B35F4B3F1869F0235EFB88A3DC59AABD86129BCA6C7BAD7B8A0DBED0AF57BE284C750E48F94745879C3F5F932BCA2494E4D9430D9942264E02F7C29C8C4375
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/talkback/win32/Talkback.ini
@@ -0,0 +1,8 @@
+HistorySettings = 3, 10, 100
+EnableAgentFromWizard = 1
+SeenIntro = 1
+EmailEdit = "mozqa@mozilla.com"
+URLEdit = 
+PromptUser = 0
+LocalKey = BFAF47F801
+RandomPool = A21DF17FEA8D8A9F5155C3D45CA2AC367763CB23915C6F6BF6F810F264DFCE67EF4067E0CEA849A3A9C25D74D26CA10B08A9D03D1BB34D51A5DD4186721B3C4A38B35F4B3F1869F0235EFB88A3DC59AABD86129BCA6C7BAD7B8A0DBED0AF57BE284C750E48F94745879C3F5F932BCA2494E4D9430D9942264E02F7C29C8C4375
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/tests/mozilla.org/download-page/collect-urls-userhook.js
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+
+function userOnStart()
+{
+  dlog('userOnStart()');
+}
+
+function userOnBeforePage()
+{
+  dlog('userOnBeforePage()');
+}
+
+function userOnPause()
+{
+  dlog('userOnPause()');
+}
+
+function userOnAfterPage()
+{
+  dlog('userOnAfterPage()');
+
+  setTimeout(collectLinks, 5000);
+}
+
+function collectLinks()
+{
+  dlog('collectLinks()');
+
+  var win = gSpider.mDocument.defaultView;
+  if (win.wrappedJSObject)
+  {
+    win = win.wrappedJSObject;
+  }
+
+  var os;
+
+  switch(navigator.platform)
+  {
+  case 'Win32':
+    os = 'win';
+    break;
+  case 'MacPPC':
+  case 'MacIntel':
+    os = 'osx';
+    break;
+  case 'Linux i686':
+    os = 'linux';
+    break;
+  default:
+    cdump('Error: Unknown OS ' + navigator.platform);
+    return;
+  }
+    
+  cdump('document.body: ' + win.document.body.innerHTML);
+  var links = win.document.links;
+
+  for (var ilink = 0; ilink < links.length; ilink++)
+  {
+    var link = links[ilink];
+    if (link.href.indexOf('download.html') != -1 && 
+        link.href.indexOf('os=' + os) != -1)
+    {
+      var href = 'http://download.mozilla.org/?' + link.href.split('?')[1];
+      cdump('href: ' + href);
+    }
+  }
+
+  gPageCompleted = true;
+}
+
+
+function userOnStop()
+{
+  dlog('userOnStop()');
+}
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/tests/mozilla.org/download-page/test.sh
@@ -0,0 +1,187 @@
+#!/usr/local/bin/bash -e
+
+TEST_DIR=${TEST_DIR:-/work/mozilla/mozilla.com/test.mozilla.com/www}
+TEST_BIN=${TEST_BIN:-$TEST_DIR/bin}
+source ${TEST_BIN}/library.sh
+
+TEST_DOWNLOAD_PAGE_TIMEOUT=${TEST_DOWNLOAD_PAGE_TIMEOUT:-60}
+TEST_DOWNLOAD_BUILD_TIMEOUT=${TEST_DOWNLOAD_BUILD_TIMEOUT:-900}
+
+#
+# options processing
+#
+options="u:t:p:b:x:c:N:d:"
+function usage()
+{
+    cat <<EOF
+usage: 
+$SCRIPT -u allurl -t test -p product -b branch -N profilename -x executablepath 
+        -c credentials [-d datafiles]
+
+variable            description
+===============     ============================================================
+-u allurl           required. location to find download "all" page.
+-t test             required. all for download page. ftp for ftp directory
+-p product          required. firefox|thunderbird
+-b branch           required. 1.8.0|1.8.1|1.9.0
+-x executablepath   required. directory-tree containing executable 'product'
+-c credentials      optional. user:password if required for authentication
+-N profilename      required. profile name 
+-d datafiles        optional. one or more filenames of files containing 
+                    environment variable definitions to be included.
+
+                    note that the environment variables should have the same 
+                    names as in the "variable" column.
+
+
+allurl         =$allurl 
+test           =$test 
+product        =$product 
+branch         =$branch 
+profilename    =$profilename 
+executablepath =$executablepath 
+credentials    =$credentials 
+datafiles      =$datafiles
+
+EOF
+    exit 2
+}
+
+unset allurl test product branch profilename executablepath credentials datafiles
+
+while getopts $options optname ; 
+  do 
+  case $optname in
+      u) allurl=$OPTARG;;
+      t) test=$OPTARG;;
+      p) product=$OPTARG;;
+      b) branch=$OPTARG;;
+      N) profilename=$OPTARG;;
+      x) executablepath=$OPTARG;;
+      c) credentials="-c $OPTARG";;
+      d) datafiles=$OPTARG;;
+  esac
+done
+
+# include environment variables
+if [[ -n "$datafiles" ]]; then
+    for datafile in $datafiles; do 
+        source $datafile
+    done
+fi
+
+if [[ -z "$allurl" || -z "$test" || \
+    -z "$product" || -z "$branch" || -z "$profilename" || \
+    -z "$executablepath" ]]; then
+    usage
+fi
+
+executable=`get_executable $product $branch $executablepath`
+
+if [[ "$test" == "all" ]]; then
+    $TEST_BIN/timed_run.py $TEST_DOWNLOAD_PAGE_TIMEOUT "test download" \
+	"$executable" -P "$profilename" -spider -start -quit \
+	-uri "$allurl" -timeout=$TEST_DOWNLOAD_PAGE_TIMEOUT \
+	-hook "http://$TEST_HTTP/tests/mozilla.org/download-page/collect-urls-userhook.js" | \
+	grep 'href: ' | sed 's/^href: //' > urls.txt
+elif [[ "$test" == "ftp" ]]; then
+    $TEST_BIN/timed_run.py $TEST_DOWNLOAD_PAGE_TIMEOUT "test download" \
+	"$executable" -P "$profilename" -spider -start -quit \
+	-uri "$allurl" -timeout=$TEST_DOWNLOAD_PAGE_TIMEOUT \
+	-hook "http://$TEST_HTTP/tests/mozilla.org/download-page/userhook-ftp.js" | \
+	grep 'href: ' | sed 's/^href: //' > urls.txt
+fi
+
+cat urls.txt | while read url; do
+
+    echo "Processing $url"
+
+    if [[ "$test" == "all" ]]; then
+	downloadproduct=`echo $url | sed 's|.*product=\([^\-]*\).*|\1|'`
+	downloadversion=`echo $url | sed 's|.*product=[^\-]*-\([0-9.]*\).*|\1|'`
+    elif [[ "$test" == "ftp" ]]; then
+	downloadproduct=`echo $url | sed 's|.*/\([a-zA-Z]*\)-[^/]*|\1|'`
+	downloadversion=`echo $url | sed 's|\(.*\)/\([^/]*\)|\2|' | sed 's|[a-zA-Z]*-\([0-9.]*\)\..*|\1|'`
+    fi
+
+    echo "downloadproduct=$downloadproduct"
+    echo "downloadversion=$downloadversion"
+
+    case "$downloadversion" in
+	1.5*)
+	    downloadbranch="1.8.0"
+	    ;;
+	2.*)
+	    downloadbranch="1.8.1"
+	    ;;
+	3.*)
+	    downloadbranch="1.9.0"
+	    ;;
+	*)
+	    echo "unknown download branch: $downloadbranch"
+	    exit 2
+	    ;;
+    esac
+
+    filepath=`mktemp DOWNLOAD.XXXXXX`
+    
+    downloadexecutablepath="/tmp/download-$downloadproduct-$downloadbranch"
+    downloadprofilepath="/tmp/download-$downloadproduct-$downloadbranch-profile"
+    downloadprofilename="download-$downloadproduct-$downloadbranch-profile"
+
+    if ! download.sh -u "$url" -f $filepath $credentials; then
+	continue;
+    fi
+
+    if ! install-build.sh  -p "$downloadproduct" -b "$downloadbranch" \
+	-x $downloadexecutablepath \
+	-f `pwd`/$filepath; then
+	continue
+    fi
+
+    rm $filepath
+
+    if [[ "$downloadproduct" == "thunderbird" ]]; then
+	template="-L /work/mozilla/mozilla.com/test.mozilla.com/www/profiles/imap"
+    else
+	unset template
+    fi
+
+    if ! create-profile.sh -p "$downloadproduct" -b "$downloadbranch" \
+	-x $downloadexecutablepath \
+	-D $downloadprofilepath \
+	-N $downloadprofilename \
+	-U /work/mozilla/mozilla.com/test.mozilla.com/www/prefs/mail-user.js \
+	$template; then
+	continue
+    fi
+
+    if ! install-extensions.sh -p "$downloadproduct" -b "$downloadbranch" \
+	-x $downloadexecutablepath \
+	-N $downloadprofilename \
+	-E /work/mozilla/mozilla.com/test.mozilla.com/www/xpi; then
+	continue
+    fi
+
+    if ! check-spider.sh -p "$downloadproduct" -b "$downloadbranch" \
+	-x $downloadexecutablepath \
+	-N $downloadprofilename; then
+	continue
+    fi
+
+    downloadexecutable=`get_executable $downloadproduct $downloadbranch $downloadexecutablepath`
+
+    $TEST_BIN/timed_run.py $TEST_DOWNLOAD_BUILD_TIMEOUT "..." \
+	"$downloadexecutable" \
+	-spider -P $downloadprofilename \
+	-uri "http://$TEST_HTTP/bin/buildinfo.html" \
+	-hook "http://$TEST_HTTP/tests/mozilla.org/download-page/userhook.js" \
+	-start -quit
+
+    if ! uninstall-build.sh  -p "$downloadproduct" -b "$downloadbranch" \
+	-x $downloadexecutablepath; then
+	continue
+    fi
+
+
+done
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/tests/mozilla.org/download-page/userhook-ftp.js
@@ -0,0 +1,91 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+
+var gOS;
+var gURLS = {};
+
+function userOnStart()
+{
+  dlog('userOnStart()');
+
+  if (navigator.oscpu.search(/Linux/) != -1)
+    gOS = 'linux';
+  else if (navigator.oscpu.search(/Mac/) != -1)
+    gOS = 'mac';
+  else if (navigator.oscpu.search(/Windows/) != -1)
+    gOS = 'win32';
+
+}
+
+function userOnBeforePage()
+{
+  dlog('userOnBeforePage()');
+}
+
+function userOnPause()
+{
+  dlog('userOnPause()');
+}
+
+function userOnAfterPage()
+{
+  dlog('userOnAfterPage()');
+
+  var win = gSpider.mDocument.defaultView;
+  if (win.wrappedJSObject)
+  {
+    win = win.wrappedJSObject;
+  }
+
+  //cdump('processing = ' + win.location.href);
+
+  var links  = win.document.links;
+  var length = links.length;
+
+
+  for (var ilink = 0; ilink < length; ilink++)
+  {
+
+    var href = links[ilink].href;
+
+    if (typeof gURLS[href] != 'undefined')
+      continue;
+
+    gURLS[href] = 1;
+
+    switch(gOS)
+    {
+    case 'linux':
+      if (/\.linux-i686\.tar\.(gz|bz2)$/.test(href))
+      {
+        cdump('href: ' + href);
+      }
+      break;
+
+    case 'mac':
+      if (/\.mac\.dmg$/.test(href))
+      {
+        cdump('href: ' + href);
+      }
+      break;
+
+    case 'win32':
+      if (/\.win32\.(zip|installer\.exe)$/.test(href))
+      {
+        cdump('href: ' + href);
+      }
+      break;
+
+    default:
+      break;
+    }
+  }
+
+  gPageCompleted = true;
+}
+
+
+function userOnStop()
+{
+  dlog('userOnStop()');
+}
+
new file mode 100755
--- /dev/null
+++ b/testing/sisyphus/tests/mozilla.org/download-page/userhook.js
@@ -0,0 +1,413 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+
+
+function userOnStart()
+{
+  dlog('userOnStart()');
+
+  debugger;
+
+  loadBundle('chrome://browser-region/locale/region.properties');
+  loadBundle('chrome://branding/content/searchconfig.properties');
+  loadBundle('resource:/browserconfig.properties');
+
+}
+
+function userOnBeforePage()
+{
+  dlog('userOnBeforePage()');
+}
+
+function userOnPause()
+{
+  dlog('userOnPause()');
+}
+
+function userOnAfterPage()
+{
+  dlog('userOnAfterPage()');
+
+  var win = gSpider.mDocument.defaultView;
+  if (win.wrappedJSObject)
+  {
+    win = win.wrappedJSObject;
+  }
+
+
+  cdump('win.location.href =' + win.location.href);
+  cdump('win.appInfo.toSource() = ' + win.appInfo.toSource());
+
+  var xmlhttp = new XMLHttpRequest();
+  var date = new Date();
+
+  if (!('toLocalFormat' in Date.prototype))
+  {
+    date.toLocaleFormat = function(fmt) {
+      var year = this.getFullYear().toString();
+      var mon  = (this.getMonth() + 1).toString()
+      var day  = (this.getDate()).toString();
+
+      if (mon.length < 2)
+      {
+        mon = '0' + mon;
+      }
+      if (day.length < 2)
+      {
+        day = '0' + day;
+      }
+      return year + mon + day;
+    };
+  }
+
+  xmlhttp.open('get', 'http://test.mozilla.com/credentials/builds.xml', false);
+  xmlhttp.send(null);
+
+  if (!xmlhttp.responseXML)
+  {
+    cdump('Unable to retrieve credentials');
+    gPageCompleted = true;
+    return;
+  }
+
+  var password = xmlhttp.responseXML.documentElement.getAttribute('password');
+
+  xmlhttp.open('post', 
+               'http://bclary.com/log/2006/02/24/update/index.pl', 
+               false,
+               'buildid',
+               password);
+
+  xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
+
+
+  var preferencesList = [
+    'app.distributor',
+    'app.distributor.channel',
+    'app.releaseNotesURL',
+    'app.update.channel',
+    'app.update.url',
+    'app.update.url.details',
+    'app.update.url.manual',
+    'browser.contentHandlers.types.0.title',
+    'browser.contentHandlers.types.0.uri',
+    'browser.contentHandlers.types.1.title',
+    'browser.contentHandlers.types.1.uri',
+    'browser.contentHandlers.types.2.title',
+    'browser.contentHandlers.types.2.uri',
+    'browser.search.defaultenginename',
+    'browser.search.order.1',
+    'browser.search.order.2',
+    'browser.search.order.3',
+    'browser.search.order.4',
+    'browser.search.order.5',
+    'browser.search.order.6',
+    'browser.search.order.7',
+    'browser.search.order.8',
+    'browser.search.order.Yahoo',
+    'browser.search.order.Yahoo.1',
+    'browser.search.order.Yahoo.2',
+    'browser.search.param.Google.1.custom',
+    'browser.search.param.Google.1.default',
+    'browser.search.param.Google.release',
+    'browser.search.param.Yahoo.release',
+    'browser.search.param.yahoo-f-CN',
+    'browser.search.param.yahoo-fr',
+    'browser.search.param.yahoo-fr-cjkt',
+    'browser.search.searchEnginesURL',
+    'browser.search.selectedEngine',
+    'browser.search.suggest.enabled',
+    'browser.search.useDBForOrder',
+    'browser.startup.homepage',
+    'keyword.URL',
+    'mozilla.partner.id',
+    'startup.homepage_override_url',
+    'startup.homepage_welcome_url'
+    ];
+
+  var preferences = new Preferences('');
+  var data = {};
+
+  for (var i = 0; i < preferencesList.length; i++)
+  {
+    var prefName   = preferencesList[i];
+    var prefValue  = preferences.getPref(prefName);
+    if (/^(chrome:\/\/|resource:\/)/.test(prefValue))
+    {
+debugger;
+      var override = getOverridePref(prefName, prefValue);
+      prefValue += '->' + override;
+    }
+    
+    cdump('preference ' + prefName + '=' + prefValue);
+    data[prefName] = prefValue;
+  }
+
+  data['000 runDate']                 = date.toLocaleFormat('%Y%c%d');
+
+  data['001 appInfo.vendor']          = win.appInfo.vendor;
+  data['002 appInfo.name']            = win.appInfo.name;
+  data['003 appInfo.version']         = win.appInfo.version;
+  data['004 appInfo.platformVersion'] = win.appInfo.platformVersion;
+  data['005 navigator.language']      = navigator.language;
+  data['006 navigator.platform']      = navigator.platform;
+  data['007 appInfo.platformBuildID'] = win.appInfo.platformBuildID;
+  data['008 appInfo.buildID']         = win.appInfo.appBuildID;
+  data['009 navigator.buildID']       = navigator.buildID;
+  data['010 appInfo.ID']              = win.appInfo.ID;
+
+  var qs = '';
+
+  for (var n in data)
+  {
+    qs += n + '=' + encodeURIComponent(data[n]) + '&';
+  }
+  qs = qs.substring(0, qs.length - 1);
+
+  cdump(qs);
+  xmlhttp.send(qs);
+
+  gPageCompleted = true;
+}
+
+
+function userOnStop()
+{
+  dlog('userOnStop()');
+}
+
+function Preferences(aPrefRoot)
+{
+  this.privs = 'UniversalXPConnect UniversalPreferencesRead UniversalPreferencesWrite';
+
+  if (typeof netscape != 'undefined' &&
+      'security' in netscape &&
+      'PrivilegeManager' in netscape.security &&
+      'enablePrivilege' in netscape.security.PrivilegeManager)
+  {
+    netscape.security.PrivilegeManager.enablePrivilege(this.privs);
+  }
+
+  const nsIPrefService = Components.interfaces.nsIPrefService;
+  const nsIPrefBranch = Components.interfaces.nsIPrefBranch;
+  const nsPrefService_CONTRACTID = "@mozilla.org/preferences-service;1";
+
+  this.prefRoot    = aPrefRoot;
+  this.prefService = Components.classes[nsPrefService_CONTRACTID].getService(nsIPrefService);
+  this.prefBranch = this.prefService.getBranch(aPrefRoot).QueryInterface(Components.interfaces.nsIPrefBranch2);
+
+}
+
+function Preferences_getPrefRoot() 
+{
+  if (typeof netscape != 'undefined' &&
+      'security' in netscape &&
+      'PrivilegeManager' in netscape.security &&
+      'enablePrivilege' in netscape.security.PrivilegeManager)
+  {
+    netscape.security.PrivilegeManager.enablePrivilege(this.privs);
+  }
+
+  return this.prefBranch.root; 
+}
+
+function Preferences_getPrefType(aPrefName) 
+{
+  if (typeof netscape != 'undefined' &&
+      'security' in netscape &&
+      'PrivilegeManager' in netscape.security &&
+      'enablePrivilege' in netscape.security.PrivilegeManager)
+  {
+    netscape.security.PrivilegeManager.enablePrivilege(this.privs);
+  }
+
+  return this.prefBranch.getPrefType(aPrefName); 
+}
+
+function Preferences_getPref(aPrefName) 
+{
+  if (typeof netscape != 'undefined' &&
+      'security' in netscape &&
+      'PrivilegeManager' in netscape.security &&
+      'enablePrivilege' in netscape.security.PrivilegeManager)
+  {
+    netscape.security.PrivilegeManager.enablePrivilege(this.privs);
+  }
+
+  var prefType = this.prefBranch.getPrefType(aPrefName);
+  var value;
+
+
+  if (prefType == this.prefBranch.PREF_INVALID)
+  {
+    cdump('Preferences.prototype.getPref: ' + aPrefName + ' invalid type ' + prefType);
+    cdump('Assuming string');
+    prefType = this.prefBranch.PREF_STRING;
+  }
+
+  switch(prefType)
+  {
+  case this.prefBranch.PREF_STRING:
+    try
+    {
+      value = this.prefBranch.getCharPref(aPrefName);
+    }
+    catch(ex)
+    {
+      cdump('Ignoring ' + ex);
+    }
+    break;
+  case this.prefBranch.PREF_INT:
+    try
+    {
+      value = this.prefBranch.getIntPref(aPrefName);
+    }
+    catch(ex)
+    {
+      cdump('Ignoring ' + ex);
+    }
+    break;
+  case this.prefBranch.PREF_BOOL:
+    try
+    {    value = this.prefBranch.getBoolPref(aPrefName);
+    }
+    catch(ex)
+    {
+      cdump('Ignoring ' + ex);
+    }
+    break;
+  default:
+    cdump('Preferences.prototype.getPref: ' + aPrefName + ' unknown type ' + prefType);
+    break;
+  }
+  return value;
+}
+
+function Preferences_setPref(aPrefName, aPrefValue) 
+{
+  if (typeof netscape != 'undefined' &&
+      'security' in netscape &&
+      'PrivilegeManager' in netscape.security &&
+      'enablePrivilege' in netscape.security.PrivilegeManager)
+  {
+    netscape.security.PrivilegeManager.enablePrivilege(this.privs);
+  }
+
+  var prefType = this.getPrefType(aPrefName);
+
+  if (prefType == this.prefBranch.PREF_INVALID)
+  {
+    cdump('Preferences.prototype.getPref: ' + aPrefName + ' invalid type ' + prefType);
+    cdump('Assuming string');
+    prefType = this.prefBranch.PREF_STRING;
+  }
+
+  switch(prefType)
+  {
+  case this.prefBranch.PREF_INVALID:
+    cdump('Preferences.prototype.setPref: ' + aPrefName + ' invalid type ' + prefType);
+    break;
+  case this.prefBranch.PREF_STRING:
+    if (typeof aPrefValue != 'string')
+    {
+      cdump('Preferences.prototype.setPref: ' + aPrefName + ' invalid value for type string ' + aPrefValue);
+    }
+    else
+    {
+      try
+      {
+        value = this.prefBranch.setCharPref(aPrefName, aPrefValue);
+      }
+      catch(ex)
+      {
+        cdump('Ignoring ' + ex);
+      }
+    }
+    break;
+  case this.prefBranch.PREF_INT:
+    if (typeof aPrefValue != 'number')
+    {
+      cdump('Preferences.prototype.setPref: ' + aPrefName + ' invalid value for type number ' + aPrefValue);
+    }
+    else
+    {
+      try
+      {
+        value = this.prefBranch.setIntPref(aPrefName, aPrefValue);
+      }
+      catch(ex)
+      {
+        cdump('Ignoring ' + ex);
+      }
+    }
+    break;
+  case this.prefBranch.PREF_BOOL:
+    if (typeof aPrefValue != 'boolean')
+    {
+      cdump('Preferences.prototype.setPref: ' + aPrefName + ' invalid value for type boolean ' + aPrefValue);
+    }
+    else
+    {
+      try
+      {
+        value = this.prefBranch.setBoolPref(aPrefName, aPrefValue);
+      }
+      catch(ex)
+      {
+        cdump('Ignoring ' + ex);
+      }
+    }
+    break;
+  default:
+    cdump('Preferences.prototype.setPref: ' + aPrefName + ' unknown type ' + prefType);
+    break;
+  }
+}
+
+Preferences.prototype.getPref = Preferences_getPref;
+Preferences.prototype.setPref = Preferences_setPref;
+
+function loadBundle(uri)
+{
+  try
+  {
+    var bundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].
+      getService(Components.interfaces.nsIStringBundleService);
+
+    var bundle = bundleService.createBundle(uri);
+    var enumBundle = bundle.getSimpleEnumeration();
+
+    while (enumBundle.hasMoreElements())
+    {
+      var item = enumBundle.getNext().QueryInterface(Components.interfaces.nsIPropertyElement);
+      cdump('bundle ' + uri + ' key : ' + item.key + ', value : ' + item.value);
+    }
+  }
+  catch(ex)
+  {
+    cdump('Error loading bundle ' + uri + ': ' + ex);
+  }
+}
+
+
+function getOverridePref(prefName, uri)
+{
+  var bundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].
+    getService(Components.interfaces.nsIStringBundleService);
+
+  var bundle = bundleService.createBundle(uri);
+  var value;
+
+  try
+  {
+    value =  bundle.GetStringFromName(prefName);
+  }
+  catch(ex)
+  {
+    cdump('Ignoring ' + ex);
+  }
+  return value;
+}
+
+
+
+