Compare commits
6 Commits
release
...
litmus_mod
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5bdc196872 | ||
|
|
0cdacee57a | ||
|
|
cbac7784a9 | ||
|
|
bee9d2b36d | ||
|
|
31141bc0db | ||
|
|
bfbf8147b2 |
@@ -1,26 +0,0 @@
|
||||
#
|
||||
## hostname: fx-linux-tbox
|
||||
## uname: Linux fx-linux-tbox.build.mozilla.org 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 i686 i386 GNU/Linux
|
||||
#
|
||||
|
||||
export CFLAGS="-gstabs+"
|
||||
export CXXFLAGS="-gstabs+"
|
||||
|
||||
mk_add_options MOZ_CO_PROJECT=browser
|
||||
mk_add_options PROFILE_GEN_SCRIPT=@TOPSRCDIR@/build/profile_pageloader.pl
|
||||
mk_add_options MOZ_CO_MODULE="mozilla/tools/update-packaging"
|
||||
mk_add_options MOZ_MAKE_FLAGS="-j1"
|
||||
|
||||
ac_add_options --enable-application=browser
|
||||
ac_add_options --enable-update-channel=release
|
||||
ac_add_options --enable-update-packaging
|
||||
|
||||
# Don't add explicit optimize flags here, set them in configure.in, see bug 407794.
|
||||
ac_add_options --enable-optimize
|
||||
ac_add_options --disable-debug
|
||||
ac_add_options --disable-tests
|
||||
|
||||
ac_add_options --enable-official-branding
|
||||
|
||||
CC=/tools/gcc/bin/gcc
|
||||
CXX=/tools/gcc/bin/g++
|
||||
@@ -1,268 +0,0 @@
|
||||
#
|
||||
## hostname: fx-linux-tbox
|
||||
## uname: Linux fx-linux-tbox.build.mozilla.org 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 i686 i386 GNU/Linux
|
||||
#
|
||||
|
||||
#- tinder-config.pl - Tinderbox configuration file.
|
||||
#- Uncomment the variables you need to set.
|
||||
#- The default values are the same as the commented variables.
|
||||
|
||||
$ENV{CVS_RSH} = "ssh";
|
||||
$ENV{MOZ_CRASHREPORTER_NO_REPORT} = '1';
|
||||
|
||||
# To ensure Talkback client builds properly on some Linux boxen where LANG
|
||||
# is set to "en_US.UTF-8" by default, override that setting here by setting
|
||||
# it to "en_US.iso885915" (the setting on ocean). Proper fix is to update
|
||||
# where xrestool is called in the build system so that 'LANG=C' in its
|
||||
# environment, according to bryner.
|
||||
$ENV{LANG} = "en_US.iso885915";
|
||||
|
||||
# $ENV{MOZ_PACKAGE_MSI}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: 0
|
||||
# Values: 0 | 1
|
||||
# Purpose: Controls whether a MSI package is made.
|
||||
# Requires: Windows and a local MakeMSI installation.
|
||||
#$ENV{MOZ_PACKAGE_MSI} = 0;
|
||||
|
||||
# $ENV{MOZ_SYMBOLS_TRANSFER_TYPE}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: scp
|
||||
# Values: scp | rsync
|
||||
# Purpose: Use scp or rsync to transfer symbols to the Talkback server.
|
||||
# Requires: The selected type requires the command be available both locally
|
||||
# and on the Talkback server.
|
||||
#$ENV{MOZ_SYMBOLS_TRANSFER_TYPE} = "scp";
|
||||
|
||||
#- PLEASE FILL THIS IN WITH YOUR PROPER EMAIL ADDRESS
|
||||
$BuildAdministrator = 'build@mozilla.org';
|
||||
#$BuildAdministrator = "$ENV{USER}\@$ENV{HOST}";
|
||||
#$BuildAdministrator = ($ENV{USER} || "cltbld") . "\@" . ($ENV{HOST} || "dhcp");
|
||||
|
||||
#- You'll need to change these to suit your machine's needs
|
||||
$DisplayServer = ':0.0';
|
||||
|
||||
#- Default values of command-line opts
|
||||
#-
|
||||
#$BuildDepend = 1; # Depend or Clobber
|
||||
#$BuildDebug = 0; # Debug or Opt (Darwin)
|
||||
#$ReportStatus = 1; # Send results to server, or not
|
||||
#$ReportFinalStatus = 1; # Finer control over $ReportStatus.
|
||||
$UseTimeStamp = 0; # Use the CVS 'pull-by-timestamp' option, or not
|
||||
#$BuildOnce = 0; # Build once, don't send results to server
|
||||
#$TestOnly = 0; # Only run tests, don't pull/build
|
||||
#$BuildEmbed = 0; # After building seamonkey, go build embed app.
|
||||
#$SkipMozilla = 0; # Use to debug post-mozilla.pl scripts.
|
||||
#$BuildLocales = 0; # Do l10n packaging?
|
||||
|
||||
# Tests
|
||||
$CleanProfile = 1;
|
||||
#$ResetHomeDirForTests = 1;
|
||||
$ProductName = "Firefox";
|
||||
$VendorName = 'Mozilla';
|
||||
|
||||
$RunMozillaTests = 1; # Allow turning off of all tests if needed.
|
||||
$RegxpcomTest = 1;
|
||||
$AliveTest = 1;
|
||||
#$JavaTest = 0;
|
||||
#$ViewerTest = 0;
|
||||
#$BloatTest = 0; # warren memory bloat test
|
||||
#$BloatTest2 = 0; # dbaron memory bloat test, require tracemalloc
|
||||
#$DomToTextConversionTest = 0;
|
||||
#$XpcomGlueTest = 0;
|
||||
$CodesizeTest = 0; # Z, require mozilla/tools/codesighs
|
||||
$EmbedCodesizeTest = 0; # mZ, require mozilla/tools/codesigns
|
||||
#$MailBloatTest = 0;
|
||||
#$EmbedTest = 0; # Assumes you wanted $BuildEmbed=1
|
||||
$LayoutPerformanceTest = 0; # Tp
|
||||
$DHTMLPerformanceTest = 0; # Tdhtml
|
||||
#$QATest = 0;
|
||||
#$XULWindowOpenTest = 0; # Txul
|
||||
$StartupPerformanceTest = 0; # Ts
|
||||
|
||||
$TestsPhoneHome = 0; # Should test report back to server?
|
||||
$GraphNameOverride = 'fx-linux-tbox';
|
||||
|
||||
# $results_server
|
||||
#----------------------------------------------------------------------------
|
||||
# Server on which test results will be accessible. This was originally tegu,
|
||||
# then became axolotl. Once we moved services from axolotl, it was time
|
||||
# to give this service its own hostname to make future transitions easier.
|
||||
# - cmp@mozilla.org
|
||||
#$results_server = "build-graphs.mozilla.org";
|
||||
|
||||
#$pageload_server = "spider"; # localhost
|
||||
$pageload_server = "pageload.build.mozilla.org";
|
||||
|
||||
|
||||
#
|
||||
# Timeouts, values are in seconds.
|
||||
#
|
||||
#$CVSCheckoutTimeout = 3600;
|
||||
#$CreateProfileTimeout = 45;
|
||||
#$RegxpcomTestTimeout = 120;
|
||||
|
||||
#$AliveTestTimeout = 45;
|
||||
#$ViewerTestTimeout = 45;
|
||||
#$EmbedTestTimeout = 45;
|
||||
#$BloatTestTimeout = 120; # seconds
|
||||
#$MailBloatTestTimeout = 120; # seconds
|
||||
#$JavaTestTimeout = 45;
|
||||
#$DomTestTimeout = 45; # seconds
|
||||
#$XpcomGlueTestTimeout = 15;
|
||||
#$CodesizeTestTimeout = 900; # seconds
|
||||
#$CodesizeTestType = "auto"; # {"auto"|"base"}
|
||||
#$LayoutPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$DHTMLPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$QATestTimeout = 1200; # entire test, seconds
|
||||
#$LayoutPerformanceTestPageTimeout = 30000; # each page, ms
|
||||
#$StartupPerformanceTestTimeout = 15; # seconds
|
||||
#$XULWindowOpenTestTimeout = 150; # seconds
|
||||
|
||||
|
||||
#$MozConfigFileName = 'mozconfig';
|
||||
|
||||
#$UseMozillaProfile = 1;
|
||||
#$MozProfileName = 'default';
|
||||
|
||||
#- Set these to what makes sense for your system
|
||||
#$Make = 'gmake'; # Must be GNU make
|
||||
#$MakeOverrides = '';
|
||||
#$mail = '/bin/mail';
|
||||
#$CVS = 'cvs -q';
|
||||
#$CVSCO = 'checkout -P';
|
||||
|
||||
# win32 usually doesn't have /bin/mail
|
||||
#$blat = 'c:/nstools/bin/blat';
|
||||
#$use_blat = 0;
|
||||
|
||||
# Set moz_cvsroot to something like:
|
||||
# :pserver:$ENV{USER}%netscape.com\@cvs.mozilla.org:/cvsroot
|
||||
# :pserver:anonymous\@cvs-mirror.mozilla.org:/cvsroot
|
||||
#
|
||||
# Note that win32 may not need \@, depends on ' or ".
|
||||
# :pserver:$ENV{USER}%netscape.com@cvs.mozilla.org:/cvsroot
|
||||
|
||||
#$moz_cvsroot = $ENV{CVSROOT};
|
||||
# CONFIG: $moz_cvsroot = '%mozillaCvsroot%';
|
||||
$moz_cvsroot = 'cltbld@cvs.mozilla.org:/cvsroot';
|
||||
|
||||
#- Set these proper values for your tinderbox server
|
||||
#$Tinderbox_server = 'tinderbox-daemon@tinderbox.mozilla.org';
|
||||
|
||||
# Allow for non-client builds, e.g. camino.
|
||||
#$moz_client_mk = 'client.mk';
|
||||
|
||||
#- Set if you want to build in a separate object tree
|
||||
$ObjDir = 'obj-fx-trunk';
|
||||
|
||||
# Extra build name, if needed.
|
||||
$BuildNameExtra = 'Release';
|
||||
|
||||
# User comment, eg. ip address for dhcp builds.
|
||||
# ex: $UserComment = "ip = 208.12.36.108";
|
||||
#$UserComment = 0;
|
||||
|
||||
#-
|
||||
#- The rest should not need to be changed
|
||||
#-
|
||||
|
||||
#- Minimum wait period from start of build to start of next build in minutes.
|
||||
#$BuildSleep = 10;
|
||||
|
||||
#- Until you get the script working. When it works,
|
||||
#- change to the tree you're actually building
|
||||
# CONFIG: $BuildTree = '%buildTree%';
|
||||
$BuildTree = 'MozillaRelease';
|
||||
|
||||
#$BuildName = '';
|
||||
# CONFIG: $BuildTag = '%productTag%_RELEASE';
|
||||
$BuildTag = 'FIREFOX_3_0_19_RELEASE';
|
||||
#$BuildConfigDir = 'mozilla/config';
|
||||
#$Topsrcdir = 'mozilla';
|
||||
|
||||
$BinaryName = 'firefox-bin';
|
||||
|
||||
#
|
||||
# For embedding app, use:
|
||||
#$EmbedBinaryName = 'TestGtkEmbed';
|
||||
#$EmbedDistDir = 'dist/bin'
|
||||
|
||||
|
||||
#$ShellOverride = ''; # Only used if the default shell is too stupid
|
||||
#$ConfigureArgs = '';
|
||||
#$ConfigureEnvArgs = '';
|
||||
#$Compiler = 'gcc';
|
||||
#$NSPRArgs = '';
|
||||
#$ShellOverride = '';
|
||||
|
||||
# Release build options
|
||||
$ReleaseBuild = 1;
|
||||
$shiptalkback = 0;
|
||||
$ReleaseToLatest = 0; # Push the release to latest-<milestone>?
|
||||
$ReleaseToDated = 1; # Push the release to YYYY-MM-DD-HH-<milestone>?
|
||||
$build_hour = 4;
|
||||
$package_creation_path = "/browser/installer";
|
||||
# needs setting for mac + talkback: $mac_bundle_path = "/browser/app";
|
||||
$ssh_version = "2";
|
||||
# CONFIG: $ssh_user = "%sshUser%";
|
||||
$ssh_user = "cltbld";
|
||||
# CONFIG: $ssh_server = "%sshServer%";
|
||||
$ssh_server = "stage-old.mozilla.org";
|
||||
$ftp_path = "/home/ftp/pub/firefox/nightly";
|
||||
$url_path = "http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly";
|
||||
$tbox_ftp_path = "/home/ftp/pub/firefox/tinderbox-builds";
|
||||
$tbox_url_path = "http://ftp.mozilla.org/pub/mozilla.org/firefox/tinderbox-builds";
|
||||
# CONFIG: $milestone = "firefox%version%";
|
||||
$milestone = "firefox3.0.19";
|
||||
$notify_list = 'build-announce@mozilla.org';
|
||||
$stub_installer = 0;
|
||||
$sea_installer = 0;
|
||||
$archive = 1;
|
||||
$push_raw_xpis = 0;
|
||||
$update_pushinfo = 0;
|
||||
$update_package = 1;
|
||||
$update_product = "Firefox";
|
||||
$update_version = "trunk";
|
||||
$update_platform = "Linux_x86-gcc3";
|
||||
$update_hash = "sha1";
|
||||
$update_filehost = 'ftp.mozilla.org';
|
||||
$update_ver_file = 'browser/config/version.txt';
|
||||
$crashreporter_buildsymbols = 1;
|
||||
$crashreporter_pushsymbols = 1;
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_HOST'} = '%symbolServer%';
|
||||
$ENV{'SYMBOL_SERVER_HOST'} = 'dm-symbolpush01.mozilla.org';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_USER'} = '%symbolServerUser%';
|
||||
$ENV{'SYMBOL_SERVER_USER'} = 'ffxbld';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_PATH'} = '%symbolServerPath%';
|
||||
$ENV{'SYMBOL_SERVER_PATH'} = '/mnt/netapp/breakpad/symbols_ffx';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_SSH_KEY'} = '%symbolServerKey%';
|
||||
$ENV{'SYMBOL_SERVER_SSH_KEY'} = '/home/cltbld/.ssh/ffxbld_dsa';
|
||||
|
||||
# Reboot the OS at the end of build-and-test cycle. This is primarily
|
||||
# intended for Win9x, which can't last more than a few cycles before
|
||||
# locking up (and testing would be suspect even after a couple of cycles).
|
||||
# Right now, there is only code to force the reboot for Win9x, so even
|
||||
# setting this to 1, will not have an effect on other platforms. Setting
|
||||
# up win9x to automatically logon and begin running tinderbox is left
|
||||
# as an exercise to the reader.
|
||||
#$RebootSystem = 0;
|
||||
|
||||
# LogCompression specifies the type of compression used on the log file.
|
||||
# Valid options are 'gzip', and 'bzip2'. Please make sure the binaries
|
||||
# for 'gzip' or 'bzip2' are in the user's path before setting this
|
||||
# option.
|
||||
#$LogCompression = '';
|
||||
|
||||
# LogEncoding specifies the encoding format used for the logs. Valid
|
||||
# options are 'base64', and 'uuencode'. If $LogCompression is set above,
|
||||
# this needs to be set to 'base64' or 'uuencode' to ensure that the
|
||||
# binary data is transferred properly.
|
||||
#$LogEncoding = '';
|
||||
|
||||
# Prevent Extension Manager from spawning child processes during tests
|
||||
# - processes that tbox scripts cannot kill.
|
||||
#$ENV{NO_EM_RESTART} = '1';
|
||||
|
||||
# Do not build XForms
|
||||
$BuildXForms = 0;
|
||||
@@ -1,26 +0,0 @@
|
||||
#
|
||||
## hostname: bm-xserve08.build.mozilla.org
|
||||
## uname: Darwin bm-xserve08.build.mozilla.org 8.8.4 Darwin Kernel Version 8.8.4: Sun Oct 29 15:26:54 PST 2006; root:xnu-792.16.4.obj~1/RELEASE_I386 i386 i386
|
||||
#
|
||||
|
||||
# symbols for breakpad
|
||||
export CFLAGS="-g -gfull"
|
||||
export CXXFLAGS="-g -gfull"
|
||||
|
||||
. $topsrcdir/build/macosx/universal/mozconfig
|
||||
|
||||
mk_add_options MOZ_MAKE_FLAGS="-j1"
|
||||
mk_add_options MOZ_CO_MODULE="mozilla/tools/update-packaging"
|
||||
mk_add_options MOZ_CO_PROJECT="browser"
|
||||
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../build/universal
|
||||
|
||||
ac_add_options --enable-application=browser
|
||||
ac_add_options --enable-update-channel=release
|
||||
# Don't add explicit optimize flags here, set them in configure.in, see bug 407794.
|
||||
ac_add_options --enable-optimize
|
||||
ac_add_options --disable-debug
|
||||
ac_add_options --disable-tests
|
||||
ac_add_options --enable-update-packaging
|
||||
|
||||
ac_add_options --enable-official-branding
|
||||
ac_add_app_options ppc --enable-prebinding
|
||||
@@ -1,267 +0,0 @@
|
||||
#
|
||||
## hostname: bm-xserve08.build.mozilla.org
|
||||
## uname: Darwin bm-xserve08.build.mozilla.org 8.8.4 Darwin Kernel Version 8.8.4: Sun Oct 29 15:26:54 PST 2006; root:xnu-792.16.4.obj~1/RELEASE_I386 i386 i386
|
||||
#
|
||||
|
||||
#- tinder-config.pl - Tinderbox configuration file.
|
||||
#- Uncomment the variables you need to set.
|
||||
#- The default values are the same as the commented variables.
|
||||
|
||||
$ENV{NO_EM_RESTART} = "1";
|
||||
$ENV{DYLD_NO_FIX_PREBINDING} = "1";
|
||||
$ENV{LD_PREBIND_ALLOW_OVERLAP} = "1";
|
||||
$ENV{CVS_RSH} = "ssh";
|
||||
|
||||
$MacUniversalBinary = 1;
|
||||
|
||||
# $ENV{MOZ_PACKAGE_MSI}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: 0
|
||||
# Values: 0 | 1
|
||||
# Purpose: Controls whether a MSI package is made.
|
||||
# Requires: Windows and a local MakeMSI installation.
|
||||
#$ENV{MOZ_PACKAGE_MSI} = 0;
|
||||
|
||||
# $ENV{MOZ_SYMBOLS_TRANSFER_TYPE}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: scp
|
||||
# Values: scp | rsync
|
||||
# Purpose: Use scp or rsync to transfer symbols to the Talkback server.
|
||||
# Requires: The selected type requires the command be available both locally
|
||||
# and on the Talkback server.
|
||||
#$ENV{MOZ_SYMBOLS_TRANSFER_TYPE} = "scp";
|
||||
|
||||
#- PLEASE FILL THIS IN WITH YOUR PROPER EMAIL ADDRESS
|
||||
$BuildAdministrator = 'build@mozilla.org';
|
||||
#$BuildAdministrator = "$ENV{USER}\@$ENV{HOST}";
|
||||
#$BuildAdministrator = ($ENV{USER} || "cltbld") . "\@" . ($ENV{HOST} || "dhcp");
|
||||
|
||||
#- You'll need to change these to suit your machine's needs
|
||||
#$DisplayServer = ':0.0';
|
||||
|
||||
#- Default values of command-line opts
|
||||
#-
|
||||
#$BuildDepend = 1; # Depend or Clobber
|
||||
#$BuildDebug = 0; # Debug or Opt (Darwin)
|
||||
#$ReportStatus = 1; # Send results to server, or not
|
||||
#$ReportFinalStatus = 1; # Finer control over $ReportStatus.
|
||||
$UseTimeStamp = 0; # Use the CVS 'pull-by-timestamp' option, or not
|
||||
#$BuildOnce = 0; # Build once, don't send results to server
|
||||
#$TestOnly = 0; # Only run tests, don't pull/build
|
||||
#$BuildEmbed = 0; # After building seamonkey, go build embed app.
|
||||
#$SkipMozilla = 0; # Use to debug post-mozilla.pl scripts.
|
||||
#$BuildLocales = 0; # Do l10n packaging?
|
||||
|
||||
# Tests
|
||||
$CleanProfile = 1;
|
||||
#$ResetHomeDirForTests = 1;
|
||||
$ProductName = 'Firefox';
|
||||
$VendorName = "Mozilla";
|
||||
|
||||
$RunMozillaTests = 1; # Allow turning off of all tests if needed.
|
||||
$RegxpcomTest = 1;
|
||||
$AliveTest = 1;
|
||||
#$JavaTest = 0;
|
||||
#$ViewerTest = 0;
|
||||
#$BloatTest = 0; # warren memory bloat test
|
||||
#$BloatTest2 = 0; # dbaron memory bloat test, require tracemalloc
|
||||
#$DomToTextConversionTest = 0;
|
||||
#$XpcomGlueTest = 0;
|
||||
$CodesizeTest = 0; # Z, require mozilla/tools/codesighs
|
||||
$EmbedCodesizeTest = 0; # mZ, require mozilla/tools/codesigns
|
||||
#$MailBloatTest = 0;
|
||||
#$EmbedTest = 0; # Assumes you wanted $BuildEmbed=1
|
||||
$LayoutPerformanceTest = 0; # Tp
|
||||
$LayoutPerformanceLocalTest = 0; # Tp2
|
||||
$DHTMLPerformanceTest = 0; # Tdhtml
|
||||
#$QATest = 0;
|
||||
$XULWindowOpenTest = 0; # Txul
|
||||
$StartupPerformanceTest = 0; # Ts
|
||||
|
||||
$TestsPhoneHome = 0; # Should test report back to server?
|
||||
|
||||
$GraphNameOverride = 'xserve08.build.mozilla.org_Fx-Trunk';
|
||||
|
||||
# $results_server
|
||||
#----------------------------------------------------------------------------
|
||||
# Server on which test results will be accessible. This was originally tegu,
|
||||
# then became axolotl. Once we moved services from axolotl, it was time
|
||||
# to give this service its own hostname to make future transitions easier.
|
||||
# - cmp@mozilla.org
|
||||
#$results_server = "build-graphs.mozilla.org";
|
||||
|
||||
#$pageload_server = "spider"; # localhost
|
||||
$pageload_server = "pageload.build.mozilla.org"; # localhost
|
||||
|
||||
#
|
||||
# Timeouts, values are in seconds.
|
||||
#
|
||||
#$CVSCheckoutTimeout = 3600;
|
||||
#$CreateProfileTimeout = 45;
|
||||
#$RegxpcomTestTimeout = 120;
|
||||
|
||||
$AliveTestTimeout = 10;
|
||||
#$ViewerTestTimeout = 45;
|
||||
#$EmbedTestTimeout = 45;
|
||||
#$BloatTestTimeout = 120; # seconds
|
||||
#$MailBloatTestTimeout = 120; # seconds
|
||||
#$JavaTestTimeout = 45;
|
||||
#$DomTestTimeout = 45; # seconds
|
||||
#$XpcomGlueTestTimeout = 15;
|
||||
#$CodesizeTestTimeout = 900; # seconds
|
||||
#$CodesizeTestType = "auto"; # {"auto"|"base"}
|
||||
$LayoutPerformanceTestTimeout = 300; # entire test, seconds
|
||||
$LayoutPerformanceLocalTestTimeout = 180; # entire test, seconds
|
||||
$DHTMLPerformanceTestTimeout = 180; # entire test, seconds
|
||||
#$QATestTimeout = 1200; # entire test, seconds
|
||||
#$LayoutPerformanceTestPageTimeout = 30000; # each page, ms
|
||||
#$StartupPerformanceTestTimeout = 15; # seconds
|
||||
#$XULWindowOpenTestTimeout = 150; # seconds
|
||||
|
||||
|
||||
#$MozConfigFileName = 'mozconfig';
|
||||
|
||||
#$UseMozillaProfile = 1;
|
||||
#$MozProfileName = 'default';
|
||||
|
||||
#- Set these to what makes sense for your system
|
||||
#$Make = 'gmake'; # Must be GNU make
|
||||
#$MakeOverrides = '';
|
||||
#$mail = '/bin/mail';
|
||||
#$CVS = 'cvs -q';
|
||||
#$CVSCO = 'checkout -P';
|
||||
|
||||
# win32 usually doesn't have /bin/mail
|
||||
#$blat = 'c:/nstools/bin/blat';
|
||||
#$use_blat = 0;
|
||||
|
||||
# Set moz_cvsroot to something like:
|
||||
# :pserver:$ENV{USER}%netscape.com\@cvs.mozilla.org:/cvsroot
|
||||
# :pserver:anonymous\@cvs-mirror.mozilla.org:/cvsroot
|
||||
#
|
||||
# Note that win32 may not need \@, depends on ' or ".
|
||||
# :pserver:$ENV{USER}%netscape.com@cvs.mozilla.org:/cvsroot
|
||||
|
||||
# CONFIG: $moz_cvsroot = '%mozillaCvsroot%';
|
||||
$moz_cvsroot = 'cltbld@cvs.mozilla.org:/cvsroot';
|
||||
|
||||
#- Set these proper values for your tinderbox server
|
||||
#$Tinderbox_server = 'tinderbox-daemon@tinderbox.mozilla.org';
|
||||
|
||||
# Allow for non-client builds, e.g. camino.
|
||||
#$moz_client_mk = 'client.mk';
|
||||
|
||||
#- Set if you want to build in a separate object tree
|
||||
$ObjDir = '../build/universal';
|
||||
|
||||
# Extra build name, if needed.
|
||||
$BuildNameExtra = 'Release';
|
||||
|
||||
# User comment, eg. ip address for dhcp builds.
|
||||
# ex: $UserComment = "ip = 208.12.36.108";
|
||||
#$UserComment = 0;
|
||||
|
||||
#-
|
||||
#- The rest should not need to be changed
|
||||
#-
|
||||
|
||||
#- Minimum wait period from start of build to start of next build in minutes.
|
||||
#$BuildSleep = 10;
|
||||
|
||||
#- Until you get the script working. When it works,
|
||||
#- change to the tree you're actually building
|
||||
# CONFIG: $BuildTree = '%buildTree%';
|
||||
$BuildTree = 'MozillaRelease';
|
||||
|
||||
#$BuildName = '';
|
||||
# CONFIG: $BuildTag = '%productTag%_RELEASE';
|
||||
$BuildTag = 'FIREFOX_3_0_19_RELEASE';
|
||||
#$BuildConfigDir = 'mozilla/config';
|
||||
#$Topsrcdir = 'mozilla';
|
||||
|
||||
$BinaryName = 'firefox-bin';
|
||||
|
||||
#
|
||||
# For embedding app, use:
|
||||
#$EmbedBinaryName = 'TestGtkEmbed';
|
||||
#$EmbedDistDir = 'dist/bin'
|
||||
|
||||
|
||||
#$ShellOverride = ''; # Only used if the default shell is too stupid
|
||||
#$ConfigureArgs = '';
|
||||
#$ConfigureEnvArgs = '';
|
||||
#$Compiler = 'gcc';
|
||||
#$NSPRArgs = '';
|
||||
#$ShellOverride = '';
|
||||
|
||||
# Release build options
|
||||
$ReleaseBuild = 1;
|
||||
$shiptalkback = 0;
|
||||
$ReleaseToLatest = 0; # Push the release to latest-<milestone>?
|
||||
$ReleaseToDated = 1; # Push the release to YYYY-MM-DD-HH-<milestone>?
|
||||
$build_hour = "4";
|
||||
$package_creation_path = "/browser/installer";
|
||||
# needs setting for mac + talkback: $mac_bundle_path = "/browser/app";
|
||||
$mac_bundle_path = "/browser/app";
|
||||
$ssh_version = "2";
|
||||
# CONFIG: $ssh_user = "%sshUser%";
|
||||
$ssh_user = "cltbld";
|
||||
# CONFIG: $ssh_server = "%sshServer%";
|
||||
$ssh_server = "stage-old.mozilla.org";
|
||||
$ftp_path = "/home/ftp/pub/firefox/nightly";
|
||||
$url_path = "http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly";
|
||||
$tbox_ftp_path = "/home/ftp/pub/firefox/tinderbox-builds";
|
||||
$tbox_url_path = "http://ftp.mozilla.org/pub/mozilla.org/firefox/tinderbox-builds";
|
||||
# CONFIG: $milestone = 'firefox%version%';
|
||||
$milestone = 'firefox3.0.19';
|
||||
$notify_list = "build-announce\@mozilla.org";
|
||||
$stub_installer = 0;
|
||||
$sea_installer = 0;
|
||||
$archive = 1;
|
||||
$push_raw_xpis = 0;
|
||||
$update_package = 1;
|
||||
$update_product = "Firefox";
|
||||
$update_version = "trunk";
|
||||
$update_platform = "Darwin_Universal-gcc3";
|
||||
$update_hash = "sha1";
|
||||
$update_filehost = "ftp.mozilla.org";
|
||||
$update_ver_file = 'browser/config/version.txt';
|
||||
$update_pushinfo = 0;
|
||||
$crashreporter_buildsymbols = 1;
|
||||
$crashreporter_pushsymbols = 1;
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_HOST'} = '%symbolServer%';
|
||||
$ENV{'SYMBOL_SERVER_HOST'} = 'dm-symbolpush01.mozilla.org';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_USER'} = '%symbolServerUser%';
|
||||
$ENV{'SYMBOL_SERVER_USER'} = 'ffxbld';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_PATH'} = '%symbolServerPath%';
|
||||
$ENV{'SYMBOL_SERVER_PATH'} = '/mnt/netapp/breakpad/symbols_ffx';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_SSH_KEY'} = '%symbolServerKey%';
|
||||
$ENV{'SYMBOL_SERVER_SSH_KEY'} = '/Users/cltbld/.ssh/ffxbld_dsa';
|
||||
|
||||
# Reboot the OS at the end of build-and-test cycle. This is primarily
|
||||
# intended for Win9x, which can't last more than a few cycles before
|
||||
# locking up (and testing would be suspect even after a couple of cycles).
|
||||
# Right now, there is only code to force the reboot for Win9x, so even
|
||||
# setting this to 1, will not have an effect on other platforms. Setting
|
||||
# up win9x to automatically logon and begin running tinderbox is left
|
||||
# as an exercise to the reader.
|
||||
#$RebootSystem = 0;
|
||||
|
||||
# LogCompression specifies the type of compression used on the log file.
|
||||
# Valid options are 'gzip', and 'bzip2'. Please make sure the binaries
|
||||
# for 'gzip' or 'bzip2' are in the user's path before setting this
|
||||
# option.
|
||||
#$LogCompression = '';
|
||||
|
||||
# LogEncoding specifies the encoding format used for the logs. Valid
|
||||
# options are 'base64', and 'uuencode'. If $LogCompression is set above,
|
||||
# this needs to be set to 'base64' or 'uuencode' to ensure that the
|
||||
# binary data is transferred properly.
|
||||
#$LogEncoding = '';
|
||||
|
||||
# Prevent Extension Manager from spawning child processes during tests
|
||||
# - processes that tbox scripts cannot kill.
|
||||
#$ENV{NO_EM_RESTART} = '1';
|
||||
|
||||
# Do not build XForms
|
||||
$BuildXForms = 0;
|
||||
@@ -1,22 +0,0 @@
|
||||
#
|
||||
## hostname: fx-win32-tbox
|
||||
## uname: MINGW32_NT-5.2 FX-WIN32-TBOX 1.0.11(0.46/3/2) 2007-01-12 12:05 i686 Msys
|
||||
#
|
||||
export CFLAGS="-GL -wd4624 -wd4952"
|
||||
export CXXFLAGS="-GL -wd4624 -wd4952"
|
||||
export LDFLAGS="-LTCG"
|
||||
|
||||
mk_add_options MOZ_CO_PROJECT=browser
|
||||
mk_add_options MOZ_MAKE_FLAGS="-j1"
|
||||
mk_add_options MOZ_CO_MODULE="mozilla/tools/update-packaging"
|
||||
mk_add_options PROFILE_GEN_SCRIPT='$(PYTHON) $(MOZ_OBJDIR)/_profile/pgo/profileserver.py'
|
||||
|
||||
ac_add_options --enable-application=browser
|
||||
ac_add_options --enable-update-channel=release
|
||||
ac_add_options --enable-optimize
|
||||
ac_add_options --disable-debug
|
||||
ac_add_options --disable-tests
|
||||
ac_add_options --enable-update-packaging
|
||||
ac_add_options --enable-official-branding
|
||||
ac_add_options --enable-jemalloc
|
||||
ac_add_options --with-crashreporter-enable-percent=10
|
||||
@@ -1,267 +0,0 @@
|
||||
#
|
||||
## hostname: fx-win32-tbox
|
||||
## uname: MINGW32_NT-5.2 FX-WIN32-TBOX 1.0.11(0.46/3/2) 2007-01-12 12:05 i686 Msys
|
||||
#
|
||||
|
||||
#- tinder-config.pl - Tinderbox configuration file.
|
||||
#- Uncomment the variables you need to set.
|
||||
#- The default values are the same as the commented variables.
|
||||
|
||||
$ENV{NO_EM_RESTART} = '1';
|
||||
$ENV{CVS_RSH} = "ssh";
|
||||
$ENV{MOZ_CRASHREPORTER_NO_REPORT} = '1';
|
||||
# Both these two variables are for source server support
|
||||
$ENV{PDBSTR_PATH} = 'C:\\Program Files\\Debugging Tools for Windows\\sdk\\srcsrv\\pdbstr.exe';
|
||||
$ENV{SRCSRV_ROOT} = ':pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot';
|
||||
|
||||
# $ENV{MOZ_PACKAGE_MSI}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: 0
|
||||
# Values: 0 | 1
|
||||
# Purpose: Controls whether a MSI package is made.
|
||||
# Requires: Windows and a local MakeMSI installation.
|
||||
#$ENV{MOZ_PACKAGE_MSI} = 0;
|
||||
|
||||
# $ENV{MOZ_SYMBOLS_TRANSFER_TYPE}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: scp
|
||||
# Values: scp | rsync
|
||||
# Purpose: Use scp or rsync to transfer symbols to the Talkback server.
|
||||
# Requires: The selected type requires the command be available both locally
|
||||
# and on the Talkback server.
|
||||
#$ENV{MOZ_SYMBOLS_TRANSFER_TYPE} = "scp";
|
||||
|
||||
#- PLEASE FILL THIS IN WITH YOUR PROPER EMAIL ADDRESS
|
||||
$BuildAdministrator = 'build@mozilla.org';
|
||||
#$BuildAdministrator = "$ENV{USER}\@$ENV{HOST}";
|
||||
#$BuildAdministrator = ($ENV{USER} || "cltbld") . "\@" . ($ENV{HOST} || "dhcp");
|
||||
|
||||
#- You'll need to change these to suit your machine's needs
|
||||
#$DisplayServer = ':0.0';
|
||||
|
||||
#- Default values of command-line opts
|
||||
#-
|
||||
#$BuildDepend = 1; # Depend or Clobber
|
||||
#$BuildDebug = 0; # Debug or Opt (Darwin)
|
||||
#$ReportStatus = 1; # Send results to server, or not
|
||||
#$ReportFinalStatus = 1; # Finer control over $ReportStatus.
|
||||
$UseTimeStamp = 0; # Use the CVS 'pull-by-timestamp' option, or not
|
||||
#$BuildOnce = 0; # Build once, don't send results to server
|
||||
#$TestOnly = 0; # Only run tests, don't pull/build
|
||||
#$BuildEmbed = 0; # After building seamonkey, go build embed app.
|
||||
#$SkipMozilla = 0; # Use to debug post-mozilla.pl scripts.
|
||||
#$BuildLocales = 0; # Do l10n packaging?
|
||||
|
||||
# Tests
|
||||
$CleanProfile = 1;
|
||||
#$ResetHomeDirForTests = 1;
|
||||
$ProductName = "Firefox";
|
||||
$VendorName = "Mozilla";
|
||||
|
||||
$RunMozillaTests = 1; # Allow turning off of all tests if needed.
|
||||
$RegxpcomTest = 1;
|
||||
$AliveTest = 1;
|
||||
$JavaTest = 0;
|
||||
$ViewerTest = 0;
|
||||
$BloatTest = 0; # warren memory bloat test
|
||||
$BloatTest2 = 0; # dbaron memory bloat test, require tracemalloc
|
||||
$DomToTextConversionTest = 0;
|
||||
$XpcomGlueTest = 0;
|
||||
$CodesizeTest = 0; # Z, require mozilla/tools/codesighs
|
||||
$EmbedCodesizeTest = 0; # mZ, require mozilla/tools/codesigns
|
||||
$MailBloatTest = 0;
|
||||
$EmbedTest = 0; # Assumes you wanted $BuildEmbed=1
|
||||
$LayoutPerformanceTest = 0; # Tp
|
||||
$DHTMLPerformanceTest = 0; # Tdhtml
|
||||
$QATest = 0;
|
||||
$XULWindowOpenTest = 0; # Txul
|
||||
$StartupPerformanceTest = 0; # Ts
|
||||
$NeckoUnitTest = 0;
|
||||
$RenderPerformanceTest = 0; # Tgfx
|
||||
|
||||
$TestsPhoneHome = 0; # Should test report back to server?
|
||||
$GraphNameOverride = 'fx-win32-tbox';
|
||||
|
||||
# $results_server
|
||||
#----------------------------------------------------------------------------
|
||||
# Server on which test results will be accessible. This was originally tegu,
|
||||
# then became axolotl. Once we moved services from axolotl, it was time
|
||||
# to give this service its own hostname to make future transitions easier.
|
||||
# - cmp@mozilla.org
|
||||
#$results_server = "build-graphs.mozilla.org";
|
||||
|
||||
$pageload_server = "pageload.build.mozilla.org"; # localhost
|
||||
|
||||
#
|
||||
# Timeouts, values are in seconds.
|
||||
#
|
||||
#$CVSCheckoutTimeout = 3600;
|
||||
#$CreateProfileTimeout = 45;
|
||||
#$RegxpcomTestTimeout = 120;
|
||||
|
||||
#$AliveTestTimeout = 30;
|
||||
#$ViewerTestTimeout = 45;
|
||||
#$EmbedTestTimeout = 45;
|
||||
#$BloatTestTimeout = 120; # seconds
|
||||
#$MailBloatTestTimeout = 120; # seconds
|
||||
#$JavaTestTimeout = 45;
|
||||
#$DomTestTimeout = 45; # seconds
|
||||
#$XpcomGlueTestTimeout = 15;
|
||||
#$CodesizeTestTimeout = 900; # seconds
|
||||
#$CodesizeTestType = "auto"; # {"auto"|"base"}
|
||||
$LayoutPerformanceTestTimeout = 800; # entire test, seconds
|
||||
#$DHTMLPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$QATestTimeout = 1200; # entire test, seconds
|
||||
#$LayoutPerformanceTestPageTimeout = 30000; # each page, ms
|
||||
#$StartupPerformanceTestTimeout = 20; # seconds
|
||||
#$XULWindowOpenTestTimeout = 90; # seconds
|
||||
#$NeckoUnitTestTimeout = 30; # seconds
|
||||
$RenderPerformanceTestTimeout = 1800; # seconds
|
||||
|
||||
#$MozConfigFileName = 'mozconfig';
|
||||
|
||||
#$UseMozillaProfile = 1;
|
||||
#$MozProfileName = 'default';
|
||||
|
||||
#- Set these to what makes sense for your system
|
||||
$Make = 'make'; # Must be GNU make
|
||||
#$MakeOverrides = '';
|
||||
#$mail = '/bin/mail';
|
||||
#$CVS = 'cvs -q';
|
||||
#$CVSCO = 'checkout -P';
|
||||
|
||||
# win32 usually doesn't have /bin/mail
|
||||
$blat = '/d/mozilla-build/blat261/full/blat';
|
||||
#$use_blat = 1;
|
||||
|
||||
# Set moz_cvsroot to something like:
|
||||
# :pserver:$ENV{USER}%netscape.com\@cvs.mozilla.org:/cvsroot
|
||||
# :pserver:anonymous\@cvs-mirror.mozilla.org:/cvsroot
|
||||
#
|
||||
# Note that win32 may not need \@, depends on ' or ".
|
||||
# :pserver:$ENV{USER}%netscape.com@cvs.mozilla.org:/cvsroot
|
||||
|
||||
# CONFIG: $moz_cvsroot = '%mozillaCvsroot%';
|
||||
$moz_cvsroot = 'cltbld@cvs.mozilla.org:/cvsroot';
|
||||
|
||||
#- Set these proper values for your tinderbox server
|
||||
#$Tinderbox_server = 'tinderbox-daemon@tinderbox.mozilla.org';
|
||||
|
||||
# Allow for non-client builds, e.g. camino.
|
||||
#$moz_client_mk = 'client.mk';
|
||||
|
||||
#- Set if you want to build in a separate object tree
|
||||
$ObjDir = 'obj-fx-trunk';
|
||||
|
||||
# Extra build name, if needed.
|
||||
$BuildNameExtra = 'Release';
|
||||
|
||||
# User comment, eg. ip address for dhcp builds.
|
||||
# ex: $UserComment = "ip = 208.12.36.108";
|
||||
#$UserComment = 0;
|
||||
|
||||
#-
|
||||
#- The rest should not need to be changed
|
||||
#-
|
||||
|
||||
#- Minimum wait period from start of build to start of next build in minutes.
|
||||
#$BuildSleep = 10;
|
||||
|
||||
#- Until you get the script working. When it works,
|
||||
#- change to the tree you're actually building
|
||||
#$BuildTree = 'MozillaTest';
|
||||
# CONFIG: $BuildTree = '%buildTree%';
|
||||
$BuildTree = 'MozillaRelease';
|
||||
|
||||
#$BuildName = '';
|
||||
# CONFIG: $BuildTag = '%productTag%_RELEASE';
|
||||
$BuildTag = 'FIREFOX_3_0_19_RELEASE';
|
||||
#$BuildConfigDir = 'mozilla/config';
|
||||
#$Topsrcdir = 'mozilla';
|
||||
|
||||
$BinaryName = 'firefox.exe';
|
||||
|
||||
#
|
||||
# For embedding app, use:
|
||||
#$EmbedBinaryName = 'TestGtkEmbed';
|
||||
#$EmbedDistDir = 'dist/bin'
|
||||
|
||||
|
||||
#$ShellOverride = ''; # Only used if the default shell is too stupid
|
||||
#$ConfigureArgs = '';
|
||||
#$ConfigureEnvArgs = '';
|
||||
#$Compiler = 'gcc';
|
||||
#$NSPRArgs = '';
|
||||
#$ShellOverride = '';
|
||||
|
||||
$ProfiledBuild = 1;
|
||||
# Release build options
|
||||
$ReleaseBuild = 1;
|
||||
$shiptalkback = 0;
|
||||
$ReleaseToLatest = 0; # Push the release to latest-<milestone>?
|
||||
$ReleaseToDated = 1; # Push the release to YYYY-MM-DD-HH-<milestone>?
|
||||
$build_hour = "4";
|
||||
$package_creation_path = "/browser/installer";
|
||||
# needs setting for mac + talkback: $mac_bundle_path = "/browser/app";
|
||||
$ssh_version = "2";
|
||||
# CONFIG: $ssh_user = "%sshUser%";
|
||||
$ssh_user = "cltbld";
|
||||
# CONFIG: $ssh_server = "%sshServer%";
|
||||
$ssh_server = "stage-old.mozilla.org";
|
||||
$ftp_path = "/home/ftp/pub/firefox/nightly";
|
||||
$url_path = "http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly";
|
||||
$tbox_ftp_path = "/home/ftp/pub/firefox/tinderbox-builds";
|
||||
$tbox_url_path = "http://ftp.mozilla.org/pub/mozilla.org/firefox/tinderbox-builds";
|
||||
# CONFIG: $milestone = 'firefox%version%';
|
||||
$milestone = 'firefox3.0.19';
|
||||
$notify_list = 'build-announce@mozilla.org';
|
||||
$stub_installer = 0;
|
||||
$sea_installer = 1;
|
||||
$archive = 1;
|
||||
$push_raw_xpis = 0;
|
||||
$update_package = 1;
|
||||
$update_product = "Firefox";
|
||||
$update_version = "trunk";
|
||||
$update_platform = "WINNT_x86-msvc";
|
||||
$update_hash = "sha1";
|
||||
$update_filehost = "ftp.mozilla.org";
|
||||
$update_ver_file = 'browser/config/version.txt';
|
||||
$update_pushinfo = 0;
|
||||
$crashreporter_buildsymbols = 1;
|
||||
$crashreporter_pushsymbols = 1;
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_HOST'} = '%symbolServer%';
|
||||
$ENV{'SYMBOL_SERVER_HOST'} = 'dm-symbolpush01.mozilla.org';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_USER'} = '%symbolServerUser%';
|
||||
$ENV{'SYMBOL_SERVER_USER'} = 'ffxbld';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_PATH'} = '%symbolServerPath%';
|
||||
$ENV{'SYMBOL_SERVER_PATH'} = '/mnt/netapp/breakpad/symbols_ffx';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_SSH_KEY'} = '%symbolServerKey%';
|
||||
$ENV{'SYMBOL_SERVER_SSH_KEY'} = '/c/Documents and Settings/cltbld/.ssh/ffxbld_dsa';
|
||||
|
||||
# Reboot the OS at the end of build-and-test cycle. This is primarily
|
||||
# intended for Win9x, which can't last more than a few cycles before
|
||||
# locking up (and testing would be suspect even after a couple of cycles).
|
||||
# Right now, there is only code to force the reboot for Win9x, so even
|
||||
# setting this to 1, will not have an effect on other platforms. Setting
|
||||
# up win9x to automatically logon and begin running tinderbox is left
|
||||
# as an exercise to the reader.
|
||||
#$RebootSystem = 0;
|
||||
|
||||
# LogCompression specifies the type of compression used on the log file.
|
||||
# Valid options are 'gzip', and 'bzip2'. Please make sure the binaries
|
||||
# for 'gzip' or 'bzip2' are in the user's path before setting this
|
||||
# option.
|
||||
#$LogCompression = '';
|
||||
|
||||
# LogEncoding specifies the encoding format used for the logs. Valid
|
||||
# options are 'base64', and 'uuencode'. If $LogCompression is set above,
|
||||
# this needs to be set to 'base64' or 'uuencode' to ensure that the
|
||||
# binary data is transferred properly.
|
||||
#$LogEncoding = '';
|
||||
|
||||
# Prevent Extension Manager from spawning child processes during tests
|
||||
# - processes that tbox scripts cannot kill.
|
||||
#$ENV{NO_EM_RESTART} = '1';
|
||||
|
||||
# Do not build XForms
|
||||
$BuildXForms = 0;
|
||||
@@ -1 +0,0 @@
|
||||
Clobbering to force nightly due to nightly bustage from bug 428672.
|
||||
@@ -1,25 +0,0 @@
|
||||
#
|
||||
## hostname: tb-linux-tbox
|
||||
## uname: Linux tb-linux-tbox.build.mozilla.org 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 athlon i386 GNU/Linux
|
||||
#
|
||||
|
||||
# symbols for breakpad
|
||||
export CFLAGS="-gstabs+"
|
||||
export CXXFLAGS="-gstabs+"
|
||||
|
||||
mk_add_options MOZ_CO_PROJECT=mail
|
||||
mk_add_options MOZ_MAKE_FLAGS=-j1
|
||||
mk_add_options MOZ_CO_MODULE="mozilla/tools/update-packaging"
|
||||
|
||||
ac_add_options --enable-application=mail
|
||||
ac_add_options --enable-update-channel=beta
|
||||
ac_add_options --disable-debug
|
||||
ac_add_options --enable-update-packaging
|
||||
# Add explicit optimize flags in configure.in, not here - see bug 407794
|
||||
ac_add_options --enable-optimize
|
||||
ac_add_options --disable-tests
|
||||
ac_add_options --disable-shared
|
||||
ac_add_options --enable-static
|
||||
|
||||
CC=/tools/gcc-4.1.1/bin/gcc
|
||||
CXX=/tools/gcc-4.1.1/bin/g++
|
||||
@@ -1,225 +0,0 @@
|
||||
#
|
||||
## hostname: tb-linux-tbox
|
||||
## uname: Linux tbnewref-linux-tbox.build.mozilla.org 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 athlon i386 GNU/Linux
|
||||
#
|
||||
|
||||
#- tinder-config.pl - Tinderbox configuration file.
|
||||
#- Uncomment the variables you need to set.
|
||||
#- The default values are the same as the commented variables.
|
||||
|
||||
$ENV{CVS_RSH} = "ssh";
|
||||
$ENV{MOZ_CRASHREPORTER_NO_REPORT} = '1';
|
||||
|
||||
#- PLEASE FILL THIS IN WITH YOUR PROPER EMAIL ADDRESS
|
||||
#$BuildAdministrator = "$ENV{USER}\@$ENV{HOST}";
|
||||
#$BuildAdministrator = ($ENV{USER} || "cltbld") . "\@" . ($ENV{HOST} || "dhcp");
|
||||
|
||||
#- You'll need to change these to suit your machine's needs
|
||||
#$DisplayServer = ':0.0';
|
||||
|
||||
#- Default values of command-line opts
|
||||
#-
|
||||
$BuildDepend = 0; # Depend or Clobber
|
||||
#$BuildDebug = 0; # Debug or Opt (Darwin)
|
||||
#$ReportStatus = 1; # Send results to server, or not
|
||||
#$ReportFinalStatus = 1; # Finer control over $ReportStatus.
|
||||
$UseTimeStamp = 0; # Use the CVS 'pull-by-timestamp' option, or not
|
||||
#$BuildOnce = 0; # Build once, don't send results to server
|
||||
#$TestOnly = 0; # Only run tests, don't pull/build
|
||||
#$BuildEmbed = 0; # After building seamonkey, go build embed app.
|
||||
#$SkipMozilla = 0; # Use to debug post-mozilla.pl scripts.
|
||||
|
||||
# Tests
|
||||
$CleanProfile = 1;
|
||||
#$ResetHomeDirForTests = 1;
|
||||
$ProductName = "Thunderbird";
|
||||
#$VendorName = "";
|
||||
|
||||
$RunMozillaTests = 1; # Allow turning off of all tests if needed.
|
||||
#$RegxpcomTest = 1;
|
||||
#$AliveTest = 1;
|
||||
#$JavaTest = 0;
|
||||
#$ViewerTest = 0;
|
||||
#$BloatTest = 0; # warren memory bloat test
|
||||
#$BloatTest2 = 0; # dbaron memory bloat test, require tracemalloc
|
||||
#$DomToTextConversionTest = 0;
|
||||
#$XpcomGlueTest = 0;
|
||||
$CodesizeTest = 0; # Z, require mozilla/tools/codesighs
|
||||
#$EmbedCodesizeTest = 0; # mZ, require mozilla/tools/codesigns
|
||||
#$MailBloatTest = 0;
|
||||
#$EmbedTest = 0; # Assumes you wanted $BuildEmbed=1
|
||||
#$LayoutPerformanceTest = 0; # Tp
|
||||
#$QATest = 0;
|
||||
#$XULWindowOpenTest = 0; # Txul
|
||||
#$StartupPerformanceTest = 0; # Ts
|
||||
|
||||
$TestsPhoneHome = 0; # Should test report back to server?
|
||||
#$results_server = "axolotl.mozilla.org"; # was tegu
|
||||
#$pageload_server = "spider"; # localhost
|
||||
|
||||
#
|
||||
# Timeouts, values are in seconds.
|
||||
#
|
||||
#$CVSCheckoutTimeout = 3600;
|
||||
#$CreateProfileTimeout = 45;
|
||||
#$RegxpcomTestTimeout = 15;
|
||||
|
||||
#$AliveTestTimeout = 45;
|
||||
#$ViewerTestTimeout = 45;
|
||||
#$EmbedTestTimeout = 45;
|
||||
#$BloatTestTimeout = 120; # seconds
|
||||
#$MailBloatTestTimeout = 120; # seconds
|
||||
#$JavaTestTimeout = 45;
|
||||
#$DomTestTimeout = 45; # seconds
|
||||
#$XpcomGlueTestTimeout = 15;
|
||||
#$CodesizeTestTimeout = 900; # seconds
|
||||
#$CodesizeTestType = "auto"; # {"auto"|"base"}
|
||||
#$LayoutPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$QATestTimeout = 1200; # entire test, seconds
|
||||
#$LayoutPerformanceTestPageTimeout = 30000; # each page, ms
|
||||
#$StartupPerformanceTestTimeout = 60; # seconds
|
||||
#$XULWindowOpenTestTimeout = 150; # seconds
|
||||
|
||||
|
||||
#$MozConfigFileName = 'mozconfig';
|
||||
|
||||
#$UseMozillaProfile = 1;
|
||||
#$MozProfileName = 'default';
|
||||
|
||||
#- Set these to what makes sense for your system
|
||||
#$Make = 'gmake'; # Must be GNU make
|
||||
#$MakeOverrides = '';
|
||||
#$mail = '/bin/mail';
|
||||
#$CVS = 'cvs -q';
|
||||
#$CVSCO = 'checkout -P';
|
||||
|
||||
# win32 usually doesn't have /bin/mail
|
||||
#$blat = 'c:/nstools/bin/blat';
|
||||
#$use_blat = 0;
|
||||
|
||||
# Set moz_cvsroot to something like:
|
||||
# :pserver:$ENV{USER}%netscape.com\@cvs.mozilla.org:/cvsroot
|
||||
# :pserver:anonymous\@cvs-mirror.mozilla.org:/cvsroot
|
||||
#
|
||||
# Note that win32 may not need \@, depends on ' or ".
|
||||
# :pserver:$ENV{USER}%netscape.com@cvs.mozilla.org:/cvsroot
|
||||
|
||||
# CONFIG: $moz_cvsroot = '%mozillaCvsroot%';
|
||||
$moz_cvsroot = 'cltbld@cvs.mozilla.org:/cvsroot';
|
||||
|
||||
#- Set these proper values for your tinderbox server
|
||||
#$Tinderbox_server = 'tinderbox-daemon@tinderbox.mozilla.org';
|
||||
|
||||
# Allow for non-client builds, e.g. camino.
|
||||
#$moz_client_mk = 'client.mk';
|
||||
|
||||
#- Set if you want to build in a separate object tree
|
||||
$ObjDir = 'obj-tb-trunk';
|
||||
|
||||
# Extra build name, if needed.
|
||||
$BuildNameExtra = 'Release';
|
||||
|
||||
# User comment, eg. ip address for dhcp builds.
|
||||
# ex: $UserComment = "ip = 208.12.36.108";
|
||||
#$UserComment = 0;
|
||||
|
||||
#-
|
||||
#- The rest should not need to be changed
|
||||
#-
|
||||
|
||||
#- Minimum wait period from start of build to start of next build in minutes.
|
||||
#$BuildSleep = 10;
|
||||
|
||||
#- Until you get the script working. When it works,
|
||||
#- change to the tree you're actually building
|
||||
# CONFIG: $BuildTree = '%buildTree%';
|
||||
$BuildTree = 'MozillaRelease';
|
||||
|
||||
#$BuildName = '';
|
||||
# CONFIG: $BuildTag = '%productTag%_RELEASE';
|
||||
$BuildTag = 'THUNDERBIRD_3_0a2_RELEASE';
|
||||
#$BuildConfigDir = 'mozilla/config';
|
||||
#$Topsrcdir = 'mozilla';
|
||||
|
||||
$BinaryName = 'thunderbird-bin';
|
||||
|
||||
#
|
||||
# For embedding app, use:
|
||||
#$EmbedBinaryName = 'TestGtkEmbed';
|
||||
#$EmbedDistDir = 'dist/bin'
|
||||
|
||||
|
||||
#$ShellOverride = ''; # Only used if the default shell is too stupid
|
||||
#$ConfigureArgs = '';
|
||||
#$ConfigureEnvArgs = '';
|
||||
#$Compiler = 'gcc';
|
||||
#$NSPRArgs = '';
|
||||
#$ShellOverride = '';
|
||||
|
||||
# allow override of timezone value (for win32 POSIX::strftime)
|
||||
#$Timezone = '';
|
||||
|
||||
# Release build options
|
||||
$ReleaseBuild = 1;
|
||||
$ReleaseToLatest = 0; # Push the release to latest-<milestone>?
|
||||
$ReleaseToDated = 1; # Push the release to YYYY-MM-DD-HH-<milestone>?
|
||||
$shiptalkback = 0;
|
||||
$build_hour = "3";
|
||||
$package_creation_path = "/mail/installer";
|
||||
$ssh_version = "2";
|
||||
# CONFIG: $ssh_user = "%sshUser%";
|
||||
$ssh_user = "cltbld";
|
||||
# CONFIG: $ssh_server = "%sshServer%";
|
||||
$ssh_server = "stage-old.mozilla.org";
|
||||
#$ReleaseGroup = "thunderbird";
|
||||
$ftp_path = "/home/ftp/pub/thunderbird/nightly";
|
||||
$url_path = "http://ftp.mozilla.org/pub/mozilla.org/thunderbird/nightly";
|
||||
$tbox_ftp_path = "/home/ftp/pub/thunderbird/tinderbox-builds";
|
||||
$tbox_url_path = "http://ftp.mozilla.org/pub/mozilla.org/thunderbird/tinderbox-builds";
|
||||
# CONFIG: $milestone = 'thunderbird%version%';
|
||||
$milestone = 'thunderbird3.0a2';
|
||||
$notify_list = "build-announce\@mozilla.org";
|
||||
$stub_installer = 0;
|
||||
$sea_installer = 0;
|
||||
$archive = 1;
|
||||
$update_package = 1;
|
||||
$update_product = "Thunderbird";
|
||||
$update_version = "trunk";
|
||||
$update_platform = "Linux_x86-gcc3";
|
||||
$update_hash = "sha1";
|
||||
$update_filehost = "ftp.mozilla.org";
|
||||
$update_ver_file = "mail/config/version.txt";
|
||||
$update_pushinfo = 0;
|
||||
$crashreporter_buildsymbols = 1;
|
||||
$crashreporter_pushsymbols = 1;
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_HOST'} = '%symbolServer%';
|
||||
$ENV{'SYMBOL_SERVER_HOST'} = 'dm-symbolpush01.mozilla.org';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_USER'} = '%symbolServerUser%';
|
||||
$ENV{'SYMBOL_SERVER_USER'} = 'tbirdbld';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_PATH'} = '%symbolServerPath%';
|
||||
$ENV{'SYMBOL_SERVER_PATH'} = '/mnt/netapp/breakpad/symbols_tbrd';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_SSH_KEY'} = '%symbolServerKey%';
|
||||
$ENV{'SYMBOL_SERVER_SSH_KEY'} = '/home/cltbld/.ssh/tbirdbld_dsa';
|
||||
|
||||
# Reboot the OS at the end of build-and-test cycle. This is primarily
|
||||
# intended for Win9x, which can't last more than a few cycles before
|
||||
# locking up (and testing would be suspect even after a couple of cycles).
|
||||
# Right now, there is only code to force the reboot for Win9x, so even
|
||||
# setting this to 1, will not have an effect on other platforms. Setting
|
||||
# up win9x to automatically logon and begin running tinderbox is left
|
||||
# as an exercise to the reader.
|
||||
#$RebootSystem = 0;
|
||||
|
||||
# LogCompression specifies the type of compression used on the log file.
|
||||
# Valid options are 'gzip', and 'bzip2'. Please make sure the binaries
|
||||
# for 'gzip' or 'bzip2' are in the user's path before setting this
|
||||
# option.
|
||||
#$LogCompression = 'bzip2';
|
||||
|
||||
# LogEncoding specifies the encoding format used for the logs. Valid
|
||||
# options are 'base64', and 'uuencode'. If $LogCompression is set above,
|
||||
# this needs to be set to 'base64' or 'uuencode' to ensure that the
|
||||
# binary data is transferred properly.
|
||||
#$LogEncoding = 'base64';
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
Clobbering to force nightly due to nightly bustage from bug 428672.
|
||||
@@ -1,28 +0,0 @@
|
||||
#
|
||||
## hostname: bm-xserve07.build.mozilla.org
|
||||
## uname: Darwin bm-xserve07.build.mozilla.org 8.8.4 Darwin Kernel Version 8.8.4: Sun Oct 29 15:26:54 PST 2006; root:xnu-792.16.4.obj~1/RELEASE_I386 i386 i386
|
||||
#
|
||||
|
||||
# symbols for breakpad
|
||||
export CFLAGS="-g -gfull"
|
||||
export CXXFLAGS="-g -gfull"
|
||||
|
||||
. $topsrcdir/build/macosx/universal/mozconfig
|
||||
|
||||
# Make flags
|
||||
mk_add_options MOZ_CO_PROJECT=mail
|
||||
mk_add_options MOZ_MAKE_FLAGS="-j1"
|
||||
mk_add_options MOZ_CO_MODULE="mozilla/tools/update-packaging"
|
||||
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../build/universal
|
||||
|
||||
# Configure flags
|
||||
ac_add_options --enable-application=mail
|
||||
ac_add_options --enable-update-channel=beta
|
||||
# Add explicit optimize flags in configure.in, not here - see bug 407794
|
||||
ac_add_options --enable-optimize
|
||||
ac_add_options --disable-debug
|
||||
ac_add_options --disable-tests
|
||||
ac_add_options --enable-static
|
||||
ac_add_options --disable-shared
|
||||
|
||||
ac_add_options --enable-update-packaging
|
||||
@@ -1,262 +0,0 @@
|
||||
#
|
||||
## hostname: bm-xserve07.build.mozilla.org
|
||||
## uname: Darwin bm-xserve07.build.mozilla.org 8.8.4 Darwin Kernel Version 8.8.4: Sun Oct 29 15:26:54 PST 2006; root:xnu-792.16.4.obj~1/RELEASE_I386 i386 i386
|
||||
#
|
||||
|
||||
#- tinder-config.pl - Tinderbox configuration file.
|
||||
#- Uncomment the variables you need to set.
|
||||
#- The default values are the same as the commented variables.
|
||||
|
||||
# $ENV{NO_EM_RESTART} = "1";
|
||||
# $ENV{DYLD_NO_FIX_PREBINDING} = "1";
|
||||
# $ENV{LD_PREBIND_ALLOW_OVERLAP} = "1";
|
||||
$ENV{MOZ_CRASHREPORTER_NO_REPORT} = '1';
|
||||
|
||||
$MacUniversalBinary = 1;
|
||||
|
||||
# $ENV{MOZ_PACKAGE_MSI}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: 0
|
||||
# Values: 0 | 1
|
||||
# Purpose: Controls whether a MSI package is made.
|
||||
# Requires: Windows and a local MakeMSI installation.
|
||||
#$ENV{MOZ_PACKAGE_MSI} = 0;
|
||||
|
||||
# $ENV{MOZ_SYMBOLS_TRANSFER_TYPE}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: scp
|
||||
# Values: scp | rsync
|
||||
# Purpose: Use scp or rsync to transfer symbols to the Talkback server.
|
||||
# Requires: The selected type requires the command be available both locally
|
||||
# and on the Talkback server.
|
||||
#$ENV{MOZ_SYMBOLS_TRANSFER_TYPE} = "scp";
|
||||
|
||||
#- PLEASE FILL THIS IN WITH YOUR PROPER EMAIL ADDRESS
|
||||
$BuildAdministrator = 'build@mozilla.org';
|
||||
#$BuildAdministrator = "$ENV{USER}\@$ENV{HOST}";
|
||||
#$BuildAdministrator = ($ENV{USER} || "cltbld") . "\@" . ($ENV{HOST} || "dhcp");
|
||||
|
||||
#- You'll need to change these to suit your machine's needs
|
||||
#$DisplayServer = ':0.0';
|
||||
|
||||
#- Default values of command-line opts
|
||||
#-
|
||||
#$BuildDepend = 1; # Depend or Clobber
|
||||
#$BuildDebug = 0; # Debug or Opt (Darwin)
|
||||
#$ReportStatus = 1; # Send results to server, or not
|
||||
#$ReportFinalStatus = 1; # Finer control over $ReportStatus.
|
||||
$UseTimeStamp = 0; # Use the CVS 'pull-by-timestamp' option, or not
|
||||
#$BuildOnce = 0; # Build once, don't send results to server
|
||||
#$TestOnly = 0; # Only run tests, don't pull/build
|
||||
#$BuildEmbed = 0; # After building seamonkey, go build embed app.
|
||||
#$SkipMozilla = 0; # Use to debug post-mozilla.pl scripts.
|
||||
#$BuildLocales = 0; # Do l10n packaging?
|
||||
|
||||
# Tests
|
||||
$CleanProfile = 1;
|
||||
#$ResetHomeDirForTests = 1;
|
||||
$ProductName = "Thunderbird";
|
||||
#$VendorName = 'Mozilla';
|
||||
|
||||
$RunMozillaTests = 1; # Allow turning off of all tests if needed.
|
||||
$RegxpcomTest = 1;
|
||||
$AliveTest = 1;
|
||||
#$JavaTest = 0;
|
||||
#$ViewerTest = 0;
|
||||
#$BloatTest = 0; # warren memory bloat test
|
||||
#$BloatTest2 = 0; # dbaron memory bloat test, require tracemalloc
|
||||
#$DomToTextConversionTest = 0;
|
||||
#$XpcomGlueTest = 0;
|
||||
$CodesizeTest = 0; # Z, require mozilla/tools/codesighs
|
||||
$EmbedCodesizeTest = 0; # mZ, require mozilla/tools/codesigns
|
||||
#$MailBloatTest = 0;
|
||||
#$EmbedTest = 0; # Assumes you wanted $BuildEmbed=1
|
||||
#$LayoutPerformanceTest = 0; # Tp
|
||||
#$DHTMLPerformanceTest = 0; # Tdhtml
|
||||
#$QATest = 0;
|
||||
#$XULWindowOpenTest = 0; # Txul
|
||||
#$StartupPerformanceTest = 0; # Ts
|
||||
|
||||
$TestsPhoneHome = 0; # Should test report back to server?
|
||||
|
||||
# $results_server
|
||||
#----------------------------------------------------------------------------
|
||||
# Server on which test results will be accessible. This was originally tegu,
|
||||
# then became axolotl. Once we moved services from axolotl, it was time
|
||||
# to give this service its own hostname to make future transitions easier.
|
||||
# - cmp@mozilla.org
|
||||
#$results_server = "build-graphs.mozilla.org";
|
||||
|
||||
#$pageload_server = "spider"; # localhost
|
||||
|
||||
#
|
||||
# Timeouts, values are in seconds.
|
||||
#
|
||||
#$CVSCheckoutTimeout = 3600;
|
||||
#$CreateProfileTimeout = 45;
|
||||
#$RegxpcomTestTimeout = 120;
|
||||
|
||||
#$AliveTestTimeout = 45;
|
||||
#$ViewerTestTimeout = 45;
|
||||
#$EmbedTestTimeout = 45;
|
||||
#$BloatTestTimeout = 120; # seconds
|
||||
#$MailBloatTestTimeout = 120; # seconds
|
||||
#$JavaTestTimeout = 45;
|
||||
#$DomTestTimeout = 45; # seconds
|
||||
#$XpcomGlueTestTimeout = 15;
|
||||
#$CodesizeTestTimeout = 900; # seconds
|
||||
#$CodesizeTestType = "auto"; # {"auto"|"base"}
|
||||
#$LayoutPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$DHTMLPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$QATestTimeout = 1200; # entire test, seconds
|
||||
#$LayoutPerformanceTestPageTimeout = 30000; # each page, ms
|
||||
#$StartupPerformanceTestTimeout = 15; # seconds
|
||||
#$XULWindowOpenTestTimeout = 150; # seconds
|
||||
|
||||
|
||||
#$MozConfigFileName = 'mozconfig';
|
||||
|
||||
#$UseMozillaProfile = 1;
|
||||
#$MozProfileName = 'default';
|
||||
|
||||
#- Set these to what makes sense for your system
|
||||
#$Make = 'gmake'; # Must be GNU make
|
||||
#$MakeOverrides = '';
|
||||
#$mail = '/bin/mail';
|
||||
#$CVS = 'cvs -q';
|
||||
#$CVSCO = 'checkout -P';
|
||||
|
||||
# win32 usually doesn't have /bin/mail
|
||||
#$blat = 'c:/nstools/bin/blat';
|
||||
#$use_blat = 0;
|
||||
|
||||
# Set moz_cvsroot to something like:
|
||||
# :pserver:$ENV{USER}%netscape.com\@cvs.mozilla.org:/cvsroot
|
||||
# :pserver:anonymous\@cvs-mirror.mozilla.org:/cvsroot
|
||||
#
|
||||
# Note that win32 may not need \@, depends on ' or ".
|
||||
# :pserver:$ENV{USER}%netscape.com@cvs.mozilla.org:/cvsroot
|
||||
|
||||
#$moz_cvsroot = $ENV{CVSROOT};
|
||||
# CONFIG: $moz_cvsroot = '%mozillaCvsroot%';
|
||||
$moz_cvsroot = 'cltbld@cvs.mozilla.org:/cvsroot';
|
||||
|
||||
#- Set these proper values for your tinderbox server
|
||||
#$Tinderbox_server = 'tinderbox-daemon@tinderbox.mozilla.org';
|
||||
|
||||
# Allow for non-client builds, e.g. camino.
|
||||
#$moz_client_mk = 'client.mk';
|
||||
|
||||
#- Set if you want to build in a separate object tree
|
||||
$ObjDir = '../build/universal';
|
||||
|
||||
# Extra build name, if needed.
|
||||
$BuildNameExtra = 'Release';
|
||||
|
||||
# User comment, eg. ip address for dhcp builds.
|
||||
# ex: $UserComment = "ip = 208.12.36.108";
|
||||
#$UserComment = 0;
|
||||
|
||||
#-
|
||||
#- The rest should not need to be changed
|
||||
#-
|
||||
|
||||
#- Minimum wait period from start of build to start of next build in minutes.
|
||||
#$BuildSleep = 10;
|
||||
|
||||
#- Until you get the script working. When it works,
|
||||
#- change to the tree you're actually building
|
||||
#$BuildTree = 'MozillaTest';
|
||||
# CONFIG: $BuildTree = '%buildTree%';
|
||||
$BuildTree = 'MozillaRelease';
|
||||
|
||||
#$BuildName = '';
|
||||
# CONFIG: $BuildTag = '%productTag%_RELEASE';
|
||||
$BuildTag = 'THUNDERBIRD_3_0a2_RELEASE';
|
||||
#$BuildConfigDir = 'mozilla/config';
|
||||
#$Topsrcdir = 'mozilla';
|
||||
|
||||
$BinaryName = 'thunderbird-bin';
|
||||
|
||||
#
|
||||
# For embedding app, use:
|
||||
#$EmbedBinaryName = 'TestGtkEmbed';
|
||||
#$EmbedDistDir = 'dist/bin'
|
||||
|
||||
|
||||
#$ShellOverride = ''; # Only used if the default shell is too stupid
|
||||
#$ConfigureArgs = '';
|
||||
#$ConfigureEnvArgs = '';
|
||||
#$Compiler = 'gcc';
|
||||
#$NSPRArgs = '';
|
||||
#$ShellOverride = '';
|
||||
|
||||
# Release build options
|
||||
$ReleaseBuild = 1;
|
||||
$shiptalkback = 0;
|
||||
$ReleaseToLatest = 0; # Push the release to latest-<milestone>?
|
||||
$ReleaseToDated = 1; # Push the release to YYYY-MM-DD-HH-<milestone>?
|
||||
$build_hour = "3";
|
||||
$package_creation_path = "/mail/installer";
|
||||
# needs setting for mac + talkback: $mac_bundle_path = "/browser/app";
|
||||
$mac_bundle_path = "/mail/app";
|
||||
$ssh_version = "2";
|
||||
# CONFIG: $ssh_user = "%sshUser%";
|
||||
$ssh_user = "cltbld";
|
||||
# CONFIG: $ssh_server = "%sshServer%";
|
||||
$ssh_server = "stage-old.mozilla.org";
|
||||
#$ReleaseGroup = "thunderbird";
|
||||
$ftp_path = "/home/ftp/pub/thunderbird/nightly";
|
||||
$url_path = "http://ftp.mozilla.org/pub/mozilla.org/thunderbird/nightly";
|
||||
$tbox_ftp_path = "/home/ftp/pub/thunderbird/tinderbox-builds";
|
||||
$tbox_url_path = "http://ftp.mozilla.org/pub/mozilla.org/thunderbird/tinderbox-builds";
|
||||
# CONFIG: $milestone = 'thunderbird%version%';
|
||||
$milestone = 'thunderbird3.0a2';
|
||||
$notify_list = "build-announce\@mozilla.org";
|
||||
$stub_installer = 0;
|
||||
$sea_installer = 0;
|
||||
$archive = 1;
|
||||
$push_raw_xpis = 0;
|
||||
$update_package = 1;
|
||||
$update_product = "Thunderbird";
|
||||
$update_version = "trunk";
|
||||
$update_platform = "Darwin_Universal-gcc3";
|
||||
$update_hash = "sha1";
|
||||
$update_filehost = "ftp.mozilla.org";
|
||||
$update_ver_file = "mail/config/version.txt";
|
||||
$update_pushinfo = 0;
|
||||
$crashreporter_buildsymbols = 1;
|
||||
$crashreporter_pushsymbols = 1;
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_HOST'} = '%symbolServer%';
|
||||
$ENV{'SYMBOL_SERVER_HOST'} = 'dm-symbolpush01.mozilla.org';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_USER'} = '%symbolServerUser%';
|
||||
$ENV{'SYMBOL_SERVER_USER'} = 'tbirdbld';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_PATH'} = '%symbolServerPath%';
|
||||
$ENV{'SYMBOL_SERVER_PATH'} = '/mnt/netapp/breakpad/symbols_tbrd';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_SSH_KEY'} = '%symbolServerKey%';
|
||||
$ENV{'SYMBOL_SERVER_SSH_KEY'} = '/Users/cltbld/.ssh/tbirdbld_dsa';
|
||||
|
||||
# Reboot the OS at the end of build-and-test cycle. This is primarily
|
||||
# intended for Win9x, which can't last more than a few cycles before
|
||||
# locking up (and testing would be suspect even after a couple of cycles).
|
||||
# Right now, there is only code to force the reboot for Win9x, so even
|
||||
# setting this to 1, will not have an effect on other platforms. Setting
|
||||
# up win9x to automatically logon and begin running tinderbox is left
|
||||
# as an exercise to the reader.
|
||||
#$RebootSystem = 0;
|
||||
|
||||
# LogCompression specifies the type of compression used on the log file.
|
||||
# Valid options are 'gzip', and 'bzip2'. Please make sure the binaries
|
||||
# for 'gzip' or 'bzip2' are in the user's path before setting this
|
||||
# option.
|
||||
#$LogCompression = '';
|
||||
|
||||
# LogEncoding specifies the encoding format used for the logs. Valid
|
||||
# options are 'base64', and 'uuencode'. If $LogCompression is set above,
|
||||
# this needs to be set to 'base64' or 'uuencode' to ensure that the
|
||||
# binary data is transferred properly.
|
||||
#$LogEncoding = '';
|
||||
|
||||
# Prevent Extension Manager from spawning child processes during tests
|
||||
# - processes that tbox scripts cannot kill.
|
||||
#$ENV{NO_EM_RESTART} = '1';
|
||||
@@ -1 +0,0 @@
|
||||
Clobbering to force nightly due to nightly bustage from bug 428672.
|
||||
@@ -1,22 +0,0 @@
|
||||
#
|
||||
## hostname: tbnewref-win32-tbox
|
||||
## MINGW32_NT-5.2 TBNEWREF-WIN32- 1.0.11(0.46/3/2) 2007-01-12 12:05 i686 Msys
|
||||
#
|
||||
|
||||
mk_add_options MOZ_CO_PROJECT=mail
|
||||
mk_add_options MOZ_DEBUG_SYMBOLS=1
|
||||
mk_add_options MOZ_MAKE_FLAGS=-j1
|
||||
mk_add_options MOZ_CO_MODULE="mozilla/tools/update-packaging"
|
||||
|
||||
ac_add_options --enable-application=mail
|
||||
ac_add_options --enable-update-channel=beta
|
||||
ac_add_options --disable-debug
|
||||
# Add explicit optimize flags in configure.in, not here - see bug 407794
|
||||
ac_add_options --enable-optimize
|
||||
ac_add_options --disable-tests
|
||||
ac_add_options --disable-shared
|
||||
ac_add_options --enable-static
|
||||
ac_add_options --enable-update-packaging
|
||||
|
||||
export WIN32_REDIST_DIR="/d/msvs8/VC/redist/x86/Microsoft.VC80.CRT"
|
||||
|
||||
@@ -1,235 +0,0 @@
|
||||
#
|
||||
## hostname: tbnewref-win32-tbox
|
||||
## MINGW32_NT-5.2 TBNEWREF-WIN32- 1.0.11(0.46/3/2) 2007-01-12 12:05 i686 Msys
|
||||
#
|
||||
|
||||
#- tinder-config.pl - Tinderbox configuration file.
|
||||
#- Uncomment the variables you need to set.
|
||||
#- The default values are the same as the commented variables.
|
||||
|
||||
$ENV{CVSROOT}=":ext:tbirdbld\@cvs.mozilla.org:/cvsroot";
|
||||
$ENV{MOZ_INSTALLER_USE_7ZIP}="1";
|
||||
$ENV{MOZ_PACKAGE_MSI} = 0;
|
||||
$ENV{MOZ_CRASHREPORTER_NO_REPORT} = '1';
|
||||
# Both these two variables are for source server support
|
||||
$ENV{PDBSTR_PATH} = 'C:\\Program Files\\Debugging Tools for Windows\\sdk\\srcsrv\\pdbstr.exe';
|
||||
$ENV{SRCSRV_ROOT} = ':pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot';
|
||||
|
||||
#- PLEASE FILL THIS IN WITH YOUR PROPER EMAIL ADDRESS
|
||||
#$BuildAdministrator = "$ENV{USER}\@$ENV{HOST}";
|
||||
#$BuildAdministrator = ($ENV{USER} || "cltbld") . "\@" . ($ENV{HOST} || "dhcp");
|
||||
|
||||
#- You'll need to change these to suit your machine's needs
|
||||
#$DisplayServer = ':0.0';
|
||||
|
||||
#- Default values of command-line opts
|
||||
#-
|
||||
$BuildDepend = 0; # Depend or Clobber
|
||||
#$BuildDebug = 0; # Debug or Opt (Darwin)
|
||||
#$ReportStatus = 1; # Send results to server, or not
|
||||
#$ReportFinalStatus = 1; # Finer control over $ReportStatus.
|
||||
$UseTimeStamp = 0; # Use the CVS 'pull-by-timestamp' option, or not
|
||||
#$BuildOnce = 0; # Build once, don't send results to server
|
||||
#$TestOnly = 0; # Only run tests, don't pull/build
|
||||
#$BuildEmbed = 0; # After building seamonkey, go build embed app.
|
||||
#$SkipMozilla = 0; # Use to debug post-mozilla.pl scripts.
|
||||
#$BuildLocales = 0; # Do l10n packaging?
|
||||
|
||||
# Tests
|
||||
$CleanProfile = 1;
|
||||
#$ResetHomeDirForTests = 1;
|
||||
$ProductName = "Thunderbird";
|
||||
#$VendorName = '';
|
||||
|
||||
$RunMozillaTests = 1; # Allow turning off of all tests if needed.
|
||||
#$RegxpcomTest = 1;
|
||||
#$AliveTest = 1;
|
||||
#$JavaTest = 0;
|
||||
#$ViewerTest = 0;
|
||||
#$BloatTest = 0; # warren memory bloat test
|
||||
#$BloatTest2 = 0; # dbaron memory bloat test, require tracemalloc
|
||||
#$DomToTextConversionTest = 0;
|
||||
#$XpcomGlueTest = 0;
|
||||
#$CodesizeTest = 0; # Z, require mozilla/tools/codesighs
|
||||
#$EmbedCodesizeTest = 0; # mZ, require mozilla/tools/codesigns
|
||||
#$MailBloatTest = 0;
|
||||
#$EmbedTest = 0; # Assumes you wanted $BuildEmbed=1
|
||||
#$LayoutPerformanceTest = 0; # Tp
|
||||
#$DHTMLPerformanceTest = 0; # Tdhtml
|
||||
#$QATest = 0;
|
||||
#$XULWindowOpenTest = 0; # Txul
|
||||
#$StartupPerformanceTest = 0; # Ts
|
||||
|
||||
$TestsPhoneHome = 0; # Should test report back to server?
|
||||
#$results_server = "axolotl.mozilla.org"; # was tegu
|
||||
#$pageload_server = "spider"; # localhost
|
||||
|
||||
#
|
||||
# Timeouts, values are in seconds.
|
||||
#
|
||||
#$CVSCheckoutTimeout = 3600;
|
||||
#$CreateProfileTimeout = 45;
|
||||
#$RegxpcomTestTimeout = 120;
|
||||
|
||||
#$AliveTestTimeout = 45;
|
||||
#$ViewerTestTimeout = 45;
|
||||
#$EmbedTestTimeout = 45;
|
||||
#$BloatTestTimeout = 120; # seconds
|
||||
#$MailBloatTestTimeout = 120; # seconds
|
||||
#$JavaTestTimeout = 45;
|
||||
#$DomTestTimeout = 45; # seconds
|
||||
#$XpcomGlueTestTimeout = 15;
|
||||
#$CodesizeTestTimeout = 900; # seconds
|
||||
#$CodesizeTestType = "auto"; # {"auto"|"base"}
|
||||
#$LayoutPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$DHTMLPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$QATestTimeout = 1200; # entire test, seconds
|
||||
#$LayoutPerformanceTestPageTimeout = 30000; # each page, ms
|
||||
#$StartupPerformanceTestTimeout = 15; # seconds
|
||||
#$XULWindowOpenTestTimeout = 150; # seconds
|
||||
|
||||
|
||||
#$MozConfigFileName = 'mozconfig';
|
||||
|
||||
#$UseMozillaProfile = 1;
|
||||
#$MozProfileName = 'default';
|
||||
|
||||
#- Set these to what makes sense for your system
|
||||
$Make = 'make'; # Must be GNU make
|
||||
#$MakeOverrides = '';
|
||||
#$mail = '/bin/mail';
|
||||
#$CVS = 'cvs -q';
|
||||
#$CVSCO = 'checkout -P';
|
||||
|
||||
# win32 usually doesn't have /bin/mail
|
||||
$blat = '/d/mozilla-build/blat261/full/blat';
|
||||
$use_blat = 0;
|
||||
|
||||
# Set moz_cvsroot to something like:
|
||||
# :pserver:$ENV{USER}%netscape.com\@cvs.mozilla.org:/cvsroot
|
||||
# :pserver:anonymous\@cvs-mirror.mozilla.org:/cvsroot
|
||||
#
|
||||
# Note that win32 may not need \@, depends on ' or ".
|
||||
# :pserver:$ENV{USER}%netscape.com@cvs.mozilla.org:/cvsroot
|
||||
|
||||
# CONFIG: $moz_cvsroot = '%mozillaCvsroot%';
|
||||
$moz_cvsroot = 'cltbld@cvs.mozilla.org:/cvsroot';
|
||||
|
||||
#- Set these proper values for your tinderbox server
|
||||
#$Tinderbox_server = 'tinderbox-daemon@tinderbox.mozilla.org';
|
||||
|
||||
# Allow for non-client builds, e.g. camino.
|
||||
#$moz_client_mk = 'client.mk';
|
||||
|
||||
#- Set if you want to build in a separate object tree
|
||||
$ObjDir = 'obj-tb-trunk';
|
||||
|
||||
# Extra build name, if needed.
|
||||
$BuildNameExtra = 'Release';
|
||||
|
||||
# User comment, eg. ip address for dhcp builds.
|
||||
# ex: $UserComment = "ip = 208.12.36.108";
|
||||
#$UserComment = 0;
|
||||
|
||||
#-
|
||||
#- The rest should not need to be changed
|
||||
#-
|
||||
|
||||
#- Minimum wait period from start of build to start of next build in minutes.
|
||||
#$BuildSleep = 10;
|
||||
|
||||
#- Until you get the script working. When it works,
|
||||
#- change to the tree you're actually building
|
||||
# CONFIG: $BuildTree = '%buildTree%';
|
||||
$BuildTree = 'MozillaRelease';
|
||||
|
||||
#$BuildName = '';
|
||||
# CONFIG: $BuildTag = '%productTag%_RELEASE';
|
||||
$BuildTag = 'THUNDERBIRD_3_0a2_RELEASE';
|
||||
#$BuildConfigDir = 'mozilla/config';
|
||||
#$Topsrcdir = 'mozilla';
|
||||
|
||||
$BinaryName = 'thunderbird.exe';
|
||||
|
||||
#
|
||||
# For embedding app, use:
|
||||
#$EmbedBinaryName = 'TestGtkEmbed';
|
||||
#$EmbedDistDir = 'dist/bin'
|
||||
|
||||
|
||||
#$ShellOverride = ''; # Only used if the default shell is too stupid
|
||||
#$ConfigureArgs = '';
|
||||
#$ConfigureEnvArgs = '';
|
||||
#$Compiler = 'gcc';
|
||||
#$NSPRArgs = '';
|
||||
#$ShellOverride = '';
|
||||
|
||||
# Release build options
|
||||
$ReleaseBuild = 1;
|
||||
$shiptalkback = 0;
|
||||
$ReleaseToLatest = 0;
|
||||
$ReleaseToDated = 1;
|
||||
$build_hour = "3";
|
||||
$package_creation_path = "/mail/installer";
|
||||
# needs setting for mac + talkback: $mac_bundle_path = "/browser/app";
|
||||
$ssh_version = "2";
|
||||
# CONFIG: $ssh_user = "%sshUser%";
|
||||
$ssh_user = "cltbld";
|
||||
# CONFIG: $ssh_server = "%sshServer%";
|
||||
$ssh_server = "stage-old.mozilla.org";
|
||||
#$ReleaseGroup = "thunderbird";
|
||||
$ftp_path = "/home/ftp/pub/thunderbird/nightly";
|
||||
$url_path = "http://ftp.mozilla.org/pub/mozilla.org/thunderbird/nightly";
|
||||
$tbox_ftp_path = "/home/ftp/pub/thunderbird/tinderbox-builds";
|
||||
$tbox_url_path = "http://ftp.mozilla.org/pub/mozilla.org/thunderbird/tinderbox-builds";
|
||||
# CONFIG: $milestone = 'thunderbird%version%';
|
||||
$milestone = 'thunderbird3.0a2';
|
||||
$notify_list = "build-announce\@mozilla.org";
|
||||
$stub_installer = 0;
|
||||
$sea_installer = 1;
|
||||
$archive = 1;
|
||||
$push_raw_xpis = 1;
|
||||
|
||||
$update_package = 1;
|
||||
$update_product = "Thunderbird";
|
||||
$update_version = "trunk";
|
||||
$update_ver_file = "mail/config/version.txt";
|
||||
$update_platform = "WINNT_x86-msvc";
|
||||
$update_hash = "sha1";
|
||||
$update_filehost = "ftp.mozilla.org";
|
||||
$update_pushinfo = 0;
|
||||
$crashreporter_buildsymbols = 1;
|
||||
$crashreporter_pushsymbols = 1;
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_HOST'} = '%symbolServer%';
|
||||
$ENV{'SYMBOL_SERVER_HOST'} = 'dm-symbolpush01.mozilla.org';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_USER'} = '%symbolServerUser%';
|
||||
$ENV{'SYMBOL_SERVER_USER'} = 'tbirdbld';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_PATH'} = '%symbolServerPath%';
|
||||
$ENV{'SYMBOL_SERVER_PATH'} = '/mnt/netapp/breakpad/symbols_tbrd';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_SSH_KEY'} = '%symbolServerKey%';
|
||||
$ENV{'SYMBOL_SERVER_SSH_KEY'} = '/c/Documents and Settings/cltbld/.ssh/tbirdbld_dsa';
|
||||
|
||||
# Reboot the OS at the end of build-and-test cycle. This is primarily
|
||||
# intended for Win9x, which can't last more than a few cycles before
|
||||
# locking up (and testing would be suspect even after a couple of cycles).
|
||||
# Right now, there is only code to force the reboot for Win9x, so even
|
||||
# setting this to 1, will not have an effect on other platforms. Setting
|
||||
# up win9x to automatically logon and begin running tinderbox is left
|
||||
# as an exercise to the reader.
|
||||
#$RebootSystem = 0;
|
||||
|
||||
# LogCompression specifies the type of compression used on the log file.
|
||||
# Valid options are 'gzip', and 'bzip2'. Please make sure the binaries
|
||||
# for 'gzip' or 'bzip2' are in the user's path before setting this
|
||||
# option.
|
||||
#$LogCompression = '';
|
||||
|
||||
# LogEncoding specifies the encoding format used for the logs. Valid
|
||||
# options are 'base64', and 'uuencode'. If $LogCompression is set above,
|
||||
# this needs to be set to 'base64' or 'uuencode' to ensure that the
|
||||
# binary data is transferred properly.
|
||||
#$LogEncoding = '';
|
||||
|
||||
# Prevent Extension Manager from spawning child processes during tests
|
||||
# - processes that tbox scripts cannot kill.
|
||||
#$ENV{NO_EM_RESTART} = '1';
|
||||
@@ -1 +0,0 @@
|
||||
Clobbering to fix up checkout issues
|
||||
@@ -1,17 +0,0 @@
|
||||
#
|
||||
## hostname: xr-linux-tbox
|
||||
## uname: Linux xr-linux-tbox.build.mozilla.org 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 i686 i386 GNU/Linux
|
||||
#
|
||||
|
||||
export MOZILLA_OFFICIAL=1
|
||||
export JAVA_HOME=/tools/jdk
|
||||
mk_add_options MOZILLA_OFFICIAL=1
|
||||
|
||||
mk_add_options MOZ_CO_PROJECT=xulrunner
|
||||
mk_add_options MOZ_MAKE_FLAGS="-j3"
|
||||
|
||||
ac_add_options --enable-application=xulrunner
|
||||
ac_add_options --disable-tests
|
||||
|
||||
CC=/tools/gcc-4.1.1/bin/gcc
|
||||
CXX=/tools/gcc-4.1.1/bin/g++
|
||||
@@ -1,262 +0,0 @@
|
||||
#
|
||||
## hostname: xr-linux-tbox
|
||||
## uname: Linux xr-linux-tbox.build.mozilla.org 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 i686 i386 GNU/Linux
|
||||
#
|
||||
|
||||
#- tinder-config.pl - Tinderbox configuration file.
|
||||
#- Uncomment the variables you need to set.
|
||||
#- The default values are the same as the commented variables.
|
||||
|
||||
$ENV{MOZ_CRASHREPORTER_NO_REPORT} = '1';
|
||||
|
||||
# $ENV{MOZ_PACKAGE_MSI}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: 0
|
||||
# Values: 0 | 1
|
||||
# Purpose: Controls whether a MSI package is made.
|
||||
# Requires: Windows and a local MakeMSI installation.
|
||||
#$ENV{MOZ_PACKAGE_MSI} = 0;
|
||||
|
||||
# $ENV{MOZ_SYMBOLS_TRANSFER_TYPE}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: scp
|
||||
# Values: scp | rsync
|
||||
# Purpose: Use scp or rsync to transfer symbols to the Talkback server.
|
||||
# Requires: The selected type requires the command be available both locally
|
||||
# and on the Talkback server.
|
||||
#$ENV{MOZ_SYMBOLS_TRANSFER_TYPE} = "scp";
|
||||
|
||||
#- PLEASE FILL THIS IN WITH YOUR PROPER EMAIL ADDRESS
|
||||
#$BuildAdministrator = "$ENV{USER}\@$ENV{HOST}";
|
||||
#$BuildAdministrator = ($ENV{USER} || "cltbld") . "\@" . ($ENV{HOST} || "dhcp");
|
||||
$BuildAdministrator = "build\@mozilla.org";
|
||||
|
||||
#- You'll need to change these to suit your machine's needs
|
||||
#$DisplayServer = ':0.0';
|
||||
|
||||
#- Default values of command-line opts
|
||||
#-
|
||||
#$BuildDepend = 1; # Depend or Clobber
|
||||
#$BuildDebug = 0; # Debug or Opt (Darwin)
|
||||
#$ReportStatus = 1; # Send results to server, or not
|
||||
#$ReportFinalStatus = 1; # Finer control over $ReportStatus.
|
||||
$UseTimeStamp = 0; # Use the CVS 'pull-by-timestamp' option, or not
|
||||
#$BuildOnce = 0; # Build once, don't send results to server
|
||||
#$ConfigureOnly = 0; # Configure, but do not build.
|
||||
#$TestOnly = 0; # Only run tests, don't pull/build
|
||||
#$BuildEmbed = 0; # After building seamonkey, go build embed app.
|
||||
#$SkipMozilla = 0; # Use to debug post-mozilla.pl scripts.
|
||||
#$BuildLocales = 0; # Do l10n packaging?
|
||||
$BuildSDK = 1; # Build the SDK
|
||||
|
||||
# Only used when $BuildLocales = 1
|
||||
%WGetFiles = (); # Pull files from the web, URL => Location
|
||||
#$WGetTimeout = 360; # Wget timeout, in seconds
|
||||
#$BuildLocalesArgs = ""; # Extra attributes to add to the makefile command
|
||||
# which builds the "installers-<locale>" target.
|
||||
# Typically used to set ZIP_IN and WIN32_INSTALLER_IN
|
||||
|
||||
# Tests
|
||||
$CleanProfile = 1;
|
||||
#$ResetHomeDirForTests = 1;
|
||||
$ProductName = "XULRunner";
|
||||
$VendorName = 'Mozilla';
|
||||
|
||||
$RunMozillaTests = 0; # Allow turning off of all tests if needed.
|
||||
#$RegxpcomTest = 1;
|
||||
#$AliveTest = 1;
|
||||
#$JavaTest = 0;
|
||||
#$ViewerTest = 0;
|
||||
#$BloatTest = 0; # warren memory bloat test
|
||||
#$BloatTest2 = 0; # dbaron memory bloat test, require tracemalloc
|
||||
#$DomToTextConversionTest = 0;
|
||||
#$XpcomGlueTest = 0;
|
||||
#$CodesizeTest = 0; # Z, require mozilla/tools/codesighs
|
||||
#$EmbedCodesizeTest = 0; # mZ, require mozilla/tools/codesigns
|
||||
#$MailBloatTest = 0;
|
||||
#$EmbedTest = 0; # Assumes you wanted $BuildEmbed=1
|
||||
#$LayoutPerformanceTest = 0; # Tp
|
||||
#$DHTMLPerformanceTest = 0; # Tdhtml
|
||||
#$QATest = 0;
|
||||
#$XULWindowOpenTest = 0; # Txul
|
||||
#$StartupPerformanceTest = 0; # Ts
|
||||
#@CompareLocaleDirs = (); # Run compare-locales test on these directories
|
||||
# ("network","dom","toolkit","security/manager");
|
||||
#$CompareLocalesAviary = 0; # Should the compare-locales commands use the
|
||||
# aviary directory structure?
|
||||
|
||||
#$TestsPhoneHome = 0; # Should test report back to server?
|
||||
|
||||
# $results_server
|
||||
#----------------------------------------------------------------------------
|
||||
# Server on which test results will be accessible. This was originally tegu,
|
||||
# then became axolotl. Once we moved services from axolotl, it was time
|
||||
# to give this service its own hostname to make future transitions easier.
|
||||
# - cmp@mozilla.org
|
||||
#$results_server = "build-graphs.mozilla.org";
|
||||
|
||||
#$pageload_server = "spider"; # localhost
|
||||
|
||||
#
|
||||
# Timeouts, values are in seconds.
|
||||
#
|
||||
#$CVSCheckoutTimeout = 3600;
|
||||
#$CreateProfileTimeout = 45;
|
||||
#$RegxpcomTestTimeout = 120;
|
||||
|
||||
#$AliveTestTimeout = 45;
|
||||
#$ViewerTestTimeout = 45;
|
||||
#$EmbedTestTimeout = 45;
|
||||
#$BloatTestTimeout = 120; # seconds
|
||||
#$MailBloatTestTimeout = 120; # seconds
|
||||
#$JavaTestTimeout = 45;
|
||||
#$DomTestTimeout = 45; # seconds
|
||||
#$XpcomGlueTestTimeout = 15;
|
||||
#$CodesizeTestTimeout = 900; # seconds
|
||||
#$CodesizeTestType = "auto"; # {"auto"|"base"}
|
||||
#$LayoutPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$DHTMLPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$QATestTimeout = 1200; # entire test, seconds
|
||||
#$LayoutPerformanceTestPageTimeout = 30000; # each page, ms
|
||||
#$StartupPerformanceTestTimeout = 15; # seconds
|
||||
#$XULWindowOpenTestTimeout = 150; # seconds
|
||||
|
||||
|
||||
#$MozConfigFileName = 'mozconfig';
|
||||
|
||||
#$UseMozillaProfile = 1;
|
||||
#$MozProfileName = 'default';
|
||||
|
||||
#- Set these to what makes sense for your system
|
||||
#$Make = 'gmake'; # Must be GNU make
|
||||
#$MakeOverrides = '';
|
||||
#$mail = '/bin/mail';
|
||||
#$CVS = 'cvs -q';
|
||||
#$CVSCO = 'checkout -P';
|
||||
|
||||
# win32 usually doesn't have /bin/mail
|
||||
#$blat = 'c:/nstools/bin/blat';
|
||||
#$use_blat = 0;
|
||||
|
||||
# Set moz_cvsroot to something like:
|
||||
# :pserver:$ENV{USER}%netscape.com\@cvs.mozilla.org:/cvsroot
|
||||
# :pserver:anonymous\@cvs-mirror.mozilla.org:/cvsroot
|
||||
#
|
||||
# Note that win32 may not need \@, depends on ' or ".
|
||||
# :pserver:$ENV{USER}%netscape.com@cvs.mozilla.org:/cvsroot
|
||||
|
||||
#$moz_cvsroot = $ENV{CVSROOT};
|
||||
# CONFIG: $moz_cvsroot = '%mozillaCvsroot%';
|
||||
$moz_cvsroot = 'cltbld@cvs.mozilla.org:/cvsroot';
|
||||
|
||||
#- Set these proper values for your tinderbox server
|
||||
#$Tinderbox_server = 'tinderbox-daemon@tinderbox.mozilla.org';
|
||||
|
||||
# Allow for non-client builds, e.g. camino.
|
||||
#$moz_client_mk = 'client.mk';
|
||||
|
||||
#- Set if you want to build in a separate object tree
|
||||
$ObjDir = 'obj-xulrunner';
|
||||
|
||||
# Extra build name, if needed.
|
||||
$BuildNameExtra = 'Release';
|
||||
|
||||
# User comment, eg. ip address for dhcp builds.
|
||||
# ex: $UserComment = "ip = 208.12.36.108";
|
||||
#$UserComment = 0;
|
||||
|
||||
#-
|
||||
#- The rest should not need to be changed
|
||||
#-
|
||||
|
||||
#- Minimum wait period from start of build to start of next build in minutes.
|
||||
#$BuildSleep = 10;
|
||||
|
||||
#- Until you get the script working. When it works,
|
||||
#- change to the tree you're actually building
|
||||
# CONFIG: $BuildTree = '%buildTree%';
|
||||
$BuildTree = 'MozillaRelease';
|
||||
|
||||
#$BuildName = '';
|
||||
# CONFIG: $BuildTag = '%productTag%_RELEASE';
|
||||
$BuildTag = 'FIREFOX_3_0_17_RELEASE';
|
||||
#$BuildConfigDir = 'mozilla/config';
|
||||
#$Topsrcdir = 'mozilla';
|
||||
|
||||
$BinaryName = 'xulrunner-bin';
|
||||
|
||||
#
|
||||
# For embedding app, use:
|
||||
#$EmbedBinaryName = 'TestGtkEmbed';
|
||||
#$EmbedDistDir = 'dist/bin'
|
||||
|
||||
|
||||
#$ShellOverride = ''; # Only used if the default shell is too stupid
|
||||
#$ConfigureArgs = '';
|
||||
#$ConfigureEnvArgs = '';
|
||||
#$Compiler = 'gcc';
|
||||
#$NSPRArgs = '';
|
||||
#$ShellOverride = '';
|
||||
|
||||
# Release build options
|
||||
$ReleaseBuild = 1;
|
||||
#$LocaleProduct = "browser";
|
||||
$shiptalkback = 0;
|
||||
$ReleaseToLatest = 0; # Push the release to latest-<milestone>?
|
||||
$ReleaseToDated = 1; # Push the release to YYYY-MM-DD-HH-<milestone>?
|
||||
#$build_hour = "8";
|
||||
$package_creation_path = "/xulrunner/installer";
|
||||
# needs setting for mac + talkback: $mac_bundle_path = "/browser/app";
|
||||
$ssh_version = "2";
|
||||
# CONFIG: $ssh_user = "%sshUser%";
|
||||
$ssh_user = "cltbld";
|
||||
#$ssh_key = "$ENV{HOME}/.ssh/xrbld_dsa";
|
||||
# CONFIG: $ssh_server = "%sshServer%";
|
||||
$ssh_server = "stage-old.mozilla.org";
|
||||
$ReleaseGroup = "xulrunner";
|
||||
$ftp_path = "/home/ftp/pub/xulrunner/nightly";
|
||||
$url_path = "http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly";
|
||||
$tbox_ftp_path = "/home/ftp/pub/xulrunner/tinderbox-builds";
|
||||
$tbox_url_path = "http://ftp.mozilla.org/pub/mozilla.org/xulrunner/tinderbox-builds";
|
||||
# CONFIG: $milestone = "xulrunner%version%";
|
||||
$milestone = "xulrunner1.9.0.17";
|
||||
$notify_list = "build-announce\@mozilla.org";
|
||||
$stub_installer = 0;
|
||||
$sea_installer = 0;
|
||||
$archive = 1;
|
||||
$push_raw_xpis = 0;
|
||||
$crashreporter_buildsymbols = 0;
|
||||
$crashreporter_pushsymbols = 0;
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_HOST'} = '%symbolServer%';
|
||||
$ENV{'SYMBOL_SERVER_HOST'} = 'stage-old.mozilla.org';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_USER'} = '%symbolServerUser%';
|
||||
$ENV{'SYMBOL_SERVER_USER'} = 'xrbld';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_PATH'} = '%symbolServerPath%';
|
||||
$ENV{'SYMBOL_SERVER_PATH'} = '/mnt/netapp/breakpad/symbols_xr';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_SSH_KEY'} = '%symbolServerKey%';
|
||||
$ENV{'SYMBOL_SERVER_SSH_KEY'} = '/home/cltbld/.ssh/xrbld_dsa';
|
||||
|
||||
# Reboot the OS at the end of build-and-test cycle. This is primarily
|
||||
# intended for Win9x, which can't last more than a few cycles before
|
||||
# locking up (and testing would be suspect even after a couple of cycles).
|
||||
# Right now, there is only code to force the reboot for Win9x, so even
|
||||
# setting this to 1, will not have an effect on other platforms. Setting
|
||||
# up win9x to automatically logon and begin running tinderbox is left
|
||||
# as an exercise to the reader.
|
||||
#$RebootSystem = 0;
|
||||
|
||||
# LogCompression specifies the type of compression used on the log file.
|
||||
# Valid options are 'gzip', and 'bzip2'. Please make sure the binaries
|
||||
# for 'gzip' or 'bzip2' are in the user's path before setting this
|
||||
# option.
|
||||
#$LogCompression = '';
|
||||
|
||||
# LogEncoding specifies the encoding format used for the logs. Valid
|
||||
# options are 'base64', and 'uuencode'. If $LogCompression is set above,
|
||||
# this needs to be set to 'base64' or 'uuencode' to ensure that the
|
||||
# binary data is transferred properly.
|
||||
#$LogEncoding = '';
|
||||
|
||||
# Prevent Extension Manager from spawning child processes during tests
|
||||
# - processes that tbox scripts cannot kill.
|
||||
#$ENV{NO_EM_RESTART} = '1';
|
||||
@@ -1 +0,0 @@
|
||||
CLOBBERing to disable zipwriter from bug 379633
|
||||
@@ -1,20 +0,0 @@
|
||||
#
|
||||
## hostname: bm-xserve09.build.mozilla.org
|
||||
## uname: Darwin bm-xserve09.build.mozilla.org 8.8.4 Darwin Kernel Version 8.8.4: Sun Oct 29 15:26:54 PST 2006; root:xnu-792.16.4.obj~1/RELEASE_I386 i386 i386
|
||||
#
|
||||
|
||||
. $topsrcdir/build/macosx/universal/mozconfig
|
||||
|
||||
export MOZILLA_OFFICIAL=1
|
||||
export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home
|
||||
mk_add_options MOZILLA_OFFICIAL=1
|
||||
|
||||
mk_add_options MOZ_CO_PROJECT=xulrunner
|
||||
mk_add_options MOZ_MAKE_FLAGS="-j8"
|
||||
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../build/universal
|
||||
|
||||
ac_add_options --enable-application=xulrunner
|
||||
ac_add_options --disable-tests
|
||||
ac_add_options --enable-svg
|
||||
ac_add_options --enable-canvas
|
||||
ac_add_app_options ppc --enable-prebinding
|
||||
@@ -1,268 +0,0 @@
|
||||
#
|
||||
## hostname: bm-xserve09.build.mozilla.org
|
||||
## uname: Darwin bm-xserve09.build.mozilla.org 8.8.4 Darwin Kernel Version 8.8.4: Sun Oct 29 15:26:54 PST 2006; root:xnu-792.16.4.obj~1/RELEASE_I386 i386 i386
|
||||
#
|
||||
|
||||
#- tinder-config.pl - Tinderbox configuration file.
|
||||
#- Uncomment the variables you need to set.
|
||||
#- The default values are the same as the commented variables.
|
||||
|
||||
$MacUniversalBinary = 1;
|
||||
|
||||
$ENV{CHOWN_ROOT} = "/builds/tinderbox/bin/chown_root";
|
||||
$ENV{REVERT_ROOT} = "/builds/tinderbox/bin/revert_root";
|
||||
$ENV{CHOWN_REVERT} = $ENV{REVERT_ROOT};
|
||||
$ENV{MOZ_CRASHREPORTER_NO_REPORT} = '1';
|
||||
|
||||
# $ENV{MOZ_PACKAGE_MSI}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: 0
|
||||
# Values: 0 | 1
|
||||
# Purpose: Controls whether a MSI package is made.
|
||||
# Requires: Windows and a local MakeMSI installation.
|
||||
#$ENV{MOZ_PACKAGE_MSI} = 0;
|
||||
|
||||
# $ENV{MOZ_SYMBOLS_TRANSFER_TYPE}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: scp
|
||||
# Values: scp | rsync
|
||||
# Purpose: Use scp or rsync to transfer symbols to the Talkback server.
|
||||
# Requires: The selected type requires the command be available both locally
|
||||
# and on the Talkback server.
|
||||
#$ENV{MOZ_SYMBOLS_TRANSFER_TYPE} = "scp";
|
||||
|
||||
#- PLEASE FILL THIS IN WITH YOUR PROPER EMAIL ADDRESS
|
||||
#$BuildAdministrator = "$ENV{USER}\@$ENV{HOST}";
|
||||
#$BuildAdministrator = ($ENV{USER} || "cltbld") . "\@" . ($ENV{HOST} || "dhcp");
|
||||
$BuildAdministrator = "build\@mozilla.org";
|
||||
|
||||
#- You'll need to change these to suit your machine's needs
|
||||
#$DisplayServer = ':0.0';
|
||||
|
||||
#- Default values of command-line opts
|
||||
#-
|
||||
#$BuildDepend = 1; # Depend or Clobber
|
||||
#$BuildDebug = 0; # Debug or Opt (Darwin)
|
||||
#$ReportStatus = 1; # Send results to server, or not
|
||||
#$ReportFinalStatus = 1; # Finer control over $ReportStatus.
|
||||
$UseTimeStamp = 0; # Use the CVS 'pull-by-timestamp' option, or not
|
||||
#$BuildOnce = 0; # Build once, don't send results to server
|
||||
#$ConfigureOnly = 0; # Configure, but do not build.
|
||||
#$TestOnly = 0; # Only run tests, don't pull/build
|
||||
#$BuildEmbed = 0; # After building seamonkey, go build embed app.
|
||||
#$SkipMozilla = 0; # Use to debug post-mozilla.pl scripts.
|
||||
#$BuildLocales = 0; # Do l10n packaging?
|
||||
$BuildSDK = 1; # Build the SDK
|
||||
|
||||
# Only used when $BuildLocales = 1
|
||||
%WGetFiles = (); # Pull files from the web, URL => Location
|
||||
#$WGetTimeout = 360; # Wget timeout, in seconds
|
||||
#$BuildLocalesArgs = ""; # Extra attributes to add to the makefile command
|
||||
# which builds the "installers-<locale>" target.
|
||||
# Typically used to set ZIP_IN and WIN32_INSTALLER_IN
|
||||
|
||||
# Tests
|
||||
$CleanProfile = 1;
|
||||
#$ResetHomeDirForTests = 1;
|
||||
$ProductName = "XULRunner";
|
||||
$VendorName = 'Mozilla';
|
||||
|
||||
$RunMozillaTests = 0; # Allow turning off of all tests if needed.
|
||||
#$RegxpcomTest = 1;
|
||||
#$AliveTest = 1;
|
||||
#$JavaTest = 0;
|
||||
#$ViewerTest = 0;
|
||||
#$BloatTest = 0; # warren memory bloat test
|
||||
#$BloatTest2 = 0; # dbaron memory bloat test, require tracemalloc
|
||||
#$DomToTextConversionTest = 0;
|
||||
#$XpcomGlueTest = 0;
|
||||
#$CodesizeTest = 0; # Z, require mozilla/tools/codesighs
|
||||
#$EmbedCodesizeTest = 0; # mZ, require mozilla/tools/codesigns
|
||||
#$MailBloatTest = 0;
|
||||
#$EmbedTest = 0; # Assumes you wanted $BuildEmbed=1
|
||||
#$LayoutPerformanceTest = 0; # Tp
|
||||
#$DHTMLPerformanceTest = 0; # Tdhtml
|
||||
#$QATest = 0;
|
||||
#$XULWindowOpenTest = 0; # Txul
|
||||
#$StartupPerformanceTest = 0; # Ts
|
||||
#@CompareLocaleDirs = (); # Run compare-locales test on these directories
|
||||
# ("network","dom","toolkit","security/manager");
|
||||
#$CompareLocalesAviary = 0; # Should the compare-locales commands use the
|
||||
# aviary directory structure?
|
||||
|
||||
#$TestsPhoneHome = 0; # Should test report back to server?
|
||||
|
||||
# $results_server
|
||||
#----------------------------------------------------------------------------
|
||||
# Server on which test results will be accessible. This was originally tegu,
|
||||
# then became axolotl. Once we moved services from axolotl, it was time
|
||||
# to give this service its own hostname to make future transitions easier.
|
||||
# - cmp@mozilla.org
|
||||
#$results_server = "build-graphs.mozilla.org";
|
||||
|
||||
#$pageload_server = "spider"; # localhost
|
||||
|
||||
#
|
||||
# Timeouts, values are in seconds.
|
||||
#
|
||||
#$CVSCheckoutTimeout = 3600;
|
||||
#$CreateProfileTimeout = 45;
|
||||
#$RegxpcomTestTimeout = 120;
|
||||
|
||||
#$AliveTestTimeout = 45;
|
||||
#$ViewerTestTimeout = 45;
|
||||
#$EmbedTestTimeout = 45;
|
||||
#$BloatTestTimeout = 120; # seconds
|
||||
#$MailBloatTestTimeout = 120; # seconds
|
||||
#$JavaTestTimeout = 45;
|
||||
#$DomTestTimeout = 45; # seconds
|
||||
#$XpcomGlueTestTimeout = 15;
|
||||
#$CodesizeTestTimeout = 900; # seconds
|
||||
#$CodesizeTestType = "auto"; # {"auto"|"base"}
|
||||
#$LayoutPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$DHTMLPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$QATestTimeout = 1200; # entire test, seconds
|
||||
#$LayoutPerformanceTestPageTimeout = 30000; # each page, ms
|
||||
#$StartupPerformanceTestTimeout = 15; # seconds
|
||||
#$XULWindowOpenTestTimeout = 150; # seconds
|
||||
|
||||
|
||||
#$MozConfigFileName = 'mozconfig';
|
||||
|
||||
#$UseMozillaProfile = 1;
|
||||
#$MozProfileName = 'default';
|
||||
|
||||
#- Set these to what makes sense for your system
|
||||
#$Make = 'gmake'; # Must be GNU make
|
||||
#$MakeOverrides = '';
|
||||
#$mail = '/bin/mail';
|
||||
#$CVS = 'cvs -q';
|
||||
#$CVSCO = 'checkout -P';
|
||||
|
||||
# win32 usually doesn't have /bin/mail
|
||||
#$blat = 'c:/nstools/bin/blat';
|
||||
#$use_blat = 0;
|
||||
|
||||
# Set moz_cvsroot to something like:
|
||||
# :pserver:$ENV{USER}%netscape.com\@cvs.mozilla.org:/cvsroot
|
||||
# :pserver:anonymous\@cvs-mirror.mozilla.org:/cvsroot
|
||||
#
|
||||
# Note that win32 may not need \@, depends on ' or ".
|
||||
# :pserver:$ENV{USER}%netscape.com@cvs.mozilla.org:/cvsroot
|
||||
|
||||
# sharing bm-xserve09 with T'bird build, do all CVS pulls with that key
|
||||
# CONFIG: $moz_cvsroot = '%mozillaCvsroot%';
|
||||
$moz_cvsroot = 'cltbld@cvs.mozilla.org:/cvsroot';
|
||||
|
||||
#- Set these proper values for your tinderbox server
|
||||
#$Tinderbox_server = 'tinderbox-daemon@tinderbox.mozilla.org';
|
||||
|
||||
# Allow for non-client builds, e.g. camino.
|
||||
#$moz_client_mk = 'client.mk';
|
||||
|
||||
#- Set if you want to build in a separate object tree
|
||||
$ObjDir = '../build/universal';
|
||||
|
||||
# Extra build name, if needed.
|
||||
$BuildNameExtra = 'Release';
|
||||
|
||||
# User comment, eg. ip address for dhcp builds.
|
||||
# ex: $UserComment = "ip = 208.12.36.108";
|
||||
#$UserComment = 0;
|
||||
|
||||
#-
|
||||
#- The rest should not need to be changed
|
||||
#-
|
||||
|
||||
#- Minimum wait period from start of build to start of next build in minutes.
|
||||
#$BuildSleep = 10;
|
||||
|
||||
#- Until you get the script working. When it works,
|
||||
#- change to the tree you're actually building
|
||||
# CONFIG: $BuildTree = '%buildTree%';
|
||||
$BuildTree = 'MozillaRelease';
|
||||
|
||||
#$BuildName = '';
|
||||
# CONFIG: $BuildTag = '%productTag%_RELEASE';
|
||||
$BuildTag = 'FIREFOX_3_0_17_RELEASE';
|
||||
#$BuildConfigDir = 'mozilla/config';
|
||||
#$Topsrcdir = 'mozilla';
|
||||
|
||||
$BinaryName = 'xulrunner-bin';
|
||||
|
||||
#
|
||||
# For embedding app, use:
|
||||
#$EmbedBinaryName = 'TestGtkEmbed';
|
||||
#$EmbedDistDir = 'dist/bin'
|
||||
|
||||
|
||||
#$ShellOverride = ''; # Only used if the default shell is too stupid
|
||||
#$ConfigureArgs = '';
|
||||
#$ConfigureEnvArgs = '';
|
||||
#$Compiler = 'gcc';
|
||||
#$NSPRArgs = '';
|
||||
#$ShellOverride = '';
|
||||
|
||||
# Release build options
|
||||
$ReleaseBuild = 1;
|
||||
#$LocaleProduct = "browser";
|
||||
$shiptalkback = 0;
|
||||
$ReleaseToLatest = 0; # Push the release to latest-<milestone>?
|
||||
$ReleaseToDated = 1; # Push the release to YYYY-MM-DD-HH-<milestone>?
|
||||
#$build_hour = "8";
|
||||
$package_creation_path = "/xulrunner/installer";
|
||||
# needs setting for mac + talkback: $mac_bundle_path = "/browser/app";
|
||||
$mac_bundle_path = "/browser/app";
|
||||
$ssh_version = "2";
|
||||
# CONFIG: $ssh_user = "%sshUser%";
|
||||
$ssh_user = "cltbld";
|
||||
#$ssh_key = "$ENV{HOME}/.ssh/xrbld_dsa";
|
||||
# CONFIG: $ssh_server = "%sshServer%";
|
||||
$ssh_server = "stage-old.mozilla.org";
|
||||
$ReleaseGroup = "xulrunner";
|
||||
$ftp_path = "/home/ftp/pub/xulrunner/nightly";
|
||||
$url_path = "http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly";
|
||||
$tbox_ftp_path = "/home/ftp/pub/xulrunner/tinderbox-builds";
|
||||
$tbox_url_path = "http://ftp.mozilla.org/pub/mozilla.org/xulrunner/tinderbox-builds";
|
||||
# CONFIG: $milestone = 'xulrunner%version%';
|
||||
$milestone = 'xulrunner1.9.0.17';
|
||||
$notify_list = "build-announce\@mozilla.org";
|
||||
$stub_installer = 0;
|
||||
$sea_installer = 0;
|
||||
$archive = 1;
|
||||
$push_raw_xpis = 0;
|
||||
$crashreporter_buildsymbols = 0;
|
||||
$crashreporter_pushsymbols = 0;
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_HOST'} = '%symbolServer%';
|
||||
$ENV{'SYMBOL_SERVER_HOST'} = 'stage-old.mozilla.org';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_USER'} = '%symbolServerUser%';
|
||||
$ENV{'SYMBOL_SERVER_USER'} = 'xrbld';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_PATH'} = '%symbolServerPath%';
|
||||
$ENV{'SYMBOL_SERVER_PATH'} = '/mnt/netapp/breakpad/symbols_xr';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_SSH_KEY'} = '%symbolServerKey%';
|
||||
$ENV{'SYMBOL_SERVER_SSH_KEY'} = '/Users/cltbld/.ssh/xrbld_dsa';
|
||||
|
||||
# Reboot the OS at the end of build-and-test cycle. This is primarily
|
||||
# intended for Win9x, which can't last more than a few cycles before
|
||||
# locking up (and testing would be suspect even after a couple of cycles).
|
||||
# Right now, there is only code to force the reboot for Win9x, so even
|
||||
# setting this to 1, will not have an effect on other platforms. Setting
|
||||
# up win9x to automatically logon and begin running tinderbox is left
|
||||
# as an exercise to the reader.
|
||||
#$RebootSystem = 0;
|
||||
|
||||
# LogCompression specifies the type of compression used on the log file.
|
||||
# Valid options are 'gzip', and 'bzip2'. Please make sure the binaries
|
||||
# for 'gzip' or 'bzip2' are in the user's path before setting this
|
||||
# option.
|
||||
#$LogCompression = '';
|
||||
|
||||
# LogEncoding specifies the encoding format used for the logs. Valid
|
||||
# options are 'base64', and 'uuencode'. If $LogCompression is set above,
|
||||
# this needs to be set to 'base64' or 'uuencode' to ensure that the
|
||||
# binary data is transferred properly.
|
||||
#$LogEncoding = '';
|
||||
|
||||
# Prevent Extension Manager from spawning child processes during tests
|
||||
# - processes that tbox scripts cannot kill.
|
||||
#$ENV{NO_EM_RESTART} = '1';
|
||||
@@ -1 +0,0 @@
|
||||
Preemptive clobber for /README.txt merge conflict.
|
||||
@@ -1,18 +0,0 @@
|
||||
#
|
||||
# hostname: fxexp-win32-tbox
|
||||
# uname: CYGWIN_NT-5.2 fxexp-win32-tbox 1.5.19(0.150/4/2) 2006-01-20 13:28 i686 Cygwin
|
||||
#
|
||||
|
||||
export MOZILLA_OFFICIAL
|
||||
export JAVA_HOME=/d/jdk1.5.0_10
|
||||
|
||||
mk_add_options MOZILLA_OFFICIAL=1
|
||||
mk_add_options MOZ_CO_PROJECT=xulrunner
|
||||
mk_add_options MOZ_MAKE_FLAGS="-j2"
|
||||
|
||||
ac_add_options --enable-application=xulrunner
|
||||
ac_add_options --enable-jemalloc
|
||||
ac_add_options --disable-tests
|
||||
ac_add_options --enable-svg
|
||||
ac_add_options --enable-canvas
|
||||
ac_add_options --disable-installer
|
||||
@@ -1,255 +0,0 @@
|
||||
#
|
||||
# hostname: fxexp-win32-tbox
|
||||
# uname: CYGWIN_NT-5.2 fxexp-win32-tbox 1.5.19(0.150/4/2) 2006-01-20 13:28 i686 Cygwin
|
||||
#
|
||||
|
||||
#- tinder-config.pl - Tinderbox configuration file.
|
||||
#- Uncomment the variables you need to set.
|
||||
#- The default values are the same as the commented variables.
|
||||
|
||||
$ENV{NO_EM_RESTART} = "1";
|
||||
$ENV{MOZ_INSTALLER_USE_7ZIP} = "1";
|
||||
$ENV{CVS_RSH} = "ssh";
|
||||
$ENV{MOZ_CRASHREPORTER_NO_REPORT} = '1';
|
||||
# Both these two variables are for source server support
|
||||
$ENV{PDBSTR_PATH} = 'C:\\Program Files\\Debugging Tools for Windows\\sdk\\srcsrv\\pdbstr.exe';
|
||||
$ENV{SRCSRV_ROOT} = ':pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot';
|
||||
|
||||
# $ENV{MOZ_PACKAGE_MSI}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: 0
|
||||
# Values: 0 | 1
|
||||
# Purpose: Controls whether a MSI package is made.
|
||||
# Requires: Windows and a local MakeMSI installation.
|
||||
#$ENV{MOZ_PACKAGE_MSI} = 0;
|
||||
|
||||
# $ENV{MOZ_SYMBOLS_TRANSFER_TYPE}
|
||||
#-----------------------------------------------------------------------------
|
||||
# Default: scp
|
||||
# Values: scp | rsync
|
||||
# Purpose: Use scp or rsync to transfer symbols to the Talkback server.
|
||||
# Requires: The selected type requires the command be available both locally
|
||||
# and on the Talkback server.
|
||||
#$ENV{MOZ_SYMBOLS_TRANSFER_TYPE} = "scp";
|
||||
|
||||
#- PLEASE FILL THIS IN WITH YOUR PROPER EMAIL ADDRESS
|
||||
#$BuildAdministrator = "$ENV{USER}\@$ENV{HOST}";
|
||||
#$BuildAdministrator = ($ENV{USER} || "cltbld") . "\@" . ($ENV{HOST} || "dhcp");
|
||||
$BuildAdministrator = 'build@mozilla.org';
|
||||
|
||||
#- You'll need to change these to suit your machine's needs
|
||||
#$DisplayServer = ':0.0';
|
||||
|
||||
#- Default values of command-line opts
|
||||
#-
|
||||
#$BuildDepend = 1; # Depend or Clobber
|
||||
#$BuildDebug = 0; # Debug or Opt (Darwin)
|
||||
#$ReportStatus = 1; # Send results to server, or not
|
||||
#$ReportFinalStatus = 1; # Finer control over $ReportStatus.
|
||||
$UseTimeStamp = 0; # Use the CVS 'pull-by-timestamp' option, or not
|
||||
#$BuildOnce = 0; # Build once, don't send results to server
|
||||
#$TestOnly = 0; # Only run tests, don't pull/build
|
||||
#$BuildEmbed = 0; # After building seamonkey, go build embed app.
|
||||
#$SkipMozilla = 0; # Use to debug post-mozilla.pl scripts.
|
||||
#$BuildLocales = 0; # Do l10n packaging?
|
||||
$BuildSDK = 1; # Build the SDK
|
||||
|
||||
# Tests
|
||||
#$CleanProfile = 0;
|
||||
#$ResetHomeDirForTests = 1;
|
||||
$ProductName = "XULRunner";
|
||||
$VendorName = 'Mozilla';
|
||||
|
||||
$RunMozillaTests = 0; # Allow turning off of all tests if needed.
|
||||
#$RegxpcomTest = 1;
|
||||
#$AliveTest = 1;
|
||||
#$JavaTest = 0;
|
||||
#$ViewerTest = 0;
|
||||
#$BloatTest = 0; # warren memory bloat test
|
||||
#$BloatTest2 = 0; # dbaron memory bloat test, require tracemalloc
|
||||
#$DomToTextConversionTest = 0;
|
||||
#$XpcomGlueTest = 0;
|
||||
#$CodesizeTest = 0; # Z, require mozilla/tools/codesighs
|
||||
#$EmbedCodesizeTest = 0; # mZ, require mozilla/tools/codesigns
|
||||
#$MailBloatTest = 0;
|
||||
#$EmbedTest = 0; # Assumes you wanted $BuildEmbed=1
|
||||
#$LayoutPerformanceTest = 0; # Tp
|
||||
#$DHTMLPerformanceTest = 0; # Tdhtml
|
||||
#$QATest = 0;
|
||||
#$XULWindowOpenTest = 0; # Txul
|
||||
#$StartupPerformanceTest = 0; # Ts
|
||||
|
||||
#$TestsPhoneHome = 0; # Should test report back to server?
|
||||
|
||||
# $results_server
|
||||
#----------------------------------------------------------------------------
|
||||
# Server on which test results will be accessible. This was originally tegu,
|
||||
# then became axolotl. Once we moved services from axolotl, it was time
|
||||
# to give this service its own hostname to make future transitions easier.
|
||||
# - cmp@mozilla.org
|
||||
#$results_server = "build-graphs.mozilla.org";
|
||||
|
||||
#$pageload_server = "spider"; # localhost
|
||||
|
||||
#
|
||||
# Timeouts, values are in seconds.
|
||||
#
|
||||
#$CVSCheckoutTimeout = 3600;
|
||||
#$CreateProfileTimeout = 45;
|
||||
#$RegxpcomTestTimeout = 120;
|
||||
|
||||
#$AliveTestTimeout = 45;
|
||||
#$ViewerTestTimeout = 45;
|
||||
#$EmbedTestTimeout = 45;
|
||||
#$BloatTestTimeout = 120; # seconds
|
||||
#$MailBloatTestTimeout = 120; # seconds
|
||||
#$JavaTestTimeout = 45;
|
||||
#$DomTestTimeout = 45; # seconds
|
||||
#$XpcomGlueTestTimeout = 15;
|
||||
#$CodesizeTestTimeout = 900; # seconds
|
||||
#$CodesizeTestType = "auto"; # {"auto"|"base"}
|
||||
#$LayoutPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$DHTMLPerformanceTestTimeout = 1200; # entire test, seconds
|
||||
#$QATestTimeout = 1200; # entire test, seconds
|
||||
#$LayoutPerformanceTestPageTimeout = 30000; # each page, ms
|
||||
#$StartupPerformanceTestTimeout = 15; # seconds
|
||||
#$XULWindowOpenTestTimeout = 150; # seconds
|
||||
|
||||
|
||||
#$MozConfigFileName = 'mozconfig';
|
||||
|
||||
#$UseMozillaProfile = 1;
|
||||
#$MozProfileName = 'default';
|
||||
|
||||
#- Set these to what makes sense for your system
|
||||
$Make = 'make'; # Must be GNU make
|
||||
#$MakeOverrides = '';
|
||||
#$mail = '/bin/mail';
|
||||
#$CVS = 'cvs -q';
|
||||
#$CVSCO = 'checkout -P';
|
||||
|
||||
# win32 usually doesn't have /bin/mail
|
||||
$blat = '/d/mozilla-build/blat261/full/blat';
|
||||
$use_blat = 1;
|
||||
|
||||
# Set moz_cvsroot to something like:
|
||||
# :pserver:$ENV{USER}%netscape.com\@cvs.mozilla.org:/cvsroot
|
||||
# :pserver:anonymous\@cvs-mirror.mozilla.org:/cvsroot
|
||||
#
|
||||
# Note that win32 may not need \@, depends on ' or ".
|
||||
# :pserver:$ENV{USER}%netscape.com@cvs.mozilla.org:/cvsroot
|
||||
|
||||
#$moz_cvsroot = $ENV{CVSROOT};
|
||||
# CONFIG: $moz_cvsroot = '%mozillaCvsroot%';
|
||||
$moz_cvsroot = 'cltbld@cvs.mozilla.org:/cvsroot';
|
||||
|
||||
#- Set these proper values for your tinderbox server
|
||||
#$Tinderbox_server = 'tinderbox-daemon@tinderbox.mozilla.org';
|
||||
|
||||
# Allow for non-client builds, e.g. camino.
|
||||
#$moz_client_mk = 'client.mk';
|
||||
|
||||
#- Set if you want to build in a separate object tree
|
||||
$ObjDir = 'obj-xulrunner';
|
||||
|
||||
# Extra build name, if needed.
|
||||
$BuildNameExtra = 'Release';
|
||||
|
||||
# User comment, eg. ip address for dhcp builds.
|
||||
# ex: $UserComment = "ip = 208.12.36.108";
|
||||
#$UserComment = 0;
|
||||
|
||||
#-
|
||||
#- The rest should not need to be changed
|
||||
#-
|
||||
|
||||
#- Minimum wait period from start of build to start of next build in minutes.
|
||||
#$BuildSleep = 10;
|
||||
|
||||
#- Until you get the script working. When it works,
|
||||
#- change to the tree you're actually building
|
||||
# CONFIG: $BuildTree = '%buildTree%';
|
||||
$BuildTree = 'MozillaRelease';
|
||||
|
||||
#$BuildName = '';
|
||||
# CONFIG: $BuildTag = '%productTag%_RELEASE';
|
||||
$BuildTag = 'FIREFOX_3_0_17_RELEASE';
|
||||
#$BuildConfigDir = 'mozilla/config';
|
||||
#$Topsrcdir = 'mozilla';
|
||||
|
||||
$BinaryName = 'xulrunner.exe';
|
||||
|
||||
#
|
||||
# For embedding app, use:
|
||||
#$EmbedBinaryName = 'TestGtkEmbed';
|
||||
#$EmbedDistDir = 'dist/bin'
|
||||
|
||||
|
||||
#$ShellOverride = ''; # Only used if the default shell is too stupid
|
||||
#$ConfigureArgs = '';
|
||||
#$ConfigureEnvArgs = '';
|
||||
#$Compiler = 'gcc';
|
||||
#$NSPRArgs = '';
|
||||
#$ShellOverride = '';
|
||||
|
||||
# Release build options
|
||||
$ReleaseBuild = 1;
|
||||
$shiptalkback = 0;
|
||||
$ReleaseToLatest = 0; # Push the release to latest-<milestone>?
|
||||
$ReleaseToDated = 1; # Push the release to YYYY-MM-DD-HH-<milestone>?
|
||||
#$build_hour = "8";
|
||||
$package_creation_path = "/xulrunner/installer";
|
||||
# needs setting for mac + talkback: $mac_bundle_path = "/browser/app";
|
||||
$ssh_version = "2";
|
||||
# CONFIG: $ssh_user = "%sshUser%";
|
||||
$ssh_user = "cltbld";
|
||||
#$ssh_key = "'$ENV{HOME}/.ssh/xrbld_dsa'";
|
||||
# CONFIG: $ssh_server = "%sshServer%";
|
||||
$ssh_server = "stage-old.mozilla.org";
|
||||
$ReleaseGroup = "xulrunner";
|
||||
$ftp_path = "/home/ftp/pub/xulrunner/nightly";
|
||||
$url_path = "http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly";
|
||||
$tbox_ftp_path = "/home/ftp/pub/xulrunner/tinderbox-builds";
|
||||
$tbox_url_path = "http://ftp.mozilla.org/pub/mozilla.org/xulrunner/tinderbox-builds";
|
||||
# CONFIG: $milestone = 'xulrunner%version%';
|
||||
$milestone = 'xulrunner1.9.0.17';
|
||||
$notify_list = 'build-announce@mozilla.org';
|
||||
$stub_installer = 0;
|
||||
$sea_installer = 0;
|
||||
$archive = 1;
|
||||
$push_raw_xpis = 0;
|
||||
$crashreporter_buildsymbols = 1;
|
||||
$crashreporter_pushsymbols = 1;
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_HOST'} = '%symbolServer%';
|
||||
$ENV{'SYMBOL_SERVER_HOST'} = 'stage-old.mozilla.org';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_USER'} = '%symbolServerUser%';
|
||||
$ENV{'SYMBOL_SERVER_USER'} = 'xrbld';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_PATH'} = '%symbolServerPath%';
|
||||
$ENV{'SYMBOL_SERVER_PATH'} = '/mnt/netapp/breakpad/symbols_xr';
|
||||
# CONFIG: $ENV{'SYMBOL_SERVER_SSH_KEY'} = '%symbolServerKey%';
|
||||
$ENV{'SYMBOL_SERVER_SSH_KEY'} = '/c/Documents and Settings/cltbld/.ssh/xrbld_dsa';
|
||||
|
||||
# Reboot the OS at the end of build-and-test cycle. This is primarily
|
||||
# intended for Win9x, which can't last more than a few cycles before
|
||||
# locking up (and testing would be suspect even after a couple of cycles).
|
||||
# Right now, there is only code to force the reboot for Win9x, so even
|
||||
# setting this to 1, will not have an effect on other platforms. Setting
|
||||
# up win9x to automatically logon and begin running tinderbox is left
|
||||
# as an exercise to the reader.
|
||||
#$RebootSystem = 0;
|
||||
|
||||
# LogCompression specifies the type of compression used on the log file.
|
||||
# Valid options are 'gzip', and 'bzip2'. Please make sure the binaries
|
||||
# for 'gzip' or 'bzip2' are in the user's path before setting this
|
||||
# option.
|
||||
#$LogCompression = '';
|
||||
|
||||
# LogEncoding specifies the encoding format used for the logs. Valid
|
||||
# options are 'base64', and 'uuencode'. If $LogCompression is set above,
|
||||
# this needs to be set to 'base64' or 'uuencode' to ensure that the
|
||||
# binary data is transferred properly.
|
||||
#$LogEncoding = '';
|
||||
|
||||
# Prevent Extension Manager from spawning child processes during tests
|
||||
# - processes that tbox scripts cannot kill.
|
||||
#$ENV{NO_EM_RESTART} = '1';
|
||||
3
mozilla/webtools/litmus/.htaccess
Normal file
@@ -0,0 +1,3 @@
|
||||
<FilesMatch ^(.*localconfig.*)$>
|
||||
deny from all
|
||||
</FilesMatch>
|
||||
44
mozilla/webtools/litmus/INSTALL
Executable file
@@ -0,0 +1,44 @@
|
||||
===Litmus Installation Instructions===
|
||||
|
||||
First of all, let me convince you that you in fact probbaly do not want
|
||||
to install Litmus. Litmus is not 1.0 software. Litmus is not even 0.5
|
||||
software. In fact, Litmus doesn't really do any of the things you would
|
||||
expect it to do yet.
|
||||
|
||||
In summary, if you're not looking to install Litmus because you are or
|
||||
want to be a Litmus developer, you'd best turn around and go back from
|
||||
whence you came.
|
||||
|
||||
If at any point you find that you don't understand these installation
|
||||
instructions, it's a good sign you want to turn back as well.
|
||||
|
||||
Required Perl Modules:
|
||||
Class::DBI
|
||||
Class::DBI::mysql
|
||||
Template
|
||||
Time::Piece
|
||||
Time::Piece::mysql
|
||||
Time::Seconds
|
||||
Date::Manip
|
||||
HTML::StripScripts
|
||||
HTML::StripScripts::Parser
|
||||
Text::Markdown
|
||||
XML::XPath
|
||||
|
||||
Once you've got everything installed, run: mysql < createdb.sql to
|
||||
create the Litmus database.
|
||||
|
||||
Then edit Litmus/Config.pm to give it the information it needs to
|
||||
connect to the database.
|
||||
|
||||
Run ./populatedb.pl to create products, testgroups, subgroups, etc...
|
||||
There is no UI at present for doing this.
|
||||
|
||||
Edit the newly created 'localconfig' file and provide your database
|
||||
configuration.
|
||||
|
||||
Then just pop the whole thing into a directory where your web server can
|
||||
get at it. Have fun!
|
||||
|
||||
Note: After upgrading Litmus, it's a good idea to run populatedb.pl
|
||||
again to pick up any schema changes that may have occured.
|
||||
109
mozilla/webtools/litmus/Litmus.pm
Executable file
@@ -0,0 +1,109 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
# Max Kanat-Alexander <mkanat@bugzilla.org>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
# Global object store and function library for Litmus
|
||||
|
||||
package Litmus;
|
||||
|
||||
use strict;
|
||||
|
||||
use Litmus::Template;
|
||||
use Litmus::Config;
|
||||
use Litmus::Error;
|
||||
use Litmus::Auth;
|
||||
use Litmus::CGI;
|
||||
|
||||
our $_request_cache = {};
|
||||
|
||||
# each cgi _MUST_ call Litmus->init() prior to doing anything else.
|
||||
# init() ensures that the installation has not been disabled, deals with pending
|
||||
# login requests, and other essential tasks.
|
||||
sub init() {
|
||||
if ($Litmus::Config::disabled) {
|
||||
my $c = new CGI();
|
||||
print $c->header();
|
||||
print "Litmus has been shutdown by the administrator. Please try again later.";
|
||||
exit;
|
||||
}
|
||||
# check for pending logins:
|
||||
my $c = cgi();
|
||||
if ($c->param("login_type")) {
|
||||
Litmus::Auth::processLoginForm();
|
||||
}
|
||||
}
|
||||
|
||||
# Global Template object
|
||||
sub template() {
|
||||
my $class = shift;
|
||||
request_cache()->{template} ||= Litmus::Template->create();
|
||||
return request_cache()->{template};
|
||||
}
|
||||
|
||||
# Global CGI object
|
||||
sub cgi() {
|
||||
my $class = shift;
|
||||
request_cache()->{cgi} ||= new Litmus::CGI();
|
||||
return request_cache()->{cgi};
|
||||
}
|
||||
|
||||
sub getCurrentUser {
|
||||
return Litmus::Auth::getCurrentUser();
|
||||
}
|
||||
|
||||
# cache of global variables for a single request only
|
||||
# use me like: Litmus->request_cache->{'var'} = 'foo';
|
||||
# entries here are guarenteed to get flushed when the request ends,
|
||||
# even when running under mod_perl
|
||||
# from Bugzilla.pm:
|
||||
sub request_cache {
|
||||
if ($ENV{MOD_PERL}) {
|
||||
my $request = Apache->request();
|
||||
my $cache = $request->pnotes();
|
||||
# Sometimes mod_perl doesn't properly call DESTROY on all
|
||||
# the objects in pnotes(), so we register a cleanup handler
|
||||
# to make sure that this happens.
|
||||
if (!$cache->{cleanup_registered}) {
|
||||
$request->push_handlers(PerlCleanupHandler => sub {
|
||||
my $r = shift;
|
||||
foreach my $key (keys %{$r->pnotes}) {
|
||||
delete $r->pnotes->{$key};
|
||||
}
|
||||
});
|
||||
$cache->{cleanup_registered} = 1;
|
||||
}
|
||||
return $cache;
|
||||
}
|
||||
return $_request_cache;
|
||||
}
|
||||
|
||||
1;
|
||||
555
mozilla/webtools/litmus/Litmus/Auth.pm
Executable file
@@ -0,0 +1,555 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::Auth;
|
||||
|
||||
use strict;
|
||||
|
||||
# IMPORTANT!
|
||||
## You _must_ call Litmus::Auth methods before sending a Content-type
|
||||
## header so that any required cookies can be sent.
|
||||
|
||||
require Exporter;
|
||||
use Litmus::Error;
|
||||
use Time::Piece;
|
||||
use Time::Seconds;
|
||||
use Litmus::DB::User;
|
||||
|
||||
use CGI;
|
||||
|
||||
our @ISA = qw(Exporter);
|
||||
our @EXPORT = qw();
|
||||
|
||||
my $logincookiename = $Litmus::Config::user_cookiename;
|
||||
my $cookie_expire_days = 7;
|
||||
|
||||
# Given a username and password, validate the login. Returns the
|
||||
# Litmus::DB::User object associated with the username if the login
|
||||
# is sucuessful. Returns false otherwise.
|
||||
sub validate_login($$) {
|
||||
my $username = shift;
|
||||
my $password = shift;
|
||||
|
||||
return 0 if (!$username or $username eq '' or
|
||||
!$password or $password eq '');
|
||||
|
||||
my ($userobj) = Litmus::DB::User->search(email => $username);
|
||||
|
||||
if (!$userobj) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!$userobj->enabled() || $userobj->enabled() == 0) {
|
||||
die "Account ".$userobj->username()." has been disabled by the administrator";
|
||||
}
|
||||
|
||||
# for security reasons, we use the real (correct) crypt'd passwd
|
||||
# as the salt:
|
||||
my $realPasswordCrypted = $userobj->getRealPasswd();
|
||||
return 0 if (!$realPasswordCrypted or $realPasswordCrypted eq '');
|
||||
my $enteredPasswordCrypted = crypt($password, $realPasswordCrypted);
|
||||
if ($enteredPasswordCrypted eq $realPasswordCrypted) {
|
||||
return $userobj;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
# Used by a CGI when a login is required to proceed beyond a certain point.
|
||||
# requireLogin() will return a Litmus::User object to indicate that the user
|
||||
# is logged in, or it will redirect to a login page to allow the login to be
|
||||
# completed. Once the login is complete, the user will be redirected back to
|
||||
# $return_to and any parameters in the current CGI.pm object will be passed
|
||||
# to the new script.
|
||||
#
|
||||
sub requireLogin {
|
||||
my $return_to = shift;
|
||||
my $admin_login_required = shift;
|
||||
my $cgi = Litmus->cgi();
|
||||
|
||||
# see if we are already logged in:
|
||||
my $user = getCurrentUser();
|
||||
return $user if $user; # well, that was easy...
|
||||
|
||||
my $vars = {
|
||||
title => "Login",
|
||||
return_to => $return_to,
|
||||
adminrequired => $admin_login_required,
|
||||
params => $cgi,
|
||||
};
|
||||
|
||||
print $cgi->header();
|
||||
Litmus->template()->process("auth/login.html.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
# Used by a CGI in much the same way as requireLogin() when the user must
|
||||
# be an admin to proceed.
|
||||
sub requireAdmin {
|
||||
my $return_to = shift;
|
||||
my $cgi = Litmus->cgi();
|
||||
|
||||
my $user = requireLogin($return_to, 1);
|
||||
if (!$user || !$user->is_admin()) {
|
||||
print $cgi->header();
|
||||
basicError("You must be a Litmus administrator to perform this function.");
|
||||
}
|
||||
return $user;
|
||||
}
|
||||
|
||||
# Returns the current Litmus::DB::Session object corresponding to the current
|
||||
# logged-in user, or 0 if no valid session exists
|
||||
sub getCurrentSession() {
|
||||
my $c = Litmus->cgi();
|
||||
|
||||
# we're actually processing the login form right now, so the cookie hasn't
|
||||
# been sent yet...
|
||||
if (Litmus->request_cache->{'curSession'}) {
|
||||
return Litmus->request_cache->{'curSession'};
|
||||
}
|
||||
|
||||
my $sessionCookie = $c->cookie($logincookiename);
|
||||
if (! $sessionCookie) {
|
||||
return 0
|
||||
}
|
||||
|
||||
my @sessions = Litmus::DB::Session->search(sessioncookie => $sessionCookie);
|
||||
my $session = $sessions[0];
|
||||
if (! $session) { return 0 }
|
||||
|
||||
# see if it's still valid and that the user hasn't been disabled
|
||||
if (! $session->isValid()) { return 0 }
|
||||
|
||||
return $session;
|
||||
}
|
||||
|
||||
# Returns the Litmus::User object corresponding to the current logged-in
|
||||
# user, or 0 if no valid login cookie exists
|
||||
sub getCurrentUser() {
|
||||
my $session = getCurrentSession();
|
||||
|
||||
if ($session) {
|
||||
return $session->user_id();
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# ONLY NON-PUBLIC API BEYOND THIS POINT
|
||||
#
|
||||
|
||||
# Processes data from a login form (auth/login.html.tmpl) using data
|
||||
# from the current Litmus::CGI object in use. When complete, returns the
|
||||
# flow of control to the script the user wanted to reach before the login,
|
||||
# setting a login cookie for the user.
|
||||
sub processLoginForm {
|
||||
my $c = Litmus->cgi();
|
||||
|
||||
my $type = $c->param("login_type");
|
||||
|
||||
if ($c->param("accountCreated") &&
|
||||
$c->param("accountCreated") eq "true") {
|
||||
# make sure they really are logged in and didn't just set
|
||||
# the accountCreated flag:
|
||||
requireLogin("index.cgi");
|
||||
return; # we're done here
|
||||
}
|
||||
|
||||
if ($type eq "litmus") {
|
||||
my $username = $c->param("email");
|
||||
my $password = $c->param("password");
|
||||
|
||||
my $user = validate_login($username, $password);
|
||||
|
||||
if (!$user) {
|
||||
loginError($c, "Username/Password incorrect. Please try again.");
|
||||
}
|
||||
|
||||
my $session = makeSession($user);
|
||||
$c->storeCookie(makeCookie($session));
|
||||
|
||||
} elsif ($type eq "newaccount") {
|
||||
my $email = $c->param("email");
|
||||
my $name = $c->param("realname");
|
||||
my $password = $c->param("password");
|
||||
my $nickname = $c->param("irc_nickname");
|
||||
|
||||
# some basic form-field validation:
|
||||
my $emailregexp = q:^[\\w\\.\\+\\-=]+@[\\w\\.\\-]+\\.[\\w\\-]+$:;
|
||||
if (! $email || ! $email =~ /$emailregexp/) {
|
||||
loginError($c, "You must enter a valid email address");
|
||||
}
|
||||
if (! $password eq $c->param("password_confirm")) {
|
||||
loginError($c, "Passwords do not match. Please try again.");
|
||||
}
|
||||
|
||||
my @users = Litmus::DB::User->search(email => $email);
|
||||
if ($users[0]) {
|
||||
loginError($c, "User ".$users[0]->email() ." already exists.");
|
||||
}
|
||||
if ($nickname and $nickname ne '') {
|
||||
@users = Litmus::DB::User->search(irc_nickname => $nickname);
|
||||
if ($users[0]) {
|
||||
loginError($c, "An account with that IRC nickname already exists.");
|
||||
}
|
||||
} else {
|
||||
$nickname = undef;
|
||||
}
|
||||
|
||||
my $userobj =
|
||||
Litmus::DB::User->create({email => $email,
|
||||
password => bz_crypt($password),
|
||||
bugzilla_uid => 0,
|
||||
realname => $name,
|
||||
enabled => 1,
|
||||
is_admin => 0,
|
||||
irc_nickname => $nickname
|
||||
});
|
||||
|
||||
my $session = makeSession($userobj);
|
||||
$c->storeCookie(makeCookie($session));
|
||||
|
||||
my $vars = {
|
||||
title => "Account Created",
|
||||
email => $email,
|
||||
realname => $name,
|
||||
return_to => $c->param("login_loc"),
|
||||
params => $c
|
||||
};
|
||||
|
||||
print $c->header();
|
||||
Litmus->template()->process("auth/accountcreated.html.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
|
||||
exit;
|
||||
|
||||
} elsif ($type eq "bugzilla") {
|
||||
my $username = $c->param("username");
|
||||
my $password = $c->param("password");
|
||||
|
||||
|
||||
} elsif ($type eq "convert") {
|
||||
# convert an old-school Litmus account (pre authentication system)
|
||||
# to a new one with a password:
|
||||
my $username = $c->param("email");
|
||||
|
||||
my @userobjs = Litmus::DB::User->search(email => $username);
|
||||
my $userobj = $userobjs[0];
|
||||
if (! $userobj || $userobj->email() ne $username) {
|
||||
loginError($c, "User $username does not exist.");
|
||||
}
|
||||
|
||||
if ($userobj->password() ne "") {
|
||||
# already a new-style account
|
||||
loginError($c, "User $username has already been updated.");
|
||||
}
|
||||
|
||||
# display a "convert login" form to get the rest of the information
|
||||
print $c->header();
|
||||
my $return_to = $c->param("login_loc") || "";
|
||||
unsetFields();
|
||||
my $vars = {
|
||||
title => "Update Login",
|
||||
email => $username,
|
||||
return_to => $return_to,
|
||||
params => $c,
|
||||
};
|
||||
|
||||
Litmus->template()->process("auth/convertaccount.html.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
exit;
|
||||
} elsif ($type eq "reallyconvert") {
|
||||
my $username = $c->param("email");
|
||||
my $realname = $c->param("realname");
|
||||
my $password = $c->param("password");
|
||||
my $password_confirm = $c->param("password_confirm");
|
||||
my $nickname = $c->param("irc_nickname");
|
||||
|
||||
if (! $password eq $password_confirm) {
|
||||
loginError($c, "Passwords do not match. Please try again.");
|
||||
}
|
||||
|
||||
my @userobjs = Litmus::DB::User->search(email => $username);
|
||||
my $userobj = $userobjs[0];
|
||||
|
||||
# just to be safe:
|
||||
if (! $userobj || $userobj->email() ne $username) {
|
||||
loginError($c, "User $username does not exist.");
|
||||
}
|
||||
|
||||
if ($userobj->password() ne "" && ($userobj->bugzilla_uid() == 0 ||
|
||||
!$userobj->bugzilla_uid())) {
|
||||
# already a new-style account
|
||||
loginError($c, "User $username has already been updated.");
|
||||
}
|
||||
my ($nickname_exists) =
|
||||
Litmus::DB::User->search(irc_nickname => $nickname);
|
||||
if ($nickname_exists) {
|
||||
loginError($c,
|
||||
"An account with that IRC nickname already exists.",
|
||||
"auth/convertaccount.html.tmpl",
|
||||
"Update Login");
|
||||
}
|
||||
|
||||
# do the upgrade:
|
||||
$userobj->password(bz_crypt($password));
|
||||
$userobj->bugzilla_uid("0");
|
||||
$userobj->realname($realname);
|
||||
$userobj->enabled(1);
|
||||
# $userobj->is_admin(0);
|
||||
$userobj->irc_nickname($nickname);
|
||||
$userobj->update();
|
||||
|
||||
my $session = makeSession($userobj);
|
||||
$c->storeCookie(makeCookie($session));
|
||||
|
||||
my $vars = {
|
||||
title => "Account Created",
|
||||
email => $username,
|
||||
realname => $realname,
|
||||
return_to => $c->param("login_loc"),
|
||||
params => $c
|
||||
};
|
||||
|
||||
print $c->header();
|
||||
Litmus->template()->process("auth/accountcreated.html.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
|
||||
exit;
|
||||
|
||||
} else {
|
||||
internalError("Unknown login scheme attempted");
|
||||
}
|
||||
}
|
||||
|
||||
sub changePassword {
|
||||
my $userobj = shift;
|
||||
my $password = shift;
|
||||
$userobj->password(bz_crypt($password));
|
||||
$userobj->update();
|
||||
|
||||
my @sessions = $userobj->sessions();
|
||||
foreach my $session (@sessions) {
|
||||
$session->makeExpire();
|
||||
}
|
||||
}
|
||||
|
||||
# Given a userobj, process the login and return a session object
|
||||
sub makeSession {
|
||||
my $userobj = shift;
|
||||
my $c = Litmus->cgi();
|
||||
|
||||
my $expires = localtime() + ONE_DAY * $cookie_expire_days;
|
||||
|
||||
my $sessioncookie = randomToken(64);
|
||||
|
||||
my $session = Litmus::DB::Session->create({
|
||||
user_id => $userobj,
|
||||
sessioncookie => $sessioncookie,
|
||||
expires => $expires});
|
||||
|
||||
Litmus->request_cache->{'curSession'} = $session;
|
||||
return $session;
|
||||
}
|
||||
|
||||
# Given a session, create a login cookie to go with it
|
||||
sub makeCookie {
|
||||
my $session = shift;
|
||||
|
||||
my $cookie = Litmus->cgi()->cookie(
|
||||
-name => $logincookiename,
|
||||
-value => $session->sessioncookie(),
|
||||
-domain => $main::ENV{"HTTP_HOST"},
|
||||
-expires => $session->expires(),
|
||||
);
|
||||
return $cookie;
|
||||
}
|
||||
|
||||
sub loginError {
|
||||
my $c = shift;
|
||||
my $message = shift;
|
||||
my $template = shift;
|
||||
my $title = shift;
|
||||
|
||||
if (!$template) {
|
||||
$template = "auth/login.html.tmpl";
|
||||
}
|
||||
if (!$title) {
|
||||
$title = "Login";
|
||||
}
|
||||
|
||||
print $c->header();
|
||||
|
||||
my $return_to = $c->param("login_loc") || "";
|
||||
my $email = $c->param("email") || "";
|
||||
|
||||
unsetFields();
|
||||
|
||||
my $vars = {
|
||||
title => $title,
|
||||
return_to => $return_to,
|
||||
email => $email,
|
||||
params => $c,
|
||||
onload => "toggleMessage('failure','$message')",
|
||||
};
|
||||
|
||||
Litmus->template()->process($template, $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
|
||||
exit;
|
||||
}
|
||||
|
||||
sub unsetFields() {
|
||||
my $c = Litmus->cgi();
|
||||
|
||||
# We need to unset some params in $c since otherwise we end up with
|
||||
# a hidden form field set for "email" and friends and madness results:
|
||||
$c->param('email', '');
|
||||
$c->param('username', '');
|
||||
$c->param('login_type', '');
|
||||
$c->param('login_loc', '');
|
||||
$c->param('realname', '');
|
||||
$c->param('password', '');
|
||||
$c->param('password_confirm', '');
|
||||
|
||||
}
|
||||
|
||||
# Like crypt(), but with a random salt. Thanks to Bugzilla for this.
|
||||
sub bz_crypt {
|
||||
my ($password) = @_;
|
||||
|
||||
# The list of characters that can appear in a salt. Salts and hashes
|
||||
# are both encoded as a sequence of characters from a set containing
|
||||
# 64 characters, each one of which represents 6 bits of the salt/hash.
|
||||
# The encoding is similar to BASE64, the difference being that the
|
||||
# BASE64 plus sign (+) is replaced with a forward slash (/).
|
||||
my @saltchars = (0..9, 'A'..'Z', 'a'..'z', '.', '/');
|
||||
|
||||
# Generate the salt. We use an 8 character (48 bit) salt for maximum
|
||||
# security on systems whose crypt uses MD5. Systems with older
|
||||
# versions of crypt will just use the first two characters of the salt.
|
||||
my $salt = '';
|
||||
for ( my $i=0 ; $i < 8 ; ++$i ) {
|
||||
$salt .= $saltchars[rand(64)];
|
||||
}
|
||||
|
||||
# Crypt the password.
|
||||
my $cryptedpassword = crypt($password, $salt);
|
||||
|
||||
# Return the crypted password.
|
||||
return $cryptedpassword;
|
||||
}
|
||||
|
||||
sub randomToken {
|
||||
my $size = shift || 10; # default to 10 chars if nothing specified
|
||||
return join("", map{ ('0'..'9','a'..'z','A'..'Z')[rand 62] } (1..$size));
|
||||
}
|
||||
|
||||
# Deprecated:
|
||||
# DO NOT USE
|
||||
sub setCookie {
|
||||
my $user = shift;
|
||||
my $expires = shift;
|
||||
|
||||
my $user_id = 0;
|
||||
if ($user) {
|
||||
$user_id = $user->user_id();
|
||||
}
|
||||
|
||||
if (!$expires or $expires eq '') {
|
||||
$expires = '+3d';
|
||||
}
|
||||
|
||||
my $c = Litmus->cgi();
|
||||
|
||||
my $cookie = $c->cookie(
|
||||
-name => $logincookiename,
|
||||
-value => $user_id,
|
||||
-domain => $main::ENV{"HTTP_HOST"},
|
||||
-expires => $expires,
|
||||
);
|
||||
|
||||
return $cookie;
|
||||
}
|
||||
|
||||
# Deprecated:
|
||||
sub getCookie() {
|
||||
return getCurrentUser();
|
||||
}
|
||||
|
||||
sub istrusted($) {
|
||||
my $userobj = shift;
|
||||
|
||||
return 0 if (!$userobj);
|
||||
|
||||
if ($userobj->istrusted()) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
sub canEdit($) {
|
||||
my $userobj = shift;
|
||||
|
||||
return $userobj->istrusted();
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
# logout()
|
||||
#
|
||||
# Unset the user's cookie
|
||||
#########################################################################
|
||||
sub logout() {
|
||||
my $c = Litmus->cgi();
|
||||
|
||||
my $cookie = $c->cookie(
|
||||
-name => $logincookiename,
|
||||
-value => '',
|
||||
-domain => $main::ENV{"HTTP_HOST"},
|
||||
-expires => '-1d'
|
||||
);
|
||||
$c->storeCookie($cookie);
|
||||
|
||||
# invalidate the session behind the cookie as well:
|
||||
my $session = getCurrentSession();
|
||||
if ($session) { $session->makeExpire() }
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
||||
|
||||
59
mozilla/webtools/litmus/Litmus/BugzillaDBI.pm
Executable file
@@ -0,0 +1,59 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::BugzillaDBI;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use Litmus::Config;
|
||||
use Litmus::Error;
|
||||
use Memoize;
|
||||
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
BEGIN {
|
||||
unless ($Litmus::Config::bugzilla_auth_enabled) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
my $dsn = "dbi:mysql:$Litmus::Config::bugzilla_db:$Litmus::Config::bugzilla_host";
|
||||
|
||||
Litmus::BugzillaDBI->set_db('Main',
|
||||
$dsn,
|
||||
$Litmus::Config::bugzilla_user,
|
||||
$Litmus::Config::bugzilla_pass);
|
||||
|
||||
|
||||
|
||||
1;
|
||||
|
||||
72
mozilla/webtools/litmus/Litmus/CGI.pm
Executable file
@@ -0,0 +1,72 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::CGI;
|
||||
|
||||
use strict;
|
||||
use base 'CGI';
|
||||
|
||||
# Subclass of CGI.pm that can store cookies in advance and output them
|
||||
# later when the header() method is called. This feature should probably
|
||||
# be submitted as a patch to CGI.pm itself.
|
||||
|
||||
sub new {
|
||||
my $class = shift;
|
||||
my @args = @_;
|
||||
|
||||
my $self = $class->SUPER::new(@args);
|
||||
$self->{'litmusCookieStore'} = [];
|
||||
return $self;
|
||||
}
|
||||
|
||||
# Stores a cookie to be set later by the header() method
|
||||
sub storeCookie {
|
||||
my $self = shift;
|
||||
my $cookie = shift;
|
||||
|
||||
# "we're like kids in a candy shop"
|
||||
my @cookieStore = @{$self->{'litmusCookieStore'}};
|
||||
push(@cookieStore, $cookie);
|
||||
$self->{'litmusCookieStore'} = \@cookieStore;
|
||||
}
|
||||
|
||||
sub header {
|
||||
my $self = shift;
|
||||
my @args = @_;
|
||||
|
||||
foreach my $cur ($self->{'litmusCookieStore'}) {
|
||||
push(@args, {-cookie => $cur});
|
||||
}
|
||||
|
||||
$self->SUPER::header(@args);
|
||||
}
|
||||
|
||||
1;
|
||||
125
mozilla/webtools/litmus/Litmus/Cache.pm
Executable file
@@ -0,0 +1,125 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::Cache;
|
||||
|
||||
use strict;
|
||||
|
||||
use Litmus;
|
||||
use Data::JavaScript;
|
||||
use Litmus::DB::Product;
|
||||
|
||||
our @ISA = qw(Exporter);
|
||||
@Litmus::Cache::EXPORT = qw(
|
||||
rebuildCache
|
||||
);
|
||||
|
||||
# generate a new litmusconfig.js file because something has updated:
|
||||
sub rebuildCache {
|
||||
unless (-e "data") { system("mkdir", "data") }
|
||||
open(CACHE, ">data/litmusconfig.js.new");
|
||||
|
||||
print CACHE "// Litmus configuration information\n";
|
||||
print CACHE "// Do not edit this file directly. It is autogenerated from the database\n";
|
||||
print CACHE "\n";
|
||||
|
||||
# we build up @litmusconfig, a big perl data structure, and spit the
|
||||
# whole thing out as javascript with Data::JavaScript
|
||||
# shield your eyes, we're in for a long trip
|
||||
my @litmusconfig;
|
||||
my @products = Litmus::DB::Product->search(enabled => 1);
|
||||
my $prodcount = 0;
|
||||
foreach my $curproduct (@products) {
|
||||
my $prodrow = \%{$litmusconfig[$prodcount]};
|
||||
$prodrow->{"name"} = $curproduct->name();
|
||||
$prodrow->{"id"} = $curproduct->product_id();
|
||||
|
||||
my $brancharray = \@{$prodrow->{"branches"}};
|
||||
my $branchcount = 0;
|
||||
foreach my $curbranch ($curproduct->branches(enabled => 1)) {
|
||||
my $branchrow = \%{$brancharray->[$branchcount]};
|
||||
$branchrow->{"name"} = $curbranch->name();
|
||||
$branchrow->{"id"} = $curbranch->branch_id();
|
||||
$branchcount++;
|
||||
}
|
||||
|
||||
my $platformarray = \@{$prodrow->{"platforms"}};
|
||||
my $platformcount = 0;
|
||||
foreach my $curplat (Litmus::DB::Platform->search_ByProduct($curproduct->product_id())) {
|
||||
my $platrow = \%{$platformarray->[$platformcount]};
|
||||
$platrow->{"name"} = $curplat->name();
|
||||
$platrow->{"id"} = $curplat->platform_id();
|
||||
|
||||
my $opsysarray = \@{$platrow->{"opsyses"}};
|
||||
my $opsyscount = 0;
|
||||
foreach my $curopsys ($curplat->opsyses()) {
|
||||
my $opsysrow = \%{$opsysarray->[$opsyscount]};
|
||||
$opsysrow->{"name"} = $curopsys->name();
|
||||
$opsysrow->{"id"} = $curopsys->opsys_id();
|
||||
$opsyscount++;
|
||||
}
|
||||
$platformcount++;
|
||||
}
|
||||
|
||||
my $grouparray = \@{$prodrow->{"testgroups"}};
|
||||
my $groupcount = 0;
|
||||
foreach my $curgroup ($curproduct->testgroups()) {
|
||||
next if (!$curgroup->enabled);
|
||||
my $grouprow = \%{$grouparray->[$groupcount]};
|
||||
$grouprow->{"name"} = $curgroup->name();
|
||||
$grouprow->{"id"} = $curgroup->testgroup_id();
|
||||
$groupcount++;
|
||||
|
||||
my $subgrouparray = \@{$grouprow->{"subgroups"}};
|
||||
my $subgroupcount = 0;
|
||||
foreach my $cursubgroup (Litmus::DB::Subgroup->search_EnabledByTestgroup($curgroup->testgroup_id())) {
|
||||
next if (!$cursubgroup->enabled);
|
||||
my $subgrouprow = \%{$subgrouparray->[$subgroupcount]};
|
||||
$subgrouprow->{"name"} = $cursubgroup->name();
|
||||
$subgrouprow->{"id"} = $cursubgroup->subgroup_id();
|
||||
$subgroupcount++;
|
||||
}
|
||||
}
|
||||
|
||||
$prodcount++;
|
||||
}
|
||||
|
||||
|
||||
my $data = jsdump('litmusconfig', \@litmusconfig);
|
||||
$data =~ s/new Object;/new Array\(\);/g;
|
||||
print CACHE $data;
|
||||
close(CACHE);
|
||||
system("mv", "data/litmusconfig.js.new", "data/litmusconfig.js");
|
||||
#system("chmod", "-R", "755", "data/");
|
||||
}
|
||||
|
||||
1;
|
||||
49
mozilla/webtools/litmus/Litmus/Config.pm
Executable file
@@ -0,0 +1,49 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::Config;
|
||||
|
||||
use strict;
|
||||
|
||||
do 'localconfig';
|
||||
|
||||
our $version = "0.6";
|
||||
|
||||
# if true, then Litmus will not accept any requests
|
||||
our $disabled = 0;
|
||||
|
||||
our $datadir = "data/";
|
||||
|
||||
# Set/unset this to display inline debugging value/code.
|
||||
our $DEBUG = 0;
|
||||
|
||||
1;
|
||||
48
mozilla/webtools/litmus/Litmus/DB/Branch.pm
Executable file
@@ -0,0 +1,48 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Branch;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::Branch->table('branches');
|
||||
|
||||
Litmus::DB::Branch->columns(All => qw/branch_id product_id name detect_regexp enabled/);
|
||||
Litmus::DB::Branch->columns(Essential => qw/branch_id product_id name detect_regexp enabled/);
|
||||
|
||||
Litmus::DB::Branch->column_alias("product_id", "product");
|
||||
|
||||
Litmus::DB::Branch->has_many(test_results => "Litmus::DB::Testresult");
|
||||
Litmus::DB::Branch->has_a(product => "Litmus::DB::Product");
|
||||
|
||||
1;
|
||||
44
mozilla/webtools/litmus/Litmus/DB/BugzillaUser.pm
Executable file
@@ -0,0 +1,44 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::BugzillaUser;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::BugzillaDBI';
|
||||
|
||||
Litmus::DB::BugzillaUser->table('profiles');
|
||||
|
||||
Litmus::DB::BugzillaUser->columns(All => qw/userid login_name cryptpassword realname
|
||||
disabledtext mybugslink refreshed_when extern_id/);
|
||||
|
||||
|
||||
1;
|
||||
44
mozilla/webtools/litmus/Litmus/DB/BuildType.pm
Executable file
@@ -0,0 +1,44 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::BuildType;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::BuildType->table('build_type_lookup');
|
||||
|
||||
Litmus::DB::BuildType->columns(All => qw/build_type_id name/);
|
||||
|
||||
Litmus::DB::BuildType->has_many(test_results => "Litmus::DB::Testresult");
|
||||
|
||||
1;
|
||||
53
mozilla/webtools/litmus/Litmus/DB/Comment.pm
Executable file
@@ -0,0 +1,53 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Comment;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
use Time::Piece;
|
||||
|
||||
Litmus::DB::Comment->table('test_result_comments');
|
||||
|
||||
Litmus::DB::Comment->columns(All => qw/comment_id test_result_id last_updated submission_time user_id comment/);
|
||||
|
||||
Litmus::DB::Comment->column_alias("test_result_id", "test_result");
|
||||
Litmus::DB::Comment->column_alias("user_id", "user");
|
||||
|
||||
Litmus::DB::Comment->has_a(test_result => "Litmus::DB::Testresult");
|
||||
Litmus::DB::Comment->has_a(user => "Litmus::DB::User");
|
||||
|
||||
Litmus::DB::Comment->autoinflate(dates => 'Time::Piece');
|
||||
|
||||
1;
|
||||
|
||||
44
mozilla/webtools/litmus/Litmus/DB/ExitStatus.pm
Executable file
@@ -0,0 +1,44 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::ExitStatus;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::ExitStatus->table('exit_status_lookup');
|
||||
|
||||
Litmus::DB::ExitStatus->columns(All => qw/exit_status_id name/);
|
||||
|
||||
Litmus::DB::ExitStatus->has_many(test_results => "Litmus::DB::Testresult");
|
||||
|
||||
1;
|
||||
46
mozilla/webtools/litmus/Litmus/DB/Format.pm
Executable file
@@ -0,0 +1,46 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Format;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::Format->table('test_format_lookup');
|
||||
|
||||
Litmus::DB::Format->columns(All => qw/format_id name/);
|
||||
|
||||
Litmus::DB::Format->column_alias("format_id", "formatid");
|
||||
|
||||
Litmus::DB::Format->has_many(testcases => "Litmus::DB::Testcase");
|
||||
|
||||
1;
|
||||
52
mozilla/webtools/litmus/Litmus/DB/Locale.pm
Executable file
@@ -0,0 +1,52 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Locale;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::Locale->table('locale_lookup');
|
||||
|
||||
Litmus::DB::Locale->columns(All => qw/abbrev name/);
|
||||
|
||||
Litmus::DB::Locale->column_alias("abbrev", "locale");
|
||||
|
||||
Litmus::DB::Locale->has_many(test_results => "Litmus::DB::Testresult");
|
||||
|
||||
__PACKAGE__->set_sql(RetrieveAll => qq{
|
||||
SELECT __ESSENTIAL__
|
||||
FROM __TABLE__
|
||||
ORDER BY abbrev ASC
|
||||
});
|
||||
|
||||
1;
|
||||
50
mozilla/webtools/litmus/Litmus/DB/Log.pm
Executable file
@@ -0,0 +1,50 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Log;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::Log->table('test_result_logs');
|
||||
|
||||
Litmus::DB::Log->columns(All => qw/log_id last_updated submission_time log_type_id log_text/);
|
||||
|
||||
Litmus::DB::Log->column_alias("test_results", "testresults");
|
||||
Litmus::DB::Log->column_alias("log_type_id", "log_type");
|
||||
|
||||
Litmus::DB::Log->has_a(log_type => "Litmus::DB::LogType");
|
||||
Litmus::DB::Log->has_many(test_results => ["Litmus::DB::LogTestresult" => 'test_result']);
|
||||
|
||||
Litmus::DB::Testresult->autoinflate(dates => 'Time::Piece');
|
||||
|
||||
1;
|
||||
47
mozilla/webtools/litmus/Litmus/DB/LogTestresult.pm
Executable file
@@ -0,0 +1,47 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::LogTestresult;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::LogTestresult->table('testresult_logs_join');
|
||||
|
||||
Litmus::DB::LogTestresult->columns(Primary => qw/test_result_id log_id/);
|
||||
|
||||
Litmus::DB::LogTestresult->column_alias("test_result_id", "test_result");
|
||||
|
||||
Litmus::DB::LogTestresult->has_a(test_result => "Litmus::DB::Testresult");
|
||||
Litmus::DB::LogTestresult->has_a(log_id => "Litmus::DB::Log");
|
||||
|
||||
1;
|
||||
44
mozilla/webtools/litmus/Litmus/DB/LogType.pm
Executable file
@@ -0,0 +1,44 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::LogType;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::LogType->table('log_type_lookup');
|
||||
|
||||
Litmus::DB::LogType->columns(All => qw/log_type_id name/);
|
||||
|
||||
Litmus::DB::LogType->has_many(test_result_logs => "Litmus::DB::Log");
|
||||
|
||||
1;
|
||||
48
mozilla/webtools/litmus/Litmus/DB/Opsys.pm
Executable file
@@ -0,0 +1,48 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Opsys;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::Opsys->table('opsyses');
|
||||
|
||||
Litmus::DB::Opsys->columns(All => qw/opsys_id platform_id name detect_regexp/);
|
||||
Litmus::DB::Opsys->columns(Essential => qw/opsys_id platform_id name detect_regexp/);
|
||||
|
||||
Litmus::DB::Opsys->column_alias("platform_id", "platform");
|
||||
|
||||
Litmus::DB::Opsys->has_many(test_results => "Litmus::DB::Testresult");
|
||||
Litmus::DB::Opsys->has_a(platform => "Litmus::DB::Platform");
|
||||
|
||||
1;
|
||||
105
mozilla/webtools/litmus/Litmus/DB/Platform.pm
Executable file
@@ -0,0 +1,105 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Platform;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
use CGI;
|
||||
|
||||
Litmus::DB::Platform->table('platforms');
|
||||
|
||||
Litmus::DB::Platform->columns(All => qw/platform_id name detect_regexp iconpath/);
|
||||
Litmus::DB::Platform->columns(Essential => qw/platform_id name detect_regexp iconpath/);
|
||||
|
||||
Litmus::DB::Platform->column_alias("platform_id", "platformid");
|
||||
|
||||
Litmus::DB::Platform->has_many(opsyses => "Litmus::DB::Opsys");
|
||||
|
||||
Litmus::DB::Platform->set_sql(ByProduct => qq{
|
||||
SELECT pl.*
|
||||
FROM platforms pl, platform_products plpr
|
||||
WHERE plpr.product_id=? AND plpr.platform_id=pl.platform_id
|
||||
});
|
||||
|
||||
Litmus::DB::Platform->set_sql(ByProductAndName => qq{
|
||||
SELECT pl.*
|
||||
FROM platforms pl, platform_products plpr
|
||||
WHERE plpr.product_id=? AND plpr.platform_id=pl.platform_id
|
||||
AND pl.name=?
|
||||
});
|
||||
|
||||
#########################################################################
|
||||
sub delete_from_products() {
|
||||
my $self = shift;
|
||||
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "DELETE from platform_products WHERE platform_id=?";
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->platform_id
|
||||
);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_with_refs() {
|
||||
my $self = shift;
|
||||
|
||||
$self->delete_from_products();
|
||||
|
||||
# XXX: How to handle opsyses?
|
||||
|
||||
return $self->delete;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub update_products() {
|
||||
my $self = shift;
|
||||
my $new_product_ids = shift;
|
||||
|
||||
if (scalar @$new_product_ids) {
|
||||
# Failing to delete products is _not_ fatal when adding a new subgroup.
|
||||
my $rv = $self->delete_from_products();
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO platform_products (platform_id,product_id) VALUES (?,?)";
|
||||
foreach my $new_product_id (@$new_product_ids) {
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->platform_id,
|
||||
$new_product_id
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
108
mozilla/webtools/litmus/Litmus/DB/Product.pm
Executable file
@@ -0,0 +1,108 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Product;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::Product->table('products');
|
||||
|
||||
Litmus::DB::Product->columns(All => qw/product_id name iconpath enabled/);
|
||||
Litmus::DB::Product->columns(Essential => qw/product_id name iconpath enabled/);
|
||||
|
||||
Litmus::DB::Product->column_alias("product_id", "productid");
|
||||
|
||||
Litmus::DB::Product->has_many(testcases => "Litmus::DB::Testcase",
|
||||
{ order_by => 'testcase_id' });
|
||||
Litmus::DB::Product->has_many(subgroups => "Litmus::DB::Subgroup",
|
||||
{ order_by => 'name' });
|
||||
Litmus::DB::Product->has_many(testgroups => "Litmus::DB::Testgroup",
|
||||
{ order_by => 'name' });
|
||||
Litmus::DB::Product->has_many(branches => "Litmus::DB::Branch",
|
||||
{ order_by => 'name' });
|
||||
|
||||
__PACKAGE__->set_sql(ByPlatform => qq{
|
||||
SELECT pr.*
|
||||
FROM products pr, platform_products plpr
|
||||
WHERE plpr.platform_id=? AND plpr.product_id=pr.product_id
|
||||
ORDER BY pr.name ASC
|
||||
});
|
||||
|
||||
#########################################################################
|
||||
sub delete_from_platforms() {
|
||||
my $self = shift;
|
||||
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "DELETE from platform_products WHERE product_id=?";
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->product_id
|
||||
);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_with_refs() {
|
||||
my $self = shift;
|
||||
$self->delete_from_platforms();
|
||||
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "UPDATE testgroups SET product_id=0,enabled=0 WHERE product_id=?";
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->product_id
|
||||
);
|
||||
|
||||
# Remove references to product in other entities.
|
||||
# Disable those entities for good measure.
|
||||
$sql = "UPDATE subgroups SET product_id=0,enabled=0 WHERE product_id=?";
|
||||
$rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->product_id
|
||||
);
|
||||
|
||||
$sql = "UPDATE testcases SET product_id=0,enabled=0,community_enabled=0 WHERE product_id=?";
|
||||
$rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->product_id
|
||||
);
|
||||
|
||||
$sql = "UPDATE branches SET product_id=0,enabled=0 WHERE product_id=?";
|
||||
$rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->product_id
|
||||
);
|
||||
|
||||
return $self->delete;
|
||||
}
|
||||
|
||||
1;
|
||||
44
mozilla/webtools/litmus/Litmus/DB/ResultStatus.pm
Normal file
@@ -0,0 +1,44 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::ResultStatus;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::ResultStatus->table('test_result_status_lookup');
|
||||
|
||||
Litmus::DB::ResultStatus->columns(All => qw/result_status_id name class_name/);
|
||||
|
||||
Litmus::DB::ResultStatus->has_many(test_results => "Litmus::DB::Testresult");
|
||||
|
||||
1;
|
||||
54
mozilla/webtools/litmus/Litmus/DB/Resultbug.pm
Executable file
@@ -0,0 +1,54 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Resultbug;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
use Time::Piece;
|
||||
|
||||
Litmus::DB::Resultbug->table('test_result_bugs');
|
||||
|
||||
Litmus::DB::Resultbug->columns(Primary => qw/test_result_id bug_id/);
|
||||
Litmus::DB::Resultbug->columns(All => qw/last_updated submission_time user_id/);
|
||||
|
||||
Litmus::DB::Resultbug->column_alias("test_result_id", "test_result");
|
||||
Litmus::DB::Resultbug->column_alias("test_result_id", "testresult");
|
||||
Litmus::DB::Resultbug->column_alias("user_id", "user");
|
||||
|
||||
Litmus::DB::Resultbug->has_a(test_result => "Litmus::DB::Testresult");
|
||||
Litmus::DB::Resultbug->has_a(user => "Litmus::DB::User");
|
||||
|
||||
Litmus::DB::Resultbug->autoinflate(dates => 'Time::Piece');
|
||||
|
||||
1;
|
||||
69
mozilla/webtools/litmus/Litmus/DB/Session.pm
Executable file
@@ -0,0 +1,69 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Session;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
use Time::Piece;
|
||||
|
||||
Litmus::DB::Session->table('sessions');
|
||||
|
||||
Litmus::DB::Session->columns(All => qw/session_id user_id sessioncookie expires/);
|
||||
|
||||
Litmus::DB::Session->has_a(user_id => "Litmus::DB::User");
|
||||
|
||||
Litmus::DB::Session->autoinflate(dates => 'Time::Piece');
|
||||
|
||||
# expire the current Session object
|
||||
sub makeExpire {
|
||||
my $self = shift;
|
||||
$self->delete();
|
||||
}
|
||||
|
||||
sub isValid {
|
||||
my $self = shift;
|
||||
|
||||
if ($self->expires() <= localtime()) {
|
||||
$self->makeExpire();
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!$self->user_id()->enabled() || $self->user_id()->enabled() == 0) {
|
||||
$self->makeExpire();
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
1;
|
||||
306
mozilla/webtools/litmus/Litmus/DB/Subgroup.pm
Executable file
@@ -0,0 +1,306 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Subgroup;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
use Time::Piece::MySQL;
|
||||
#use Litmus::DB::Testresult;
|
||||
|
||||
Litmus::DB::Subgroup->table('subgroups');
|
||||
|
||||
Litmus::DB::Subgroup->columns(All => qw/subgroup_id name testrunner_group_id enabled product_id/);
|
||||
Litmus::DB::Subgroup->columns(Essential => qw/subgroup_id name testrunner_group_id enabled product_id/);
|
||||
|
||||
Litmus::DB::Subgroup->column_alias("subgroup_id", "subgroupid");
|
||||
|
||||
Litmus::DB::Subgroup->has_a(product => "Litmus::DB::Product");
|
||||
|
||||
__PACKAGE__->set_sql(EnabledByTestgroup => qq{
|
||||
SELECT sg.*
|
||||
FROM subgroups sg, subgroup_testgroups sgtg
|
||||
WHERE sgtg.testgroup_id=? AND sgtg.subgroup_id=sg.subgroup_id AND sg.enabled=1
|
||||
ORDER BY sgtg.sort_order ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(ByTestgroup => qq{
|
||||
SELECT sg.*
|
||||
FROM subgroups sg, subgroup_testgroups sgtg
|
||||
WHERE sgtg.testgroup_id=? AND sgtg.subgroup_id=sg.subgroup_id
|
||||
ORDER BY sgtg.sort_order ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(NumEnabledTestcases => qq{
|
||||
SELECT count(tc.testcase_id) as num_testcases
|
||||
FROM testcases tc, testcase_subgroups tcsg
|
||||
WHERE tcsg.subgroup_id=? AND tcsg.testcase_id=tc.testcase_id AND tc.enabled=1 AND tc.community_enabled=1
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(EnabledByTestcase => qq{
|
||||
SELECT sg.*
|
||||
FROM subgroups sg, testcase_subgroups tcsg
|
||||
WHERE tcsg.testcase_id=? AND tcsg.subgroup_id=sg.subgroup_id AND sg.enabled=1
|
||||
ORDER by sg.name ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(ByTestcase => qq{
|
||||
SELECT sg.*
|
||||
FROM subgroups sg, testcase_subgroups tcsg
|
||||
WHERE tcsg.testcase_id=? AND tcsg.subgroup_id=sg.subgroup_id
|
||||
ORDER by sg.name ASC
|
||||
});
|
||||
|
||||
#########################################################################
|
||||
sub coverage() {
|
||||
my $self = shift;
|
||||
my $platform = shift;
|
||||
my $build_id = shift;
|
||||
my $locale = shift;
|
||||
my $community_only = shift;
|
||||
my $user = shift;
|
||||
|
||||
my $sql = "SELECT COUNT(t.testcase_id) FROM testcase_subgroups tsg, testcases t WHERE tsg.subgroup_id=? AND tsg.testcase_id=t.testcase_id AND t.enabled=1";
|
||||
if ($community_only) {
|
||||
$sql .= " AND t.community_enabled=1";
|
||||
}
|
||||
my $dbh = $self->db_Main();
|
||||
my $sth = $dbh->prepare_cached($sql);
|
||||
$sth->execute(
|
||||
$self->{'subgroup_id'},
|
||||
);
|
||||
my ($num_testcases) = $sth->fetchrow_array;
|
||||
|
||||
$sth->finish;
|
||||
|
||||
if (!$num_testcases or
|
||||
$num_testcases == 0) { return "N/A" }
|
||||
|
||||
|
||||
$sql = "SELECT t.testcase_id, count(tr.testresult_id) AS num_results
|
||||
FROM testcase_subgroups tsg JOIN testcases t ON (tsg.testcase_id=t.testcase_id) LEFT JOIN test_results tr ON (tr.testcase_id=t.testcase_id) JOIN opsyses o ON (tr.opsys_id=o.opsys_id)
|
||||
WHERE tsg.subgroup_id=? AND tr.build_id=? AND tr.locale_abbrev=? AND o.platform_id=?";
|
||||
if ($community_only) {
|
||||
$sql .= " AND t.community_enabled=1";
|
||||
}
|
||||
if ($user) {
|
||||
$sql .= " AND tr.user_id=" . $user->{'user_id'};
|
||||
}
|
||||
|
||||
$sql .= " GROUP BY tr.testcase_id";
|
||||
|
||||
$sth = $dbh->prepare_cached($sql);
|
||||
$sth->execute(
|
||||
$self->{'subgroup_id'},
|
||||
$build_id,
|
||||
$locale,
|
||||
$platform->{'platform_id'}
|
||||
);
|
||||
my @test_results = $self->sth_to_objects($sth);
|
||||
|
||||
$sth->finish;
|
||||
|
||||
if (@test_results == 0) { return "0" }
|
||||
|
||||
my $num_completed = 0;
|
||||
foreach my $curtest (@test_results) {
|
||||
if ($curtest->{'num_results'} > 0) {
|
||||
$num_completed++;
|
||||
}
|
||||
}
|
||||
|
||||
my $result = $num_completed/($num_testcases) * 100;
|
||||
unless ($result) {
|
||||
return "0";
|
||||
}
|
||||
|
||||
return sprintf("%d",$result);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub clone() {
|
||||
my $self = shift;
|
||||
|
||||
my $new_subgroup = $self->copy;
|
||||
if (!$new_subgroup) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
# Propagate testgroup membership;
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO subgroup_testgroups (subgroup_id,testgroup_id,sort_order) SELECT ?,testgroup_id,sort_order FROM subgroup_testgroups WHERE subgroup_id=?";
|
||||
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$new_subgroup->subgroup_id,
|
||||
$self->subgroup_id
|
||||
);
|
||||
if (! $rows) {
|
||||
# XXX: Do we need to throw a warning here?
|
||||
# What happens when we clone a subgroup that doesn't belong to
|
||||
# any testgroups?
|
||||
}
|
||||
|
||||
$sql = "INSERT INTO testcase_subgroups (testcase_id,subgroup_id,sort_order) SELECT testcase_id,?,sort_order FROM testcase_subgroups WHERE subgroup_id=?";
|
||||
|
||||
$rows = $dbh->do($sql,
|
||||
undef,
|
||||
$new_subgroup->subgroup_id,
|
||||
$self->subgroup_id
|
||||
);
|
||||
if (! $rows) {
|
||||
# XXX: Do we need to throw a warning here?
|
||||
}
|
||||
|
||||
return $new_subgroup;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_from_testgroups() {
|
||||
my $self = shift;
|
||||
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "DELETE from subgroup_testgroups WHERE subgroup_id=?";
|
||||
return $dbh->do($sql,
|
||||
undef,
|
||||
$self->subgroup_id
|
||||
);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_from_testgroup() {
|
||||
my $self = shift;
|
||||
my $testgroup_id = shift;
|
||||
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "DELETE from subgroup_testgroups WHERE subgroup_id=? AND testgroup_id=?";
|
||||
return $dbh->do($sql,
|
||||
undef,
|
||||
$self->subgroup_id,
|
||||
$testgroup_id
|
||||
);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_from_testcases() {
|
||||
my $self = shift;
|
||||
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "DELETE from testcase_subgroups WHERE subgroup_id=?";
|
||||
return $dbh->do($sql,
|
||||
undef,
|
||||
$self->subgroup_id
|
||||
);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_with_refs() {
|
||||
my $self = shift;
|
||||
$self->delete_from_testgroups();
|
||||
$self->delete_from_testcases();
|
||||
return $self->delete;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub update_testgroups() {
|
||||
my $self = shift;
|
||||
my $new_testgroup_ids = shift;
|
||||
|
||||
if (scalar @$new_testgroup_ids) {
|
||||
# Failing to delete testgroups is _not_ fatal when adding a new subgroup.
|
||||
my $rv = $self->delete_from_testgroups();
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO subgroup_testgroups (subgroup_id,testgroup_id,sort_order) VALUES (?,?,1)";
|
||||
foreach my $new_testgroup_id (@$new_testgroup_ids) {
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->subgroup_id,
|
||||
$new_testgroup_id
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub update_testgroup() {
|
||||
my $self = shift;
|
||||
my $testgroup_id = shift;
|
||||
my $sort_order = shift;
|
||||
|
||||
# Sort order defaults to 1.
|
||||
if (!$sort_order) {
|
||||
$sort_order = 1;
|
||||
}
|
||||
|
||||
my $rv = $self->delete_from_testgroup($testgroup_id);
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO subgroup_testgroups (subgroup_id,testgroup_id,sort_order) VALUES (?,?,?)";
|
||||
return $dbh->do($sql,
|
||||
undef,
|
||||
$self->subgroup_id,
|
||||
$testgroup_id,
|
||||
$sort_order
|
||||
);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub update_testcases() {
|
||||
my $self = shift;
|
||||
my $new_testcase_ids = shift;
|
||||
|
||||
if (scalar @$new_testcase_ids) {
|
||||
# Failing to delete testcases is _not_ fatal when adding a new subgroup.
|
||||
my $rv = $self->delete_from_testcases();
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO testcase_subgroups (testcase_id,subgroup_id,sort_order) VALUES (?,?,?)";
|
||||
my $sort_order = 1;
|
||||
foreach my $new_testcase_id (@$new_testcase_ids) {
|
||||
next if (!$new_testcase_id);
|
||||
# Log any failures/duplicate keys to STDERR.
|
||||
eval {
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$new_testcase_id,
|
||||
$self->subgroup_id,
|
||||
$sort_order
|
||||
);
|
||||
};
|
||||
if ($@) {
|
||||
print STDERR $@;
|
||||
}
|
||||
$sort_order++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
61
mozilla/webtools/litmus/Litmus/DB/TestRun.pm
Executable file
@@ -0,0 +1,61 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::TestRun;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
use Time::Piece;
|
||||
use Time::Seconds;
|
||||
|
||||
Litmus::DB::TestRun->table('test_runs');
|
||||
|
||||
Litmus::DB::TestRun->columns(All => qw/test_run_id testgroup_id name description start_timestamp finish_timestamp enabled/);
|
||||
|
||||
Litmus::DB::TestRun->column_alias("testgroup_id", "testgroup");
|
||||
|
||||
Litmus::DB::TestRun->has_a(testgroup => "Litmus::DB::Testgroup");
|
||||
Litmus::DB::TestRun->has_many(subgroups =>
|
||||
[ "Litmus::DB::SubgroupTestgroup" => "testgroup" ]);
|
||||
|
||||
Litmus::DB::TestRun->autoinflate(dates => 'Time::Piece');
|
||||
|
||||
1;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
377
mozilla/webtools/litmus/Litmus/DB/Testcase.pm
Executable file
@@ -0,0 +1,377 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Testcase;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
use Date::Manip;
|
||||
#use Litmus::DB::Testresult;
|
||||
use Memoize;
|
||||
#use Litmus::Error;
|
||||
|
||||
our $default_relevance_threshold = 1.0;
|
||||
our $default_match_limit = 25;
|
||||
our $default_num_days = 7;
|
||||
|
||||
Litmus::DB::Testcase->table('testcases');
|
||||
|
||||
Litmus::DB::Testcase->columns(Primary => qw/testcase_id/);
|
||||
Litmus::DB::Testcase->columns(Essential => qw/summary details enabled community_enabled format_id regression_bug_id product_id steps expected_results author_id creation_date last_updated version testrunner_case_id testrunner_case_version/);
|
||||
|
||||
Litmus::DB::Testcase->column_alias("testcase_id", "testid");
|
||||
Litmus::DB::Testcase->column_alias("testcase_id", "test_id");
|
||||
Litmus::DB::Testcase->column_alias("testcase_id", "id");
|
||||
Litmus::DB::Testcase->column_alias("community_enabled", "communityenabled");
|
||||
Litmus::DB::Testcase->column_alias("format_id", "format");
|
||||
Litmus::DB::Testcase->column_alias("author_id", "author");
|
||||
Litmus::DB::Testcase->column_alias("product_id", "product");
|
||||
|
||||
Litmus::DB::Testcase->has_a("format" => "Litmus::DB::Format");
|
||||
Litmus::DB::Testcase->has_a("author" => "Litmus::DB::User");
|
||||
Litmus::DB::Testcase->has_a("product" => "Litmus::DB::Product");
|
||||
|
||||
__PACKAGE__->set_sql(EnabledBySubgroup => qq{
|
||||
SELECT t.*
|
||||
FROM testcases t, testcase_subgroups tsg
|
||||
WHERE tsg.subgroup_id=? AND tsg.testcase_id=t.testcase_id AND t.enabled=1
|
||||
ORDER BY tsg.sort_order ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(BySubgroup => qq{
|
||||
SELECT t.*
|
||||
FROM testcases t, testcase_subgroups tsg
|
||||
WHERE
|
||||
tsg.subgroup_id=? AND
|
||||
tsg.testcase_id=t.testcase_id
|
||||
ORDER BY tsg.sort_order ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(ByTestgroup => qq{
|
||||
SELECT t.*
|
||||
FROM testcases t, testcase_subgroups tsg, subgroup_testgroups sgtg
|
||||
WHERE
|
||||
tsg.testcase_id=t.testcase_id AND
|
||||
tsg.subgroup_id=sgtg.subgroup_id AND
|
||||
sgtg.testgroup_id = ?
|
||||
ORDER BY tsg.sort_order ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(CommunityEnabledBySubgroup => qq{
|
||||
SELECT t.*
|
||||
FROM testcases t, testcase_subgroups tsg
|
||||
WHERE tsg.subgroup_id=? AND tsg.testcase_id=t.testcase_id AND t.enabled=1 AND t.community_enabled=1
|
||||
ORDER BY tsg.sort_order ASC, t.testcase_id ASC
|
||||
});
|
||||
|
||||
Litmus::DB::Testcase->has_many(test_results => "Litmus::DB::Testresult", {order_by => 'submission_time DESC'});
|
||||
|
||||
Litmus::DB::Testcase->has_many(subgroups =>
|
||||
["Litmus::DB::TestcaseSubgroup" => 'subgroup']);
|
||||
|
||||
#########################################################################
|
||||
# is_completed($$$$$)
|
||||
#
|
||||
# Check whether we have test results for the current test that correspond
|
||||
# to the provided platform, build_id, and user(optional).
|
||||
#########################################################################
|
||||
memoize('is_completed');
|
||||
sub is_completed {
|
||||
my $self = shift;
|
||||
my $platform = shift;
|
||||
my $build_id = shift;
|
||||
my $locale = shift;
|
||||
my $user = shift; # optional
|
||||
|
||||
my @results;
|
||||
if ($user) {
|
||||
@results = Litmus::DB::Testresult->search_CompletedByUser(
|
||||
$self->{'testcase_id'},
|
||||
$build_id,
|
||||
$locale->{'abbrev'},
|
||||
$platform->{'platform_id'},
|
||||
$user->{'user_id'},
|
||||
);
|
||||
} else {
|
||||
@results = Litmus::DB::Testresult->search_Completed(
|
||||
$self->{'testcase_id'},
|
||||
$build_id,
|
||||
$locale->{'abbrev'},
|
||||
$platform->{'platform_id'},
|
||||
);
|
||||
}
|
||||
|
||||
return @results;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getFullTextMatches() {
|
||||
my $self = shift;
|
||||
my $text_snippet = shift;
|
||||
my $match_limit = shift;
|
||||
my $relevance_threshold = shift;
|
||||
|
||||
if (!$match_limit) {
|
||||
$match_limit = $default_match_limit;
|
||||
}
|
||||
if (!$relevance_threshold) {
|
||||
$relevance_threshold = $default_relevance_threshold
|
||||
}
|
||||
|
||||
__PACKAGE__->set_sql(FullTextMatches => qq{
|
||||
SELECT testcase_id, summary, creation_date, last_updated, MATCH (summary,steps,expected_results) AGAINST (?) AS relevance
|
||||
FROM testcases
|
||||
WHERE MATCH (summary,steps,expected_results) AGAINST (?) HAVING relevance > ?
|
||||
ORDER BY relevance DESC, summary ASC
|
||||
LIMIT $match_limit
|
||||
});
|
||||
|
||||
|
||||
return $self->search_FullTextMatches(
|
||||
$text_snippet,
|
||||
$text_snippet,
|
||||
$relevance_threshold
|
||||
);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getNewTestcases() {
|
||||
my $self = shift;
|
||||
my $num_days = shift;
|
||||
my $match_limit = shift;
|
||||
|
||||
if (!$num_days) {
|
||||
$num_days = $default_num_days;
|
||||
}
|
||||
|
||||
if (!$match_limit) {
|
||||
$match_limit = $default_match_limit;
|
||||
}
|
||||
|
||||
__PACKAGE__->set_sql(NewTestcases => qq{
|
||||
SELECT testcase_id, summary, creation_date, last_updated
|
||||
FROM testcases
|
||||
WHERE creation_date>=?
|
||||
ORDER BY creation_date DESC
|
||||
LIMIT $match_limit
|
||||
});
|
||||
|
||||
my $err;
|
||||
my $new_datestamp=&UnixDate(DateCalc("now","- $num_days days"),"%q");
|
||||
return $self->search_NewTestcases($new_datestamp);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getRecentlyUpdated() {
|
||||
my $self = shift;
|
||||
my $num_days = shift;
|
||||
my $match_limit = shift;
|
||||
|
||||
if (!$num_days) {
|
||||
$num_days = $default_num_days;
|
||||
}
|
||||
|
||||
if (!$match_limit) {
|
||||
$match_limit = $default_match_limit;
|
||||
}
|
||||
|
||||
__PACKAGE__->set_sql(RecentlyUpdated => qq{
|
||||
SELECT testcase_id, summary, creation_date, last_updated
|
||||
FROM testcases
|
||||
WHERE last_updated>=? AND last_updated>creation_date
|
||||
ORDER BY last_updated DESC
|
||||
LIMIT $match_limit
|
||||
});
|
||||
|
||||
my $err;
|
||||
my $new_datestamp=&UnixDate(DateCalc("now","- $num_days days"),"%q");
|
||||
return $self->search_RecentlyUpdated($new_datestamp);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getDefaultMatchLimit() {
|
||||
return $default_match_limit;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getDefaultRelevanceThreshold() {
|
||||
return $default_relevance_threshold;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getDefaultNumDays() {
|
||||
return $default_num_days;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub clone() {
|
||||
my $self = shift;
|
||||
|
||||
my $new_testcase = $self->copy;
|
||||
if (!$new_testcase) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
# Update dates to now.
|
||||
my $now = &UnixDate("today","%q");
|
||||
$new_testcase->creation_date($now);
|
||||
$new_testcase->last_updated($now);
|
||||
$new_testcase->update();
|
||||
|
||||
# Propagate subgroup membership;
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO testcase_subgroups (testcase_id,subgroup_id,sort_order) SELECT ?,subgroup_id,sort_order FROM testcase_subgroups WHERE testcase_id=?";
|
||||
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$new_testcase->testcase_id,
|
||||
$self->testcase_id
|
||||
);
|
||||
if (! $rows) {
|
||||
# XXX: Do we need to throw a warning here?
|
||||
# What happens when we clone a testcase that doesn't belong to
|
||||
# any subgroups?
|
||||
}
|
||||
|
||||
$sql = "INSERT INTO related_testcases (testcase_id, related_testcase_id) VALUES (?,?)";
|
||||
$rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->testcase_id,
|
||||
$new_testcase->testcase_id
|
||||
);
|
||||
if (! $rows) {
|
||||
# XXX: Do we need to throw a warning here?
|
||||
}
|
||||
|
||||
return $new_testcase;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_from_subgroups() {
|
||||
my $self = shift;
|
||||
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "DELETE from testcase_subgroups WHERE testcase_id=?";
|
||||
return $dbh->do($sql,
|
||||
undef,
|
||||
$self->testcase_id
|
||||
);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_from_subgroup() {
|
||||
my $self = shift;
|
||||
my $subgroup_id = shift;
|
||||
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "DELETE from testcase_subgroups WHERE testcase_id=? AND subgroup_id=?";
|
||||
return $dbh->do($sql,
|
||||
undef,
|
||||
$self->testcase_id,
|
||||
$subgroup_id
|
||||
);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_from_related() {
|
||||
my $self = shift;
|
||||
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "DELETE from related_testcases WHERE testcase_id=? OR related_testcase_id=?";
|
||||
return $dbh->do($sql,
|
||||
undef,
|
||||
$self->testcase_id,
|
||||
$self->testcase_id
|
||||
);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_with_refs() {
|
||||
my $self = shift;
|
||||
$self->delete_from_subgroups();
|
||||
$self->delete_from_related();
|
||||
return $self->delete;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub update_subgroups() {
|
||||
my $self = shift;
|
||||
my $new_subgroup_ids = shift;
|
||||
|
||||
if (scalar @$new_subgroup_ids) {
|
||||
# Failing to delete subgroups is _not_ fatal when adding a new testcase.
|
||||
my $rv = $self->delete_from_subgroups();
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO testcase_subgroups (testcase_id,subgroup_id,sort_order) VALUES (?,?,1)";
|
||||
foreach my $new_subgroup_id (@$new_subgroup_ids) {
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->testcase_id,
|
||||
$new_subgroup_id
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub update_subgroup() {
|
||||
my $self = shift;
|
||||
my $subgroup_id = shift;
|
||||
my $sort_order = shift;
|
||||
|
||||
# Sort order defaults to 1.
|
||||
if (!$sort_order) {
|
||||
$sort_order = 1;
|
||||
}
|
||||
|
||||
my $rv = $self->delete_from_subgroup($subgroup_id);
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO testcase_subgroups (testcase_id,subgroup_id,sort_order) VALUES (?,?,?)";
|
||||
return $dbh->do($sql,
|
||||
undef,
|
||||
$self->testcase_id,
|
||||
$subgroup_id,
|
||||
$sort_order
|
||||
);
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
49
mozilla/webtools/litmus/Litmus/DB/TestcaseSubgroup.pm
Executable file
@@ -0,0 +1,49 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::TestcaseSubgroup;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::TestcaseSubgroup->table('testcase_subgroups');
|
||||
|
||||
Litmus::DB::TestcaseSubgroup->columns(All => qw/testcase_id subgroup_id/);
|
||||
|
||||
Litmus::DB::TestcaseSubgroup->has_a(testcase_id => "Litmus::DB::Testcase");
|
||||
Litmus::DB::TestcaseSubgroup->has_a(subgroup_id => "Litmus::DB::Subgroup");
|
||||
|
||||
Litmus::DB::TestcaseSubgroup->column_alias("testcase_id", "testcase");
|
||||
Litmus::DB::TestcaseSubgroup->column_alias("testcase_id", "test");
|
||||
Litmus::DB::TestcaseSubgroup->column_alias("subgroup_id", "subgroup");
|
||||
|
||||
1;
|
||||
260
mozilla/webtools/litmus/Litmus/DB/Testgroup.pm
Executable file
@@ -0,0 +1,260 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Testgroup;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::Testgroup->table('testgroups');
|
||||
|
||||
Litmus::DB::Testgroup->columns(All => qw/testgroup_id product_id name enabled testrunner_plan_id/);
|
||||
Litmus::DB::Testgroup->columns(Essential => qw/testgroup_id product_id name enabled testrunner_plan_id/);
|
||||
|
||||
Litmus::DB::Testgroup->column_alias("product_id", "product");
|
||||
|
||||
Litmus::DB::Testgroup->has_a(product => "Litmus::DB::Product");
|
||||
|
||||
__PACKAGE__->set_sql(EnabledByBranch => qq{
|
||||
SELECT tg.*
|
||||
FROM testgroups tg, testgroup_branches tgb
|
||||
WHERE tgb.branch_id=? AND tgb.testgroup_id=tg.testgroup_id AND tg.enabled=1 ORDER by tg.name ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(ByBranch => qq{
|
||||
SELECT tg.*
|
||||
FROM testgroups tg, testgroup_branches tgb
|
||||
WHERE tgb.branch_id=? AND tgb.testgroup_id=tg.testgroup_id ORDER by tg.name ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(EnabledBySubgroup => qq{
|
||||
SELECT tg.*
|
||||
FROM testgroups tg, subgroup_testgroups sgtg
|
||||
WHERE sgtg.subgroup_id=? AND sgtg.testgroup_id=tg.testgroup_id AND tg.enabled=1 ORDER by tg.name ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(BySubgroup => qq{
|
||||
SELECT tg.*
|
||||
FROM testgroups tg, subgroup_testgroups sgtg
|
||||
WHERE sgtg.subgroup_id=? AND sgtg.testgroup_id=tg.testgroup_id ORDER by tg.name ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(EnabledByTestcase => qq{
|
||||
SELECT tg.*
|
||||
FROM testgroups tg, subgroup_testgroups sgtg, testcase_subgroups tcsg
|
||||
WHERE tcsg.testcase_id=? AND tcsg.subgroup_id=sgtg.subgroup_id AND sgtg.testgroup_id=tg.testgroup_id AND tg.enabled=1 ORDER by tg.name ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(ByTestcase => qq{
|
||||
SELECT tg.*
|
||||
FROM testgroups tg, subgroup_testgroups sgtg, testcase_subgroups tcsg
|
||||
WHERE tcsg.testcase_id=? AND tcsg.subgroup_id=sgtg.subgroup_id AND sgtg.testgroup_id=tg.testgroup_id ORDER by tg.name ASC
|
||||
});
|
||||
|
||||
#########################################################################
|
||||
sub coverage {
|
||||
my $self = shift;
|
||||
my $platform = shift;
|
||||
my $build_id = shift;
|
||||
my $locale = shift;
|
||||
my $community_only = shift;
|
||||
my $user = shift;
|
||||
|
||||
my $percent_completed = 0;
|
||||
|
||||
my @subgroups = Litmus::DB::Subgroup->search_EnabledByTestgroup($self->testgroup_id);
|
||||
my $num_empty_subgroups = 0;
|
||||
foreach my $subgroup (@subgroups) {
|
||||
my $subgroup_percent = $subgroup->coverage(
|
||||
$platform,
|
||||
$build_id,
|
||||
$locale,
|
||||
$community_only,
|
||||
$user,
|
||||
);
|
||||
if ($subgroup_percent eq "N/A") {
|
||||
$num_empty_subgroups++;
|
||||
} else {
|
||||
$percent_completed += $subgroup_percent;
|
||||
}
|
||||
}
|
||||
|
||||
if (scalar(@subgroups) - $num_empty_subgroups == 0) {
|
||||
return "N/A"
|
||||
}
|
||||
my $total_percentage = $percent_completed /
|
||||
(scalar @subgroups - $num_empty_subgroups);
|
||||
|
||||
return sprintf("%d",$total_percentage);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub clone() {
|
||||
my $self = shift;
|
||||
|
||||
my $new_testgroup = $self->copy;
|
||||
if (!$new_testgroup) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
# Propagate testgroup membership;
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO subgroup_testgroups (subgroup_id,testgroup_id,sort_order) SELECT subgroup_id,?,sort_order FROM subgroup_testgroups WHERE testgroup_id=?";
|
||||
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$new_testgroup->testgroup_id,
|
||||
$self->testgroup_id
|
||||
);
|
||||
if (! $rows) {
|
||||
# XXX: Do we need to throw a warning here?
|
||||
}
|
||||
|
||||
return $new_testgroup;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_from_subgroups() {
|
||||
my $self = shift;
|
||||
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "DELETE from subgroup_testgroups WHERE testgroup_id=?";
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->testgroup_id
|
||||
);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_from_test_runs() {
|
||||
my $self = shift;
|
||||
|
||||
# XXX: Placeholder for test runs.
|
||||
return;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub delete_with_refs() {
|
||||
my $self = shift;
|
||||
$self->delete_from_subgroups();
|
||||
$self->delete_from_test_runs();
|
||||
return $self->delete;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub update_subgroups() {
|
||||
my $self = shift;
|
||||
my $new_subgroup_ids = shift;
|
||||
|
||||
if (scalar @$new_subgroup_ids) {
|
||||
# Failing to delete subgroups is _not_ fatal when adding a new testgroup.
|
||||
my $rv = $self->delete_from_subgroups();
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO subgroup_testgroups (subgroup_id,testgroup_id,sort_order) VALUES (?,?,?)";
|
||||
my $sort_order = 1;
|
||||
foreach my $new_subgroup_id (@$new_subgroup_ids) {
|
||||
next if (!$new_subgroup_id);
|
||||
# Log any failures/duplicate keys to STDERR.
|
||||
eval {
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$new_subgroup_id,
|
||||
$self->testgroup_id,
|
||||
$sort_order
|
||||
);
|
||||
};
|
||||
if ($@) {
|
||||
print STDERR $@;
|
||||
}
|
||||
$sort_order++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub update_branches() {
|
||||
my $self = shift;
|
||||
my $new_branch_ids = shift;
|
||||
|
||||
if (scalar @$new_branch_ids) {
|
||||
# Failing to delete branches is _not_ fatal when adding a new testgroup.
|
||||
my $rv = $self->delete_from_branches();
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO testgroup_branches (testgroup_id,branch_id) VALUES (?,?)";
|
||||
foreach my $new_branch_id (@$new_branch_ids) {
|
||||
next if (!$new_branch_id);
|
||||
# Log any failures/duplicate keys to STDERR.
|
||||
eval {
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->testgroup_id,
|
||||
$new_branch_id,
|
||||
);
|
||||
};
|
||||
if ($@) {
|
||||
print STDERR $@;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub add_branch() {
|
||||
my $self = shift;
|
||||
my $new_branch_id = shift;
|
||||
|
||||
# Failure to insert isn't fatal in the case of a collision, but we do want
|
||||
# to log it.
|
||||
my $dbh = __PACKAGE__->db_Main();
|
||||
my $sql = "INSERT INTO testgroup_branches (testgroup_id,branch_id) VALUES (?,?)";
|
||||
# Log any failures/duplicate keys to STDERR.
|
||||
eval {
|
||||
my $rows = $dbh->do($sql,
|
||||
undef,
|
||||
$self->testgroup_id,
|
||||
$new_branch_id,
|
||||
);
|
||||
};
|
||||
if ($@) {
|
||||
print STDERR $@;
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
390
mozilla/webtools/litmus/Litmus/DB/Testresult.pm
Executable file
@@ -0,0 +1,390 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::Testresult;
|
||||
|
||||
use strict;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
use Date::Manip;
|
||||
use Time::Piece;
|
||||
use Time::Seconds;
|
||||
use Memoize;
|
||||
|
||||
our $_num_results_default = 15;
|
||||
|
||||
Litmus::DB::Testresult->table('test_results');
|
||||
|
||||
Litmus::DB::Testresult->columns(All => qw/testresult_id testcase_id last_updated submission_time user_id opsys_id branch_id build_id user_agent result_status_id build_type_id machine_name exit_status_id duration_ms talkback_id valid vetted validated_by_user_id vetted_by_user_id validated_timestamp vetted_timestamp locale_abbrev is_automated_result/);
|
||||
|
||||
Litmus::DB::Testresult->column_alias("testcase_id", "testcase");
|
||||
Litmus::DB::Testresult->column_alias("submission_time", "timestamp");
|
||||
Litmus::DB::Testresult->column_alias("user_id", "user");
|
||||
Litmus::DB::Testresult->column_alias("opsys_id", "opsys");
|
||||
Litmus::DB::Testresult->column_alias("branch_id", "branch");
|
||||
Litmus::DB::Testresult->column_alias("user_agent", "useragent");
|
||||
Litmus::DB::Testresult->column_alias("result_status_id", "result_status");
|
||||
Litmus::DB::Testresult->column_alias("build_type_id", "build_type");
|
||||
Litmus::DB::Testresult->column_alias("exit_status_id", "exit_status");
|
||||
Litmus::DB::Testresult->column_alias("validity_id", "validity");
|
||||
Litmus::DB::Testresult->column_alias("vetting_status_id", "vetting_status");
|
||||
Litmus::DB::Testresult->column_alias("locale_abbrev", "locale");
|
||||
Litmus::DB::Testresult->column_alias("is_automated_result", "isAutomated");
|
||||
|
||||
Litmus::DB::Testresult->has_a(opsys => "Litmus::DB::Opsys");
|
||||
Litmus::DB::Testresult->has_a(branch => "Litmus::DB::Branch");
|
||||
Litmus::DB::Testresult->has_a(testcase => "Litmus::DB::Testcase");
|
||||
Litmus::DB::Testresult->has_a(result_status => "Litmus::DB::ResultStatus");
|
||||
Litmus::DB::Testresult->has_a(user => "Litmus::DB::User");
|
||||
Litmus::DB::Testresult->has_a(useragent => "Litmus::UserAgentDetect");
|
||||
Litmus::DB::Testresult->has_a(build_type => "Litmus::DB::BuildType");
|
||||
Litmus::DB::Testresult->has_a(exit_status => "Litmus::DB::ExitStatus");
|
||||
Litmus::DB::Testresult->has_a(locale => "Litmus::DB::Locale");
|
||||
Litmus::DB::Testresult->has_a(platform =>
|
||||
[ "Litmus::DB::Opsys" => "platform" ]);
|
||||
|
||||
Litmus::DB::Testresult->has_many(logs =>
|
||||
["Litmus::DB::LogTestresult" => 'log_id']);
|
||||
Litmus::DB::Testresult->has_many(comments => "Litmus::DB::Comment", {order_by => 'comment_id ASC, submission_time ASC'});
|
||||
Litmus::DB::Testresult->has_many(bugs => "Litmus::DB::Resultbug", {order_by => 'bug_id ASC, submission_time DESC'});
|
||||
|
||||
Litmus::DB::Testresult->autoinflate(dates => 'Time::Piece');
|
||||
|
||||
Litmus::DB::Testresult->set_sql(DefaultTestResults => qq{
|
||||
SELECT tr.testresult_id,tr.testcase_id,t.summary,tr.submission_time AS created,p.name AS platform_name,pr.name as product_name,trsl.name AS result_status,trsl.class_name result_status_class,b.name AS branch_name,tg.name AS test_group_name, tr.locale_abbrev, u.email
|
||||
FROM test_results tr, testcases t, platforms p, opsyses o, branches b, products pr, test_result_status_lookup trsl, testgroups tg, subgroups sg, users u, testcase_subgroups tcsg, subgroup_testgroups sgtg
|
||||
WHERE tr.testcase_id=t.testcase_id AND tr.opsys_id=o.opsys_id AND o.platform_id=p.platform_id AND tr.branch_id=b.branch_id AND b.product_id=pr.product_id AND tr.result_status_id=trsl.result_status_id AND tcsg.testcase_id=tr.testcase_id AND tcsg.subgroup_id=sg.subgroup_id AND sg.subgroup_id=sgtg.subgroup_id AND sgtg.testgroup_id=tg.testgroup_id AND tr.user_id=u.user_id AND tr.valid=1
|
||||
ORDER BY tr.submission_time DESC, t.testcase_id DESC
|
||||
LIMIT $_num_results_default
|
||||
});
|
||||
|
||||
Litmus::DB::Testresult->set_sql(CommonResults => qq{
|
||||
SELECT COUNT(tr.testcase_id) AS num_results, tr.testcase_id, t.summary, MAX(tr.submission_time) AS most_recent, MAX(tr.testresult_id) AS max_id
|
||||
FROM test_results tr, testcases t, test_result_status_lookup trsl
|
||||
WHERE tr.testcase_id=t.testcase_id AND tr.result_status_id=trsl.result_status_id AND trsl.class_name=?
|
||||
GROUP BY tr.testcase_id
|
||||
ORDER BY num_results DESC, tr.testresult_id DESC
|
||||
LIMIT 15
|
||||
});
|
||||
|
||||
Litmus::DB::Testresult->set_sql(Completed => qq{
|
||||
SELECT tr.*
|
||||
FROM test_results tr, opsyses o
|
||||
WHERE tr.testcase_id=? AND
|
||||
tr.build_id=? AND
|
||||
tr.locale_abbrev=? AND
|
||||
tr.opsys_id=o.opsys_id AND
|
||||
o.platform_id=?
|
||||
ORDER BY tr.submission_time DESC
|
||||
});
|
||||
|
||||
Litmus::DB::Testresult->set_sql(CompletedByUser => qq{
|
||||
SELECT tr.*
|
||||
FROM test_results tr, opsyses o
|
||||
WHERE tr.testcase_id=? AND
|
||||
tr.build_id=? AND
|
||||
tr.locale_abbrev=? AND
|
||||
tr.opsys_id=o.opsys_id AND
|
||||
o.platform_id=? AND
|
||||
tr.user_id=?
|
||||
ORDER BY tr.submission_time DESC
|
||||
});
|
||||
|
||||
#########################################################################
|
||||
# for historical reasons, note() is a shorthand way of saying "the text of
|
||||
# the first comment on this result if that comment was submitted by the
|
||||
# result submitter"
|
||||
#########################################################################
|
||||
sub note {
|
||||
my $self = shift;
|
||||
|
||||
my @comments = $self->comments();
|
||||
|
||||
if (@comments && $comments[0] &&
|
||||
$comments[0]->user() == $self->user()) {
|
||||
return $comments[0]->comment();
|
||||
} else {
|
||||
return undef;
|
||||
}
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
# is this test result from a trusted user?
|
||||
#########################################################################
|
||||
sub istrusted {
|
||||
my $self = shift;
|
||||
|
||||
if ($self->user()->istrusted()) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
# &getDefaultTestResults($)
|
||||
#
|
||||
#########################################################################
|
||||
sub getDefaultTestResults($) {
|
||||
my $self = shift;
|
||||
my @rows = $self->search_DefaultTestResults();
|
||||
my $criteria = "Default<br/>Ordered by Created<br/>Limit to $_num_results_default results";
|
||||
return $criteria, \@rows;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
# &getTestResults($\@\@$)
|
||||
#
|
||||
#########################################################################
|
||||
sub getTestResults($\@\@$) {
|
||||
my ($self,$where_criteria,$order_by_criteria,$limit_value) = @_;
|
||||
|
||||
my $select = 'SELECT tr.testresult_id,tr.testcase_id,t.summary,tr.submission_time AS created,p.name AS platform_name,pr.name as product_name,trsl.name AS result_status,trsl.class_name AS result_status_class,b.name AS branch_name,tg.name AS test_group_name, tr.locale_abbrev, u.email';
|
||||
|
||||
my $from = 'FROM test_results tr, testcases t, platforms p, opsyses o, branches b, products pr, test_result_status_lookup trsl, testgroups tg, subgroups sg, users u, testcase_subgroups tcsg, subgroup_testgroups sgtg';
|
||||
|
||||
my $where = 'WHERE tr.testcase_id=t.testcase_id AND tr.opsys_id=o.opsys_id AND o.platform_id=p.platform_id AND tr.branch_id=b.branch_id AND b.product_id=pr.product_id AND tr.result_status_id=trsl.result_status_id AND tcsg.testcase_id=tr.testcase_id AND tcsg.subgroup_id=sg.subgroup_id AND sg.subgroup_id=sgtg.subgroup_id AND sgtg.testgroup_id=tg.testgroup_id AND tr.user_id=u.user_id AND tr.valid=1';
|
||||
|
||||
my $limit = 'LIMIT ';
|
||||
|
||||
foreach my $criterion (@$where_criteria) {
|
||||
$criterion->{'value'} =~ s/'/\'/g;
|
||||
if ($criterion->{'field'} eq 'branch') {
|
||||
$where .= " AND b.name='" . $criterion->{'value'} . "'";
|
||||
} elsif ($criterion->{'field'} eq 'locale') {
|
||||
$where .= " AND tr.locale_abbrev='" . $criterion->{'value'} . "'";
|
||||
} elsif ($criterion->{'field'} eq 'product') {
|
||||
$where .= " AND pr.name='" . $criterion->{'value'} . "'";
|
||||
} elsif ($criterion->{'field'} eq 'platform') {
|
||||
$where .= " AND p.name='" . $criterion->{'value'} . "'";
|
||||
} elsif ($criterion->{'field'} eq 'test_group') {
|
||||
$where .= " AND tg.name='" . $criterion->{'value'} . "'";
|
||||
} elsif ($criterion->{'field'} eq 'testcase_id') {
|
||||
$where .= " AND tr.testcase_id='" . $criterion->{'value'} . "'";
|
||||
} elsif ($criterion->{'field'} eq 'summary') {
|
||||
$where .= ' AND t.summary LIKE \'%%' . $criterion->{'value'} . '%%\'';
|
||||
} elsif ($criterion->{'field'} eq 'email') {
|
||||
$where .= ' AND u.email LIKE \'%%' . $criterion->{'value'} . '%%\'';
|
||||
} elsif ($criterion->{'field'} eq 'result_status') {
|
||||
$where .= " AND trsl.class_name='" . $criterion->{'value'} . "'";
|
||||
} elsif ($criterion->{'field'} eq 'trusted_only') {
|
||||
if ($from !~ /users u/) {
|
||||
$from .= ", users u";
|
||||
}
|
||||
$where .= " AND u.user_id=tr.user_id AND u.is_admin=1";
|
||||
} elsif ($criterion->{'field'} eq 'start_date') {
|
||||
my $start_timestamp = &Date::Manip::UnixDate(&Date::Manip::ParseDateString($criterion->{'value'}),"%q");
|
||||
if ($start_timestamp !~ /^\d\d\d\d\d\d\d\d\d\d\d\d\d\d$/) {
|
||||
print STDERR "Unable to parse a valid start date from '$criterion->{'value'},' ignoring.\n";
|
||||
} else {
|
||||
$where .= " AND tr.submission_time>=$start_timestamp";
|
||||
}
|
||||
} elsif ($criterion->{'field'} eq 'end_date') {
|
||||
my $end_timestamp = &Date::Manip::UnixDate(&Date::Manip::ParseDateString($criterion->{'value'}),"%q");
|
||||
if ($end_timestamp !~ /^\d\d\d\d\d\d\d\d\d\d\d\d\d\d$/) {
|
||||
print STDERR "Unable to parse a valid end date from '$criterion->{'value'},' ignoring.\n";
|
||||
} else {
|
||||
$where .= " AND tr.submission_time<=$end_timestamp";
|
||||
}
|
||||
} elsif ($criterion->{'field'} eq 'timespan') {
|
||||
next if ($criterion->{'value'} eq 'all');
|
||||
my $day_delta = $criterion->{'value'};
|
||||
my $err;
|
||||
my $timestamp =
|
||||
&Date::Manip::UnixDate(&Date::Manip::DateCalc("now",
|
||||
"$day_delta days",
|
||||
\$err),
|
||||
"%q");
|
||||
$where .= " AND tr.submission_time>=$timestamp";
|
||||
|
||||
} elsif ($criterion->{'field'} eq 'search_field') {
|
||||
($from,$where) = &_processSearchField($criterion,$from,$where);
|
||||
} else {
|
||||
# Skip unknown field
|
||||
}
|
||||
}
|
||||
|
||||
my $order_by = 'ORDER BY ';
|
||||
foreach my $criterion (@$order_by_criteria) {
|
||||
# Skip empty fields.
|
||||
next if (!$criterion or !$criterion->{'field'});
|
||||
|
||||
if ($criterion->{'field'} eq 'created') {
|
||||
$order_by .= "tr.submission_time $criterion->{'direction'},";
|
||||
} elsif ($criterion->{'field'} eq 'product') {
|
||||
$order_by .= "pr.name $criterion->{'direction'},";
|
||||
} elsif ($criterion->{'field'} eq 'platform') {
|
||||
$order_by .= "p.name $criterion->{'direction'},";
|
||||
} elsif ($criterion->{'field'} eq 'test_group') {
|
||||
$order_by .= "tg.name $criterion->{'direction'},";
|
||||
} elsif ($criterion->{'field'} eq 'testcase_id') {
|
||||
$order_by .= "tr.testcase_id $criterion->{'direction'},";
|
||||
} elsif ($criterion->{'field'} eq 'summary') {
|
||||
$order_by .= "t.summary $criterion->{'direction'},";
|
||||
} elsif ($criterion->{'field'} eq 'result_status') {
|
||||
$order_by .= "trsl.class_name $criterion->{'direction'},";
|
||||
} elsif ($criterion->{'field'} eq 'branch') {
|
||||
$order_by .= "b.name $criterion->{'direction'},";
|
||||
} elsif ($criterion->{'field'} eq 'locale') {
|
||||
$order_by .= "tr.locale_abbrev $criterion->{'direction'},";
|
||||
} elsif ($criterion->{'field'} eq 'email') {
|
||||
$order_by .= "u.email $criterion->{'direction'},";
|
||||
} else {
|
||||
# Skip unknown field
|
||||
}
|
||||
}
|
||||
if ($order_by eq 'ORDER BY ') {
|
||||
$order_by .= 'tr.submission_time DESC';
|
||||
} else {
|
||||
chop($order_by);
|
||||
}
|
||||
|
||||
if ($limit_value and $limit_value ne '') {
|
||||
$limit .= "$limit_value";
|
||||
} else {
|
||||
$limit .= "$_num_results_default";
|
||||
}
|
||||
|
||||
my $sql = "$select $from $where $order_by $limit";
|
||||
#print $sql,"<br/>\n";
|
||||
Litmus::DB::Testresult->set_sql(TestResults => qq{
|
||||
$sql
|
||||
});
|
||||
|
||||
my @rows = $self->search_TestResults();
|
||||
|
||||
return \@rows;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
# &_processSearchField(\%\$\$)
|
||||
#
|
||||
#########################################################################
|
||||
sub _processSearchField(\%) {
|
||||
my ($search_field,$from,$where) = @_;
|
||||
|
||||
my $table_field = "";
|
||||
if ($search_field->{'search_field'} eq 'build_id') {
|
||||
$table_field='tr.build_id';
|
||||
} elsif ($search_field->{'search_field'} eq 'comments') {
|
||||
$table_field='c.comment';
|
||||
} elsif ($search_field->{'search_field'} eq 'locale') {
|
||||
$table_field='tr.locale_abbrev';
|
||||
} elsif ($search_field->{'search_field'} eq 'opsys') {
|
||||
$table_field='o.name';
|
||||
} elsif ($search_field->{'search_field'} eq 'platform') {
|
||||
$table_field='p.name';
|
||||
} elsif ($search_field->{'search_field'} eq 'product') {
|
||||
$table_field='pr.name';
|
||||
} elsif ($search_field->{'search_field'} eq 'result_status') {
|
||||
$table_field='trsl.name';
|
||||
} elsif ($search_field->{'search_field'} eq 'subgroup') {
|
||||
$table_field='sg.name';
|
||||
} elsif ($search_field->{'search_field'} eq 'email') {
|
||||
if ($from !~ /users u/) {
|
||||
$from .= ", users u";
|
||||
$where .= " AND tr.user_id=u.user_id";
|
||||
}
|
||||
$table_field='u.email';
|
||||
} elsif ($search_field->{'search_field'} eq 'summary') {
|
||||
$table_field='t.summary';
|
||||
} elsif ($search_field->{'search_field'} eq 'test_group') {
|
||||
$table_field='tg.name';
|
||||
} elsif ($search_field->{'search_field'} eq 'user_agent') {
|
||||
$table_field='tr.user_agent';
|
||||
} else {
|
||||
return ($from,$where);
|
||||
}
|
||||
|
||||
if ($search_field->{'match_criteria'} eq 'contains_all' or
|
||||
$search_field->{'match_criteria'} eq 'contains_any' or
|
||||
$search_field->{'match_criteria'} eq 'not_contain_any') {
|
||||
|
||||
my $join = "";
|
||||
if ($search_field->{'match_criteria'} eq 'contains_all') {
|
||||
$join = 'AND';
|
||||
} else {
|
||||
$join = 'OR';
|
||||
}
|
||||
|
||||
my @words = split(/ /,$search_field->{'value'});
|
||||
if ($search_field->{'match_criteria'} eq 'not_contain_any') {
|
||||
$where .= " AND NOT (";
|
||||
} else {
|
||||
$where .= " AND (";
|
||||
}
|
||||
my $first_pass = 1;
|
||||
foreach my $word (@words) {
|
||||
if ( $first_pass ) {
|
||||
$where .= "UPPER($table_field) LIKE UPPER('%%" . $word . "%%')";
|
||||
$first_pass = 0;
|
||||
} else {
|
||||
$where .= " $join UPPER($table_field) LIKE UPPER('%%" . $word . "%%')";
|
||||
}
|
||||
}
|
||||
$where .= ")";
|
||||
} elsif ($search_field->{'match_criteria'} eq 'contains') {
|
||||
$where .= " AND UPPER($table_field) LIKE UPPER('%%" . $search_field->{'value'} . "%%')";
|
||||
} elsif ($search_field->{'match_criteria'} eq 'contains_case') {
|
||||
$where .= " AND $table_field LIKE '%%" . $search_field->{'value'} . "%%'";
|
||||
} elsif ($search_field->{'match_criteria'} eq 'not_contain') {
|
||||
$where .= " AND UPPER($table_field) NOT LIKE UPPER('%%" . $search_field->{'value'} . "%%')";
|
||||
} elsif ($search_field->{'match_criteria'} eq 'regexp') {
|
||||
$where .= " AND $table_field REGEXP '" . $search_field->{'value'} . "'";
|
||||
} elsif ($search_field->{'match_criteria'} eq 'not_regexp') {
|
||||
$where .= " AND $table_field NOT REGEXP '" . $search_field->{'value'} . "'";
|
||||
} else {
|
||||
# Ignore unknown match criteria.
|
||||
return ($from,$where);
|
||||
}
|
||||
|
||||
return ($from,$where);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
#########################################################################
|
||||
sub getCommonResults($$) {
|
||||
my ($self,$status,$limit_value) = @_;
|
||||
|
||||
if (!$status) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
if (!$limit_value) {
|
||||
$limit_value = $_num_results_default;
|
||||
}
|
||||
|
||||
my @rows = $self->search_CommonResults($status);
|
||||
return \@rows;
|
||||
}
|
||||
|
||||
1;
|
||||
119
mozilla/webtools/litmus/Litmus/DB/User.pm
Executable file
@@ -0,0 +1,119 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DB::User;
|
||||
|
||||
use strict;
|
||||
use Litmus::Config;
|
||||
use base 'Litmus::DBI';
|
||||
|
||||
Litmus::DB::User->table('users');
|
||||
|
||||
Litmus::DB::User->columns(All => qw/user_id bugzilla_uid email password realname irc_nickname enabled is_admin authtoken/);
|
||||
|
||||
Litmus::DB::User->column_alias("is_trusted", "istrusted");
|
||||
Litmus::DB::User->column_alias("is_admin", "is_trusted");
|
||||
|
||||
Litmus::DB::User->has_many(test_results => "Litmus::DB::Testresult");
|
||||
Litmus::DB::User->has_many(sessions => "Litmus::DB::Session");
|
||||
|
||||
# ZLL: only load BugzillaUser if Bugzilla Auth is actually enabled
|
||||
if ($Litmus::Config::bugzilla_auth_enabled) {
|
||||
Litmus::DB::User->has_a(bugzilla_uid => "Litmus::DB::BugzillaUser");
|
||||
}
|
||||
|
||||
__PACKAGE__->set_sql(RetrieveAll => qq{
|
||||
SELECT __ESSENTIAL__
|
||||
FROM __TABLE__
|
||||
ORDER BY email ASC
|
||||
});
|
||||
|
||||
__PACKAGE__->set_sql(TopTesters => qq{
|
||||
SELECT users.user_id, users.email, count(*) AS num_results
|
||||
FROM users, test_results
|
||||
WHERE users.user_id=test_results.user_id
|
||||
GROUP BY user_id
|
||||
ORDER BY num_results DESC
|
||||
LIMIT 15
|
||||
});
|
||||
|
||||
# the COLLATE latin1_general_ci sillyness forces a case-insensitive match
|
||||
# removed a LIMIT 300 to work around a mysql bug in the ancient version
|
||||
# on rodan
|
||||
__PACKAGE__->set_sql(FullTextMatches => q{
|
||||
SELECT *
|
||||
FROM __TABLE__
|
||||
WHERE
|
||||
email COLLATE latin1_general_ci like concat('%%',?,'%%') OR
|
||||
irc_nickname COLLATE latin1_general_ci like concat('%%',?,'%%') OR
|
||||
realname COLLATE latin1_general_ci like concat('%%',?,'%%')
|
||||
ORDER BY email ASC
|
||||
});
|
||||
|
||||
|
||||
|
||||
#########################################################################
|
||||
# returns the crypt'd password from a linked Bugzilla account if it
|
||||
# exists or the Litmus user account
|
||||
sub getRealPasswd {
|
||||
my $self = shift;
|
||||
if ($self->bugzilla_uid()) {
|
||||
return $self->bugzilla_uid()->cryptpassword();
|
||||
} else {
|
||||
return $self->password();
|
||||
}
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getDisplayName() {
|
||||
my $self = shift;
|
||||
|
||||
return $self->irc_nickname if ($self->irc_nickname and
|
||||
$self->irc_nickname ne '');
|
||||
return $self->realname if ($self->realname and
|
||||
$self->realname ne '');
|
||||
|
||||
if ($self->email and
|
||||
$self->email ne '') {
|
||||
my $display_name = $self->email;
|
||||
$display_name =~ s/\@.*$//g;
|
||||
return $display_name
|
||||
}
|
||||
|
||||
return undef;
|
||||
}
|
||||
|
||||
|
||||
1;
|
||||
|
||||
|
||||
|
||||
130
mozilla/webtools/litmus/Litmus/DBI.pm
Executable file
@@ -0,0 +1,130 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::DBI;
|
||||
|
||||
require Apache::DBI;
|
||||
use strict;
|
||||
use warnings;
|
||||
use Litmus::Config;
|
||||
use Memoize;
|
||||
|
||||
use base 'Class::DBI::mysql';
|
||||
|
||||
our $dsn = "dbi:mysql:database=$Litmus::Config::db_name;host=$Litmus::Config::db_host;port=3306";
|
||||
|
||||
|
||||
|
||||
our %column_aliases;
|
||||
|
||||
Litmus::DBI->connection( $dsn,
|
||||
$Litmus::Config::db_user,
|
||||
$Litmus::Config::db_pass,
|
||||
{AutoCommit=>1}
|
||||
);
|
||||
Litmus::DBI->autoupdate(1);
|
||||
|
||||
# In some cases, we have column names that make sense from a database perspective
|
||||
# (i.e. subgroup_id), but that don't make sense from a class/object perspective
|
||||
# (where subgroup would be more appropriate). To handle this, we allow for
|
||||
# Litmus::DBI's subclasses to set column aliases with the column_alias() sub.
|
||||
# Takes the database column name and the alias name.
|
||||
sub column_alias {
|
||||
my ($self, $db_name, $alias_name) = @_;
|
||||
|
||||
$column_aliases{$alias_name} = $db_name;
|
||||
}
|
||||
|
||||
# here's where the actual work happens. We consult our alias list
|
||||
# (as created by calls to column_alias()) and substitute the
|
||||
# database column if we find a match
|
||||
memoize('find_column');
|
||||
sub find_column {
|
||||
my $self = shift;
|
||||
my $wanted = shift;
|
||||
|
||||
if (ref $self) {
|
||||
$wanted =~ s/^.*::(\w+)$/$1/;
|
||||
}
|
||||
if ($column_aliases{$wanted}) {
|
||||
return $column_aliases{$wanted};
|
||||
} else {
|
||||
# not an alias, so we use the normal
|
||||
# find_column() from Class::DBI
|
||||
$self->SUPER::find_column($wanted);
|
||||
}
|
||||
}
|
||||
|
||||
sub AUTOLOAD {
|
||||
my $self = shift;
|
||||
my @args = @_;
|
||||
my $name = our $AUTOLOAD;
|
||||
|
||||
my $col = $self->find_column($name);
|
||||
if (!$col) {
|
||||
internalError("tried to call Litmus::DBI method $name which does not exist");
|
||||
}
|
||||
|
||||
return $self->$col(@args);
|
||||
}
|
||||
|
||||
sub _croak {
|
||||
my ($self, $message, %info) = @_;
|
||||
internalError($message);
|
||||
return;
|
||||
}
|
||||
|
||||
# Get Class::DBI's default dbh options
|
||||
my $db_options = { __PACKAGE__->_default_attributes };
|
||||
|
||||
__PACKAGE__->_remember_handle('Main'); # so dbi_commit works
|
||||
|
||||
# override default to avoid using Ima::DBI closure
|
||||
sub db_Main {
|
||||
my $dbh;
|
||||
if ( $ENV{'MOD_PERL'} and !$Apache::ServerStarting ) {
|
||||
$dbh = Apache->request()->pnotes('dbh');
|
||||
}
|
||||
if ( !$dbh ) {
|
||||
$dbh = DBI->connect(
|
||||
$dsn, $Litmus::Config::db_user,
|
||||
$Litmus::Config::db_pass, $db_options
|
||||
);
|
||||
if ( $ENV{'MOD_PERL'} and !$Apache::ServerStarting ) {
|
||||
Apache->request()->pnotes( 'dbh', $dbh );
|
||||
}
|
||||
}
|
||||
return $dbh;
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
275
mozilla/webtools/litmus/Litmus/DBTools.pm
Executable file
@@ -0,0 +1,275 @@
|
||||
# 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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
|
||||
# Utility functions (based on those from Bugzilla's checksetup.pl to
|
||||
# create new fields and indicies to the schema when upgrading an installation.
|
||||
|
||||
package Litmus::DBTools;
|
||||
|
||||
use strict;
|
||||
|
||||
#########################################################################
|
||||
sub new {
|
||||
my ($class, $dbh) = @_;
|
||||
my $self = {};
|
||||
$self->{'dbh'} = $dbh;
|
||||
bless($self);
|
||||
return $self;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub ChangeFieldType {
|
||||
my ($self, $table, $field, $newtype) = @_;
|
||||
|
||||
my $ref = $self->GetFieldDef($table, $field);
|
||||
#print "0: $$ref[0] 1: $$ref[1] 2: $$ref[2] 3: $$ref[3] 4: $$ref[4]\n";
|
||||
|
||||
my $oldtype = $ref->[1];
|
||||
if (! $ref->[2]) {
|
||||
$oldtype .= qq{ not null};
|
||||
}
|
||||
if ($ref->[4]) {
|
||||
$oldtype .= qq{ default "$ref->[4]"};
|
||||
}
|
||||
|
||||
if ($oldtype ne $newtype) {
|
||||
print "Updating field type $field in table $table ...\n";
|
||||
print "old: $oldtype\n";
|
||||
print "new: $newtype\n";
|
||||
# 'not null' should be passed as part of the call to ChangeFieldType()
|
||||
# $newtype .= " NOT NULL" if $$ref[3];
|
||||
$self->{'dbh'}->do("ALTER TABLE $table
|
||||
CHANGE $field
|
||||
$field $newtype");
|
||||
}
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub RenameTable {
|
||||
my ($self, $table, $newname) = @_;
|
||||
|
||||
my $ref = $self->TableExists($table);
|
||||
return unless $ref; # already renamed?
|
||||
|
||||
$self->{'dbh'}->do("ALTER TABLE $table
|
||||
RENAME TO $newname");
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub RenameField {
|
||||
my ($self, $table, $field, $newname) = @_;
|
||||
|
||||
my $ref = $self->GetFieldDef($table, $field);
|
||||
return unless $ref; # already fixed?
|
||||
#print "0: $$ref[0] 1: $$ref[1] 2: $$ref[2] 3: $$ref[3] 4: $$ref[4]\n";
|
||||
|
||||
if ($$ref[1] ne $newname) {
|
||||
print "Updating field $field in table $table ...\n";
|
||||
my $type = $$ref[1];
|
||||
$type .= " NOT NULL" if !$$ref[2];
|
||||
$type .= " auto_increment" if $$ref[5] =~ /auto_increment/;
|
||||
$self->{'dbh'}->do("ALTER TABLE $table
|
||||
CHANGE $field
|
||||
$newname $type");
|
||||
}
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub AddField {
|
||||
my ($self, $table, $field, $definition) = @_;
|
||||
|
||||
my $ref = $self->GetFieldDef($table, $field);
|
||||
return if $ref; # already added?
|
||||
|
||||
print "Adding new field $field to table $table ...\n";
|
||||
$self->{'dbh'}->do("ALTER TABLE $table
|
||||
ADD COLUMN $field $definition");
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub AddKey {
|
||||
my ($self, $table, $field, $definition) = @_;
|
||||
|
||||
my $ref = $self->GetIndexDef($table, $field);
|
||||
return if $ref; # already added?
|
||||
|
||||
print "Adding new key $field to table $table ...\n";
|
||||
$self->{'dbh'}->do("ALTER TABLE $table
|
||||
ADD KEY $field $definition");
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub AddUniqueKey {
|
||||
my ($self, $table, $field, $definition) = @_;
|
||||
|
||||
my $ref = $self->GetIndexDef($table, $field);
|
||||
return if $ref; # already added?
|
||||
|
||||
print "Adding new key $field to table $table ...\n";
|
||||
$self->{'dbh'}->do("ALTER TABLE $table
|
||||
ADD UNIQUE KEY $field $definition");
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub AddFullText {
|
||||
my ($self, $table, $index, $definition) = @_;
|
||||
|
||||
my $ref = $self->GetIndexDef($table, $index);
|
||||
return if $ref; # already added?
|
||||
|
||||
print "Adding new fulltext $index to table $table ...\n";
|
||||
$self->{'dbh'}->do("ALTER TABLE $table
|
||||
ADD FULLTEXT $index $definition");
|
||||
}
|
||||
|
||||
|
||||
#########################################################################
|
||||
sub DropField {
|
||||
my ($self, $table, $field) = @_;
|
||||
|
||||
my $ref = $self->GetFieldDef($table, $field);
|
||||
return unless $ref; # already dropped?
|
||||
|
||||
print "Deleting unused field $field from table $table ...\n";
|
||||
$self->{'dbh'}->do("ALTER TABLE $table
|
||||
DROP COLUMN $field");
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub DropTable {
|
||||
my ($self, $table, $field) = @_;
|
||||
|
||||
my $ref = $self->TableExists($table);
|
||||
return unless $ref; # already dropped?
|
||||
|
||||
print "Deleting unused table $table ...\n";
|
||||
$self->{'dbh'}->do("DROP TABLE $table");
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
# this uses a mysql specific command.
|
||||
sub TableExists {
|
||||
my ($self, $table) = @_;
|
||||
my @tables;
|
||||
my $dbtable;
|
||||
my $exists = 0;
|
||||
my $sth = $self->{'dbh'}->prepare("SHOW TABLES");
|
||||
$sth->execute;
|
||||
while ( ($dbtable) = $sth->fetchrow_array ) {
|
||||
if ($dbtable eq $table) {
|
||||
$exists = 1;
|
||||
}
|
||||
}
|
||||
$sth->finish;
|
||||
return $exists;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub GetFieldDef {
|
||||
my ($self, $table, $field) = @_;
|
||||
my $sth = $self->{'dbh'}->prepare("SHOW COLUMNS FROM $table");
|
||||
$sth->execute;
|
||||
|
||||
while (my $ref = $sth->fetchrow_arrayref) {
|
||||
next if $$ref[0] ne $field;
|
||||
$sth->finish;
|
||||
return $ref;
|
||||
}
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub GetIndexDef {
|
||||
my ($self, $table, $field) = @_;
|
||||
my $sth = $self->{'dbh'}->prepare("SHOW INDEX FROM $table");
|
||||
$sth->execute;
|
||||
|
||||
while (my $ref = $sth->fetchrow_arrayref) {
|
||||
next if $$ref[2] ne $field;
|
||||
$sth->finish;
|
||||
return $ref;
|
||||
}
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub CountIndexes {
|
||||
my ($self, $table) = @_;
|
||||
|
||||
my $sth = $self->{'dbh'}->prepare("SHOW INDEX FROM $table");
|
||||
$sth->execute;
|
||||
|
||||
if ( $sth->rows == -1 ) {
|
||||
$sth->finish;
|
||||
die ("Unexpected response while counting indexes in $table:" .
|
||||
" \$sth->rows == -1");
|
||||
}
|
||||
|
||||
my $rows = $sth->rows;
|
||||
$sth->finish;
|
||||
return ($rows);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub DropIndex {
|
||||
my ($self, $table, $index) = @_;
|
||||
|
||||
my $ref = $self->GetIndexDef($table, $index);
|
||||
return unless $ref; # no matching index?
|
||||
|
||||
print "Removing index $index from table $table ...\n";
|
||||
$self->{'dbh'}->do("ALTER TABLE $table
|
||||
DROP INDEX $index");
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub DropIndexes {
|
||||
my ($self, $table) = @_;
|
||||
my %SEEN;
|
||||
|
||||
# get the list of indexes
|
||||
#
|
||||
my $sth = $self->{'dbh'}->prepare("SHOW INDEX FROM $table");
|
||||
$sth->execute;
|
||||
|
||||
# drop each index
|
||||
#
|
||||
while ( my $ref = $sth->fetchrow_arrayref) {
|
||||
|
||||
# note that some indexes are described by multiple rows in the
|
||||
# index table, so we may have already dropped the index described
|
||||
# in the current row.
|
||||
#
|
||||
next if exists $SEEN{$$ref[2]};
|
||||
|
||||
if ($$ref[2] eq 'PRIMARY') {
|
||||
# The syntax for dropping a PRIMARY KEY is different
|
||||
# from the normal DROP INDEX syntax.
|
||||
$self->{'dbh'}->do("ALTER TABLE $table DROP PRIMARY KEY");
|
||||
}
|
||||
else {
|
||||
$self->{'dbh'}->do("ALTER TABLE $table DROP INDEX $$ref[2]");
|
||||
}
|
||||
$SEEN{$$ref[2]} = 1;
|
||||
|
||||
}
|
||||
$sth->finish;
|
||||
}
|
||||
|
||||
1;
|
||||
84
mozilla/webtools/litmus/Litmus/Error.pm
Executable file
@@ -0,0 +1,84 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
# General error reporting
|
||||
|
||||
package Litmus::Error;
|
||||
|
||||
use strict;
|
||||
|
||||
our @ISA = qw(Exporter);
|
||||
@Litmus::Error::EXPORT = qw(
|
||||
basicError
|
||||
invalidInputError
|
||||
internalError
|
||||
lastDitchError
|
||||
);
|
||||
|
||||
# just a general run of the mill error
|
||||
sub basicError {
|
||||
my $message = shift;
|
||||
_doError($message);
|
||||
exit;
|
||||
}
|
||||
|
||||
# used to alert the user when an unexpected input value is found
|
||||
sub invalidInputError($) {
|
||||
my $message = shift;
|
||||
_doError("Invalid Input - $message");
|
||||
exit;
|
||||
}
|
||||
|
||||
sub internalError($) {
|
||||
my $message = shift;
|
||||
_doError("Litmus has suffered an internal error - $message");
|
||||
exit;
|
||||
}
|
||||
|
||||
# an error type that does not use a template error message. Used if we
|
||||
# can't even process the error template.
|
||||
sub lastDitchError($) {
|
||||
my $message = shift;
|
||||
print "Error - Litmus has suffered a serious fatal internal error - $message";
|
||||
exit;
|
||||
}
|
||||
|
||||
sub _doError($) {
|
||||
my $message = shift;
|
||||
my $vars = {
|
||||
message => $message,
|
||||
};
|
||||
Litmus->template()->process("error/error.html.tmpl", $vars) ||
|
||||
lastDitchError(Litmus->template()->error());
|
||||
}
|
||||
|
||||
1;
|
||||
342
mozilla/webtools/litmus/Litmus/FormWidget.pm
Executable file
@@ -0,0 +1,342 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::FormWidget;
|
||||
use strict;
|
||||
|
||||
BEGIN {
|
||||
use Exporter ();
|
||||
use vars qw ($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
|
||||
$VERSION = 0.01;
|
||||
@ISA = qw (Exporter);
|
||||
#Give a hoot don't pollute, do not export more than needed by default
|
||||
@EXPORT = qw ( getProducts );
|
||||
@EXPORT_OK = qw ();
|
||||
%EXPORT_TAGS = ();
|
||||
}
|
||||
|
||||
use DBI;
|
||||
use Litmus::DBI;
|
||||
|
||||
our $_dbh = Litmus::DBI->db_Main();
|
||||
|
||||
#########################################################################
|
||||
=head1 NAME
|
||||
|
||||
Litmus::FormWidget - Create value lists to be used in HTML forms
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use Litmus::FormWidget
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Litmus::FormWidget creates value lists to be used in HTML forms.
|
||||
|
||||
=head1 USAGE
|
||||
|
||||
|
||||
=head1 BUGS
|
||||
|
||||
|
||||
|
||||
=head1 SUPPORT
|
||||
|
||||
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Chris Cooper
|
||||
CPAN ID: CCOOPER
|
||||
Mozilla Corporation
|
||||
ccooper@deadsquid.com
|
||||
http://litmus.mozilla.org/
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
perl(1).
|
||||
|
||||
=cut
|
||||
|
||||
#########################################################################
|
||||
|
||||
#sub new
|
||||
#{
|
||||
# my ($class, %parameters) = @_;
|
||||
# my $self = bless ({}, ref ($class) || $class);
|
||||
# return ($self);
|
||||
#}
|
||||
|
||||
#########################################################################
|
||||
|
||||
=head2 getProducts
|
||||
|
||||
Usage : How to use this function/method
|
||||
Purpose : What it does
|
||||
Returns : What it returns
|
||||
Argument : What it wants to know
|
||||
Throws : Exceptions and other anomolies
|
||||
Comments : This is a sample subroutine header.
|
||||
: It is polite to include more pod and fewer comments.
|
||||
|
||||
See Also :
|
||||
|
||||
=cut
|
||||
|
||||
#########################################################################
|
||||
sub getProducts()
|
||||
{
|
||||
my $sql = "SELECT name, product_id FROM products ORDER BY name";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getUniquePlatforms()
|
||||
{
|
||||
my $sql = "SELECT DISTINCT(name), platform_id FROM platforms ORDER BY name";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getPlatforms()
|
||||
{
|
||||
my $sql = "SELECT platform_id, name from platforms ORDER BY name ASC";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getBranches()
|
||||
{
|
||||
my $sql = "SELECT name, branch_id FROM branches ORDER BY name ASC";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getUniqueBranches()
|
||||
{
|
||||
my $sql = "SELECT DISTINCT(name) FROM branches ORDER BY name ASC";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getOpsyses()
|
||||
{
|
||||
my $sql = "SELECT name, opsys_id FROM opsyses ORDER BY name ASC";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getUniqueOpsyses()
|
||||
{
|
||||
my $sql = "SELECT DISTINCT(name) FROM opsyses ORDER BY name ASC";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getLogTypes()
|
||||
{
|
||||
my $sql = "SELECT DISTINCT(name) FROM log_type_lookup ORDER BY name";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getTestStatuses()
|
||||
{
|
||||
my @TestStatuses = ({name => 'Enabled'},
|
||||
{name => 'Disabled'});
|
||||
return \@TestStatuses;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getResultStatuses()
|
||||
{
|
||||
my $sql = "SELECT result_status_id,class_name FROM test_result_status_lookup ORDER BY result_status_id";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getTestcaseIDs()
|
||||
{
|
||||
my $sql = "SELECT testcase_id FROM testcases ORDER BY testcase_id";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getTestcases()
|
||||
{
|
||||
my $sql = "SELECT testcase_id, summary, product_id FROM testcases ORDER BY testcase_id";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getSubgroups()
|
||||
{
|
||||
my $sql = "SELECT subgroup_id, name, product_id FROM subgroups ORDER BY name, subgroup_id";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getTestgroups()
|
||||
{
|
||||
my $sql = "SELECT testgroup_id, name, product_id FROM testgroups ORDER BY name, testgroup_id";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
|
||||
#########################################################################
|
||||
sub getLocales()
|
||||
{
|
||||
my @locales = Litmus::DB::Locale->retrieve_all();
|
||||
return \@locales;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getUsers()
|
||||
{
|
||||
my @users = Litmus::DB::User->retrieve_all();
|
||||
return \@users;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getAuthors()
|
||||
{
|
||||
my $sql = "SELECT user_id, email FROM users WHERE is_admin=1 ORDER BY email";
|
||||
return _getValues($sql);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#########################################################################
|
||||
sub getFields()
|
||||
{
|
||||
my @fields = (
|
||||
{ name => 'build_id',
|
||||
display_string => "Build ID", },
|
||||
{ name => 'comment',
|
||||
display_string => "Comments", },
|
||||
{ name => 'locale',
|
||||
display_string => "Locale", },
|
||||
{ name => 'opsys',
|
||||
display_string => "Operating System", },
|
||||
{ name => 'platform',
|
||||
display_string => "Platform", },
|
||||
{ name => 'product',
|
||||
display_string => "Product", },
|
||||
{ name => 'result_status',
|
||||
display_string => "Result Status", },
|
||||
{ name => 'subgroup',
|
||||
display_string => "Subgroup", },
|
||||
{ name => 'email',
|
||||
display_string => "Submitted By", },
|
||||
{ name => 'summary',
|
||||
display_string => "Summary", },
|
||||
{ name => 'testgroup',
|
||||
display_string => "Testgroup", },
|
||||
{ name => 'user_agent',
|
||||
display_string => "User Agent", },
|
||||
);
|
||||
return \@fields;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getMatchCriteria()
|
||||
{
|
||||
my @match_criteria = (
|
||||
{ name => "contains_all",
|
||||
display_string => "contains all of the words/strings" },
|
||||
{ name => "contains_any",
|
||||
display_string => "contains any of the words/strings" },
|
||||
{ name => "contains",
|
||||
display_string => "contains the word/string" },
|
||||
{ name => "contains_case",
|
||||
display_string => "contains the word/string (exact case)" },
|
||||
{ name => "not_contain",
|
||||
display_string => "does not contains the word/string" },
|
||||
{ name => "not_contain_any",
|
||||
display_string => "does not contains any of the words/string" },
|
||||
{ name => "regexp",
|
||||
display_string => "matches the regexp" },
|
||||
{ name => "not_regexp",
|
||||
display_string => "does not match the regexp" },
|
||||
);
|
||||
return \@match_criteria;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub getSortFields()
|
||||
{
|
||||
my @sort_fields = (
|
||||
{ name => "branch",
|
||||
display_string => "Branch"},
|
||||
{ name => "created",
|
||||
display_string => "Date"},
|
||||
{ name => "locale",
|
||||
display_string => "Locale"},
|
||||
{ name => "platform",
|
||||
display_string => "Platform"},
|
||||
{ name => "product",
|
||||
display_string => "Product"},
|
||||
{ name => "email",
|
||||
display_string => "Submitted By"},
|
||||
{ name => "summary",
|
||||
display_string => "Summary"},
|
||||
{ name => "result_status",
|
||||
display_string => "Status"},
|
||||
{ name => "testcase_id",
|
||||
display_string => "Testcase ID#"},
|
||||
{ name => "testgroup",
|
||||
display_string => "Testgroup"},
|
||||
);
|
||||
return \@sort_fields;
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
sub _getValues($)
|
||||
{
|
||||
my ($sql) = @_;
|
||||
my $sth = $_dbh->prepare_cached($sql);
|
||||
$sth->execute();
|
||||
my @rows;
|
||||
while (my $data = $sth->fetchrow_hashref) {
|
||||
push @rows, $data;
|
||||
}
|
||||
return \@rows;
|
||||
$sth->finish();
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
43
mozilla/webtools/litmus/Litmus/StripScripts.pm
Executable file
@@ -0,0 +1,43 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::StripScripts;
|
||||
use base qw(HTML::StripScripts::Parser);
|
||||
|
||||
# Override broken href validation code.
|
||||
sub validate_href_attribute {
|
||||
my ($self, $text) = @_;
|
||||
|
||||
$self->SUPER::validate_href_attribute or $text =~ m<^((https?|ftp|mailto)://[\w\-\.]{1,100}(?:\:\d{1,5})?(?:/(?:[\w\-.!~*|;:/?=+\$\,%#]|&){0,100})?)$>x ? $1 : undef;
|
||||
}
|
||||
|
||||
1;
|
||||
263
mozilla/webtools/litmus/Litmus/SysConfig.pm
Executable file
@@ -0,0 +1,263 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::SysConfig;
|
||||
|
||||
use strict;
|
||||
|
||||
require Exporter;
|
||||
use Litmus;
|
||||
use Litmus::DB::Locale;
|
||||
use Litmus::DB::Product;
|
||||
use Litmus::Error;
|
||||
use Litmus::Utils;
|
||||
use CGI;
|
||||
|
||||
our @ISA = qw(Exporter);
|
||||
our @EXPORT = qw();
|
||||
|
||||
my $configcookiename = $Litmus::Config::sysconfig_cookiename;
|
||||
|
||||
sub new {
|
||||
my ($class, $product, $platform, $opsys, $branch, $build_id, $locale) = @_;
|
||||
|
||||
my $self = {};
|
||||
bless($self);
|
||||
|
||||
$self->{"product"} = $product;
|
||||
$self->{"platform"} = $platform;
|
||||
$self->{"opsys"} = $opsys;
|
||||
$self->{"branch"} = $branch;
|
||||
$self->{"build_id"} = $build_id;
|
||||
$self->{"locale"} = $locale;
|
||||
|
||||
return $self;
|
||||
}
|
||||
|
||||
sub setCookie {
|
||||
my $self = shift;
|
||||
|
||||
my %cookiedata;
|
||||
|
||||
my $c = Litmus->cgi();
|
||||
my $cookie = $c->cookie(
|
||||
-name => $configcookiename.'_'.$self->{"product"}->product_id(),
|
||||
-value => join('|', $self->{"product"}->product_id(), $self->{"platform"}->platform_id(),
|
||||
$self->{"opsys"}->opsys_id(), $self->{"branch"}->branch_id(), $self->{"build_id"}, $self->{"locale"}->abbrev()),
|
||||
-domain => $main::ENV{"HTTP_HOST"},
|
||||
);
|
||||
|
||||
return $cookie;
|
||||
}
|
||||
|
||||
sub getCookie {
|
||||
my $self = shift;
|
||||
my $c = Litmus->cgi();
|
||||
my $product = shift;
|
||||
|
||||
return Litmus::SysConfig->
|
||||
realGetCookie($configcookiename.'_'.$product->product_id());
|
||||
|
||||
}
|
||||
|
||||
# returns sysconfig objects corresponding to all sysconfig cookies the user
|
||||
# has set
|
||||
sub getAllCookies {
|
||||
my $self = shift;
|
||||
my $c = Litmus->cgi();
|
||||
|
||||
my @cookies = ();
|
||||
my @names = $c->cookie();
|
||||
foreach my $cur (@names) {
|
||||
if ($cur =~ /^\Q$configcookiename\E_/) {
|
||||
push(@cookies, Litmus::SysConfig->realGetCookie($cur));
|
||||
}
|
||||
}
|
||||
if (@cookies == 0) { push(@cookies, undef) }
|
||||
return @cookies;
|
||||
}
|
||||
|
||||
sub realGetCookie {
|
||||
my $self = shift;
|
||||
my $cookiename = shift;
|
||||
|
||||
my $c = Litmus->cgi();
|
||||
my $cookie = $c->cookie($cookiename);
|
||||
if (! $cookie) {
|
||||
return;
|
||||
}
|
||||
|
||||
my @sysconfig = split(/\|/, $cookie);
|
||||
|
||||
return new(undef,
|
||||
Litmus::DB::Product->retrieve($sysconfig[0]),
|
||||
Litmus::DB::Platform->retrieve($sysconfig[1]),
|
||||
Litmus::DB::Opsys->retrieve($sysconfig[2]),
|
||||
Litmus::DB::Branch->retrieve($sysconfig[3]),
|
||||
$sysconfig[4],
|
||||
Litmus::DB::Locale->retrieve($sysconfig[5])
|
||||
);
|
||||
}
|
||||
|
||||
sub product() {
|
||||
my $self = shift;
|
||||
|
||||
return $self->{"product"};
|
||||
}
|
||||
|
||||
sub platform() {
|
||||
my $self = shift;
|
||||
|
||||
return $self->{"platform"};
|
||||
}
|
||||
|
||||
sub opsys() {
|
||||
my $self = shift;
|
||||
|
||||
return $self->{"opsys"};
|
||||
}
|
||||
|
||||
sub branch() {
|
||||
my $self = shift;
|
||||
|
||||
return $self->{"branch"};
|
||||
}
|
||||
|
||||
sub build_id() {
|
||||
my $self = shift;
|
||||
|
||||
return $self->{"build_id"};
|
||||
}
|
||||
|
||||
sub locale() {
|
||||
my $self = shift;
|
||||
|
||||
return $self->{"locale"};
|
||||
}
|
||||
|
||||
|
||||
# display the system configuration form
|
||||
# optionally takes the product to configure for
|
||||
# and requires a url to load when done. this
|
||||
# url should call processForm() to
|
||||
# set the sysconfig cookie and do
|
||||
# error handling.
|
||||
# optionaly, pass a CGI object and its
|
||||
# data will be stored in the form so
|
||||
# the receiving script can access it.
|
||||
sub displayForm {
|
||||
my $self = shift;
|
||||
my $product = shift;
|
||||
my $goto = shift;
|
||||
my $c = shift;
|
||||
|
||||
my @products;
|
||||
# if we already know the product, then just send it on:
|
||||
if ($product) {
|
||||
$products[0] = $product;
|
||||
} else {
|
||||
# we need to ask the user for the product then
|
||||
@products = Litmus::DB::Product->retrieve_all();
|
||||
}
|
||||
|
||||
my @locales = Litmus::DB::Locale->retrieve_all(
|
||||
{ order_by => 'abbrev' }
|
||||
);
|
||||
my $vars = {
|
||||
locales => \@locales,
|
||||
products => \@products,
|
||||
ua => Litmus::UserAgentDetect->new(),
|
||||
"goto" => $goto,
|
||||
cgidata => $c,
|
||||
};
|
||||
|
||||
# if the user already has a cookie set for this product, then
|
||||
# load those values as defaults:
|
||||
if ($product && Litmus::SysConfig->getCookie($product)) {
|
||||
my $sysconfig = Litmus::SysConfig->getCookie($product);
|
||||
$vars->{"defaultplatform"} = $sysconfig->platform();
|
||||
$vars->{"defaultopsys"} = $sysconfig->opsys();
|
||||
$vars->{"defaultbranch"} = $sysconfig->branch();
|
||||
$vars->{"defaultlocale"} = $sysconfig->locale();
|
||||
}
|
||||
|
||||
# send a default build id if we have one:
|
||||
my @cookies = Litmus::SysConfig->getAllCookies();
|
||||
if ($cookies[0]) { $vars->{"defaultbuildid"} = $cookies[0]->build_id() }
|
||||
|
||||
my $cookie = Litmus::Auth::getCurrentUser();
|
||||
$vars->{"defaultemail"} = $cookie;
|
||||
$vars->{"show_admin"} = Litmus::Auth::istrusted($cookie);
|
||||
|
||||
$vars->{"title"} = "Run Tests";
|
||||
|
||||
Litmus->template()->process("runtests/sysconfig.html.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
}
|
||||
|
||||
# process a form containing sysconfig information.
|
||||
# takes a CGI object containing param data
|
||||
sub processForm {
|
||||
my $self = shift;
|
||||
my $c = shift;
|
||||
|
||||
my $product = Litmus::DB::Product->retrieve($c->param("product"));
|
||||
my $platform = Litmus::DB::Platform->retrieve($c->param("platform"));
|
||||
my $opsys = Litmus::DB::Opsys->retrieve($c->param("opsys"));
|
||||
my $branch = Litmus::DB::Branch->retrieve($c->param("branch"));
|
||||
my $build_id = $c->param("build_id");
|
||||
my $locale = Litmus::DB::Locale->retrieve($c->param("locale"));
|
||||
|
||||
requireField("product", $product);
|
||||
requireField("platform", $platform);
|
||||
requireField("opsys", $opsys);
|
||||
requireField("branch", $branch);
|
||||
requireField("build_id", $build_id);
|
||||
requireField("locale", $locale);
|
||||
|
||||
# set a cookie with the user's testing details:
|
||||
my $prod = Litmus::DB::Product->retrieve($c->param("product"));
|
||||
my $sysconfig = Litmus::SysConfig->new(
|
||||
$product,
|
||||
$platform,
|
||||
$opsys,
|
||||
$branch,
|
||||
$build_id,
|
||||
$locale
|
||||
);
|
||||
|
||||
return $sysconfig;
|
||||
}
|
||||
1;
|
||||
|
||||
|
||||
|
||||
205
mozilla/webtools/litmus/Litmus/Template.pm
Executable file
@@ -0,0 +1,205 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Bugzilla Bug Tracking System.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Terry Weissman <terry@mozilla.org>
|
||||
# Dan Mosedale <dmose@mozilla.org>
|
||||
# Jacob Steenhagen <jake@bugzilla.org>
|
||||
# Bradley Baetz <bbaetz@student.usyd.edu.au>
|
||||
# Christopher Aillon <christopher@aillon.com>
|
||||
# Tobias Burnus <burnus@net-b.de>
|
||||
# Myk Melez <myk@mozilla.org>
|
||||
# Max Kanat-Alexander <mkanat@bugzilla.org>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
# This is mostly a placeholder. At some point in the future, we might
|
||||
# want to be more like Bugzilla and support multiple languages and
|
||||
# other fine features, so we keep this around now so that adding new
|
||||
# things later won't require changing every source file.
|
||||
|
||||
package Litmus::Template;
|
||||
|
||||
use strict;
|
||||
|
||||
use Litmus::Config;
|
||||
use Litmus::StripScripts;
|
||||
use Text::Markdown;
|
||||
|
||||
use base qw(Template);
|
||||
|
||||
my $template_include_path;
|
||||
|
||||
$Template::Directive::WHILE_MAX = 30000;
|
||||
|
||||
# Returns the path to the templates based on the Accept-Language
|
||||
# settings of the user and of the available languages
|
||||
# If no Accept-Language is present it uses the defined default
|
||||
sub getTemplateIncludePath () {
|
||||
return "templates/en/default";
|
||||
}
|
||||
|
||||
# Constants:
|
||||
my %constants = {};
|
||||
$constants{litmus_version} = $Litmus::Config::version;
|
||||
|
||||
# html tag stripper:
|
||||
my $strip = Litmus::StripScripts->new(
|
||||
{
|
||||
AllowHref => 1,
|
||||
AllowSrc => 1,
|
||||
Context => 'Document'
|
||||
},
|
||||
strict_names => 1,
|
||||
);
|
||||
|
||||
###############################################################################
|
||||
# Templatization Code
|
||||
|
||||
# Use the Toolkit Template's Stash module to add utility pseudo-methods
|
||||
# to template variables.
|
||||
use Template::Stash;
|
||||
|
||||
# Add "contains***" methods to list variables that search for one or more
|
||||
# items in a list and return boolean values representing whether or not
|
||||
# one/all/any item(s) were found.
|
||||
$Template::Stash::LIST_OPS->{ contains } =
|
||||
sub {
|
||||
my ($list, $item) = @_;
|
||||
return grep($_ eq $item, @$list);
|
||||
};
|
||||
|
||||
$Template::Stash::LIST_OPS->{ containsany } =
|
||||
sub {
|
||||
my ($list, $items) = @_;
|
||||
foreach my $item (@$items) {
|
||||
return 1 if grep($_ eq $item, @$list);
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
# Allow us to still get the scalar if we use the list operation ".0" on it
|
||||
$Template::Stash::SCALAR_OPS->{ 0 } =
|
||||
sub {
|
||||
return $_[0];
|
||||
};
|
||||
|
||||
# Add a "substr" method to the Template Toolkit's "scalar" object
|
||||
# that returns a substring of a string.
|
||||
$Template::Stash::SCALAR_OPS->{ substr } =
|
||||
sub {
|
||||
my ($scalar, $offset, $length) = @_;
|
||||
return substr($scalar, $offset, $length);
|
||||
};
|
||||
|
||||
# Add a "truncate" method to the Template Toolkit's "scalar" object
|
||||
# that truncates a string to a certain length.
|
||||
$Template::Stash::SCALAR_OPS->{ truncate } =
|
||||
sub {
|
||||
my ($string, $length, $ellipsis) = @_;
|
||||
$ellipsis ||= "";
|
||||
|
||||
return $string if !$length || length($string) <= $length;
|
||||
|
||||
my $strlen = $length - length($ellipsis);
|
||||
my $newstr = substr($string, 0, $strlen) . $ellipsis;
|
||||
return $newstr;
|
||||
};
|
||||
|
||||
# Create the template object that processes templates and specify
|
||||
# configuration parameters that apply to all templates.
|
||||
sub create {
|
||||
my $class = shift;
|
||||
return $class->new({
|
||||
INCLUDE_PATH => &getTemplateIncludePath,
|
||||
CONSTANTS => \%constants,
|
||||
PRE_PROCESS => "variables.none.tmpl",
|
||||
POST_CHOMP => 1,
|
||||
EVAL_PERL => 1,
|
||||
|
||||
COMPILE_DIR => $Litmus::Config::datadir,
|
||||
|
||||
FILTERS => {
|
||||
# disallow all html in testcase data except for non-evil tags
|
||||
testdata => sub {
|
||||
my ($data) = @_;
|
||||
|
||||
$strip->parse($data);
|
||||
$strip->eof();
|
||||
|
||||
return $strip->filtered_document;
|
||||
},
|
||||
|
||||
# process the text with the markdown text processor
|
||||
markdown => sub {
|
||||
my ($data) = @_;
|
||||
$data = Text::Markdown::markdown($data);
|
||||
return $data;
|
||||
},
|
||||
|
||||
# Returns the text with backslashes, single/double quotes,
|
||||
# and newlines/carriage returns escaped for use in JS strings.
|
||||
# thanks to bugzilla!
|
||||
js => sub {
|
||||
my ($var) = @_;
|
||||
$var =~ s/([\\\'\"\/])/\\$1/g;
|
||||
$var =~ s/\n/\\n/g;
|
||||
$var =~ s/\r/\\r/g;
|
||||
$var =~ s/\@/\\x40/g; # anti-spam for email addresses
|
||||
return $var;
|
||||
},
|
||||
|
||||
# anti-spam filtering of email addresses
|
||||
email => sub {
|
||||
my ($var) = @_;
|
||||
$var =~ s/\@/\@/g;
|
||||
return $var;
|
||||
},
|
||||
|
||||
# dummy filter when we don't actually need to filter anything
|
||||
none => sub {
|
||||
my ($var) = @_;
|
||||
return $var;
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
# override the process() method to sneak defaultemail into all template
|
||||
# variable spaces
|
||||
sub process {
|
||||
my ($self, $template, $vars, $outstream, @opts) = @_;
|
||||
my %vars = %$vars;
|
||||
|
||||
$vars{defaultemail} = $vars{defaultemail} ? $vars{defaultemail} :
|
||||
Litmus->getCurrentUser();
|
||||
|
||||
$vars{show_admin} = Litmus->getCurrentUser() ?
|
||||
Litmus->getCurrentUser()->is_admin() : 0;
|
||||
|
||||
$self->SUPER::process($template, \%vars, $outstream, @opts);
|
||||
}
|
||||
66
mozilla/webtools/litmus/Litmus/Testlist.pm
Normal file
@@ -0,0 +1,66 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::Testlist;
|
||||
|
||||
use strict;
|
||||
|
||||
use base qw(Exporter);
|
||||
@Litmus::Testlist::EXPORT = qw(
|
||||
makeHotlist
|
||||
);
|
||||
|
||||
sub makeHotlist {
|
||||
my $numtests = shift;
|
||||
my $state = shift;
|
||||
my @tests = @_;
|
||||
|
||||
my @potentialtests;
|
||||
foreach my $curtest (@tests) {
|
||||
if ($curtest->isrecent()) {
|
||||
foreach my $curplat ($curtest->subgroup()->testgroup()->product()->platforms()) {
|
||||
my $found;
|
||||
my $curstate = $curtest->state($curplat);
|
||||
if ($curstate && $curstate->resultid() == $state->resultid()) {
|
||||
push(@potentialtests, $curtest);
|
||||
$found++;
|
||||
}
|
||||
if ($found) {next}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@potentialtests = sort{$b->num_recent_results() <=> $a->num_recent_results()}
|
||||
@potentialtests;
|
||||
|
||||
return @potentialtests;
|
||||
}
|
||||
147
mozilla/webtools/litmus/Litmus/UserAgentDetect.pm
Executable file
@@ -0,0 +1,147 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
# Handle detection of system information from the UA string
|
||||
|
||||
package Litmus::UserAgentDetect;
|
||||
|
||||
use strict;
|
||||
|
||||
require Exporter;
|
||||
use Litmus;
|
||||
use Litmus::DB::Platform;
|
||||
use Litmus::DB::Opsys;
|
||||
use Litmus::DB::Branch;
|
||||
|
||||
our @ISA = qw(Exporter);
|
||||
our @EXPORT = qw(detectBuildID);
|
||||
|
||||
# define some SQL queries we will use:
|
||||
Litmus::DB::Platform->set_sql(detectplatform => qq{
|
||||
SELECT p.platform_id
|
||||
FROM platforms p, platform_products pp
|
||||
WHERE
|
||||
? REGEXP detect_regexp AND
|
||||
p.platform_id=pp.platform_id AND
|
||||
pp.product_id LIKE ?
|
||||
});
|
||||
Litmus::DB::Branch->set_sql(detectbranch => qq{
|
||||
SELECT __ESSENTIAL__
|
||||
FROM __TABLE__
|
||||
WHERE
|
||||
? REGEXP detect_regexp AND
|
||||
product_id LIKE ?
|
||||
});
|
||||
|
||||
# constructor. Optionally you can pass a UA string
|
||||
# and it will be used. Otherwise the default is the
|
||||
# current useragent.
|
||||
sub new {
|
||||
my $self = {};
|
||||
my $class = shift;
|
||||
my $ua = shift;
|
||||
|
||||
bless($self);
|
||||
$self->{ua} = $main::ENV{"HTTP_USER_AGENT"};
|
||||
if ($ua) { $self->{ua} = $ua }
|
||||
return $self;
|
||||
}
|
||||
|
||||
# default stringification is to return the ua:
|
||||
use overload
|
||||
'""' => \&ua;
|
||||
|
||||
|
||||
sub ua {
|
||||
my $self = shift;
|
||||
|
||||
# we pad the UA with a space since some of our regexp matches expect
|
||||
# to match things at the end of the string. This is quite possibly
|
||||
# a bug.
|
||||
return $self->{ua}." ";
|
||||
}
|
||||
|
||||
sub build_id {
|
||||
my $self = shift;
|
||||
my $ua = $self->{ua};
|
||||
|
||||
# mozilla products only
|
||||
unless ($ua =~ /Mozilla\/5\.0/) {
|
||||
return undef;
|
||||
}
|
||||
$ua =~ /(200\d*)/;
|
||||
return $1;
|
||||
}
|
||||
|
||||
sub locale {
|
||||
my $self = shift;
|
||||
my $ua = $self->{ua};
|
||||
|
||||
# mozilla products only
|
||||
unless ($ua =~ /Mozilla\/5\.0/) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
# Format (e.g.):
|
||||
# Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5
|
||||
$ua =~ /Mozilla\/5\.0 \([^;]*; [^;]*; [^;]*; ([^;]*); [^;]*\)/;
|
||||
return $1;
|
||||
}
|
||||
|
||||
sub platform {
|
||||
my $self = shift;
|
||||
my $product = shift; # optionally, just lookup for one product
|
||||
|
||||
if (! $product) { $product = '%' }
|
||||
|
||||
my @platforms = Litmus::DB::Platform->search_detectplatform($self->ua, $product);
|
||||
return @platforms;
|
||||
}
|
||||
|
||||
sub branch {
|
||||
my $self = shift;
|
||||
my $product = shift; # optionally, just lookup for one branch
|
||||
|
||||
if (! $product) { $product = '%' }
|
||||
|
||||
my @branches = Litmus::DB::Branch->search_detectbranch($self->ua, $product);
|
||||
return @branches;
|
||||
}
|
||||
|
||||
# from the legacy API before we had an OO interface:
|
||||
sub detectBuildId() {
|
||||
my $self = Litmus::UserAgentDetect->new($main::ENV{"HTTP_USER_AGENT"});
|
||||
|
||||
return $self->build_id();
|
||||
}
|
||||
|
||||
1;
|
||||
61
mozilla/webtools/litmus/Litmus/Utils.pm
Executable file
@@ -0,0 +1,61 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
# General utility functions
|
||||
|
||||
package Litmus::Utils;
|
||||
|
||||
use strict;
|
||||
|
||||
use Litmus;
|
||||
use Litmus::Error;
|
||||
use CGI;
|
||||
|
||||
our @ISA = qw(Exporter);
|
||||
@Litmus::Utils::EXPORT = qw(
|
||||
requireField
|
||||
);
|
||||
|
||||
|
||||
# requireField - checks that $field contains data (other than ---) and throws
|
||||
# an invalidInputError if it does not.
|
||||
sub requireField {
|
||||
my ($fieldname, $field) = @_;
|
||||
|
||||
unless($field && $field ne "---") {
|
||||
my $c = Litmus->cgi();
|
||||
print $c->header();
|
||||
invalidInputError("You must make a valid selection for field ".$fieldname.".");
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
||||
419
mozilla/webtools/litmus/Litmus/XML.pm
Executable file
@@ -0,0 +1,419 @@
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
=head1 COPYRIGHT
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
=cut
|
||||
|
||||
package Litmus::XML;
|
||||
|
||||
# Litmus XML Interface
|
||||
# For further details, see the web services specification at
|
||||
# http://wiki.mozilla.org/Litmus:Web_Services
|
||||
|
||||
use strict;
|
||||
|
||||
use XML::XPath;
|
||||
use XML::XPath::XMLParser;
|
||||
|
||||
use Litmus::DB::User;
|
||||
use Litmus::UserAgentDetect;
|
||||
use Date::Manip;
|
||||
|
||||
use CGI::Carp qw(set_message fatalsToBrowser);
|
||||
|
||||
# if we die for some reason, make sure we give a fatal error per spec
|
||||
BEGIN {
|
||||
set_message(sub {
|
||||
print "Fatal error: internal server error\n";
|
||||
});
|
||||
}
|
||||
|
||||
no warnings;
|
||||
no diagnostics;
|
||||
|
||||
sub new {
|
||||
my $self = {};
|
||||
bless($self);
|
||||
return $self;
|
||||
}
|
||||
|
||||
# process XML test result data as described by
|
||||
# the spec at http://wiki.mozilla.org/Litmus:Web_Services
|
||||
sub processResults {
|
||||
my $self = shift;
|
||||
my $data = shift;
|
||||
|
||||
$self->parseResultFile($data) ? 1 : return 0;
|
||||
|
||||
unless ($self->authenticate()) { return 0} # login failure
|
||||
|
||||
$self->validateResults() ? 1 : return 0;
|
||||
|
||||
# at this point, everything is valid, so if we're just validating the
|
||||
# results, we can return an ok:
|
||||
if ($self->{'action'} eq 'validate') {
|
||||
unless ($self->{'response'}) { $self->respOk() }
|
||||
return 1;
|
||||
}
|
||||
|
||||
# add so-called 'global logs' that apply to all the results
|
||||
# we save them in @globallogs so we can map them to the results later
|
||||
my @globallogs;
|
||||
foreach my $log (@{$self->{'logs'}}) {
|
||||
# the submission time is the timestamp of the first testresult:
|
||||
my $newlog = Litmus::DB::Log->create({
|
||||
submission_time => $self->{'results'}->[0]->{'timestamp'},
|
||||
log_type => $log->{'type'},
|
||||
log_text => $log->{'data'},
|
||||
});
|
||||
push(@globallogs, $newlog);
|
||||
}
|
||||
|
||||
# now actually add the new results to the db:
|
||||
foreach my $result (@{$self->{'results'}}) {
|
||||
my $newres = Litmus::DB::Testresult->create({
|
||||
testcase => $result->{'testid'},
|
||||
user_agent => new Litmus::UserAgentDetect($self->{'useragent'}),
|
||||
user => $self->{'user'},
|
||||
opsys => $self->{'sysconfig'}->{'opsys'},
|
||||
branch => $self->{'sysconfig'}->{'branch'},
|
||||
locale => $self->{'sysconfig'}->{'locale'},
|
||||
build_id => $self->{'sysconfig'}->{'buildid'},
|
||||
machine_name => $self->{'machinename'},
|
||||
result_status => $result->{'resultstatus'},
|
||||
timestamp => $result->{'timestamp'},
|
||||
exit_status => $result->{'exitstatus'},
|
||||
duration_ms => $result->{'duration'},
|
||||
valid => 1,
|
||||
isAutomated => $result->{'isAutomated'},
|
||||
});
|
||||
|
||||
if (!$newres) { $self->respErrResult($result->{'testid'}); next; }
|
||||
|
||||
# add any bug ids:
|
||||
foreach my $bug (@{$result->{'bugs'}}) {
|
||||
my $newbug = Litmus::DB::Resultbug->create({
|
||||
test_result_id => $newres,
|
||||
bug_id => $bug,
|
||||
submission_time => $result->{'timestamp'},
|
||||
user => $self->{'user'},
|
||||
});
|
||||
}
|
||||
|
||||
# add any comments:
|
||||
foreach my $comment (@{$result->{'comments'}}) {
|
||||
my $newcomment = Litmus::DB::Comment->create({
|
||||
test_result => $newres,
|
||||
submission_time => $result->{'timestamp'},
|
||||
user => $self->{'user'},
|
||||
comment => $comment,
|
||||
});
|
||||
}
|
||||
|
||||
# add logs:
|
||||
my @resultlogs;
|
||||
push(@resultlogs, @globallogs); # all results get the global logs
|
||||
foreach my $log (@{$result->{'logs'}}) {
|
||||
my $newlog = Litmus::DB::Log->create({
|
||||
submission_time => $result->{'timestamp'},
|
||||
log_type => $log->{'type'},
|
||||
log_text => $log->{'data'},
|
||||
});
|
||||
push(@resultlogs, $newlog);
|
||||
}
|
||||
|
||||
# now we map the logs to the current result:
|
||||
foreach my $log (@resultlogs) {
|
||||
Litmus::DB::LogTestresult->create({
|
||||
test_result => $newres,
|
||||
log_id => $log,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
unless ($self->{'response'}) { $self->respOk() }
|
||||
|
||||
#$self->{'response'} = $self->{'results'}->[0]->{'resultstatus'};
|
||||
|
||||
}
|
||||
|
||||
sub parseResultFile {
|
||||
my $self = shift;
|
||||
my $data = shift;
|
||||
my $x = XML::XPath->new(xml => $data, standalone => 1);
|
||||
$self->{'useragent'} = $x->findvalue('/litmusresults/@useragent');
|
||||
$self->{'machinename'} = $x->findvalue('litmusresults/@machinename');
|
||||
$self->{'action'} = $x->findvalue('/litmusresults/@action');
|
||||
$self->{'user'}->{'username'} = $x->findvalue(
|
||||
'/litmusresults/testresults/@username');
|
||||
$self->{'user'}->{'token'} = $x->findvalue(
|
||||
'/litmusresults/testresults/@authtoken');
|
||||
|
||||
$self->{'sysconfig'}->{'product'} = $x->findvalue('/litmusresults/testresults/@product');
|
||||
$self->{'sysconfig'}->{'platform'} = $x->findvalue('/litmusresults/testresults/@platform');
|
||||
$self->{'sysconfig'}->{'opsys'} = $x->findvalue('/litmusresults/testresults/@opsys');
|
||||
$self->{'sysconfig'}->{'branch'} = $x->findvalue('/litmusresults/testresults/@branch');
|
||||
$self->{'sysconfig'}->{'buildid'} = $x->findvalue('/litmusresults/testresults/@buildid');
|
||||
$self->{'sysconfig'}->{'locale'} = $x->findvalue('/litmusresults/testresults/@locale');
|
||||
|
||||
my @glogs = $x->find('/litmusresults/testresults/log')->get_nodelist();
|
||||
my $l_ct = 0;
|
||||
foreach my $log (@glogs) {
|
||||
my $type = $x->findvalue('@logtype', $log);
|
||||
my $logdata = stripWhitespace($log->string_value());
|
||||
$self->{'logs'}->[$l_ct]->{'type'} = $type;
|
||||
$self->{'logs'}->[$l_ct]->{'data'} = $logdata;
|
||||
$l_ct++;
|
||||
}
|
||||
|
||||
my @results = $x->find('/litmusresults/testresults/result')->get_nodelist();
|
||||
my $c = 0;
|
||||
foreach my $result (@results) {
|
||||
$self->{'results'}->[$c]->{'testid'} = $x->findvalue('@testid', $result);
|
||||
$self->{'results'}->[$c]->{'isAutomated'} = $x->findvalue('@is_automated_result', $result);
|
||||
$self->{'results'}->[$c]->{'resultstatus'} = $x->findvalue('@resultstatus', $result);
|
||||
$self->{'results'}->[$c]->{'exitstatus'} = $x->findvalue('@exitstatus', $result);
|
||||
$self->{'results'}->[$c]->{'duration'} = $x->findvalue('@duration', $result);
|
||||
$self->{'results'}->[$c]->{'timestamp'} =
|
||||
&Date::Manip::UnixDate($x->findvalue('@timestamp', $result), "%q");
|
||||
|
||||
|
||||
my @comments = $x->find('comment', $result)->get_nodelist();
|
||||
my $com_ct = 0;
|
||||
foreach my $comment (@comments) {
|
||||
$comment = stripWhitespace($comment->string_value());
|
||||
$self->{'results'}->[$c]->{'comments'}->[$com_ct] = $comment;
|
||||
$com_ct++;
|
||||
}
|
||||
|
||||
my @bugs = $x->find('bugnumber', $result)->get_nodelist();
|
||||
my $bug_ct = 0;
|
||||
foreach my $bug (@bugs) {
|
||||
$bug = stripWhitespace($bug->string_value());
|
||||
$self->{'results'}->[$c]->{'bugs'}->[$bug_ct];
|
||||
$bug_ct++;
|
||||
}
|
||||
|
||||
my @logs = $x->find('log', $result)->get_nodelist();
|
||||
my $log_ct = 0;
|
||||
foreach my $log (@logs) {
|
||||
my $type = $x->findvalue('@logtype', $log);
|
||||
my $logdata = stripWhitespace($log->string_value());
|
||||
$self->{'results'}->[$c]->{'logs'}->[$log_ct]->{'type'} = $type;
|
||||
$self->{'results'}->[$c]->{'logs'}->[$log_ct]->{'data'} = $logdata;
|
||||
$log_ct++;
|
||||
}
|
||||
$c++;
|
||||
}
|
||||
|
||||
$self->{'x'} = $x;
|
||||
}
|
||||
|
||||
# validate the result data, and resolve references to various tables
|
||||
# the correct objects, looking up id numbers as needed
|
||||
sub validateResults {
|
||||
my $self = shift;
|
||||
|
||||
my $action = $self->{'action'};
|
||||
if ($action ne 'submit' && $action ne 'validate') {
|
||||
$self->respErrFatal("Action must be either 'submit' or 'validate'");
|
||||
return 0;
|
||||
}
|
||||
|
||||
my @users = Litmus::DB::User->search(email => $self->{'user'}->{'username'});
|
||||
$self->{'user'} = $users[0];
|
||||
|
||||
|
||||
unless ($self->{'useragent'}) {
|
||||
$self->respErrFatal("You must specify a useragent");
|
||||
return 0;
|
||||
}
|
||||
|
||||
my @prods = Litmus::DB::Product->search(name => $self->{'sysconfig'}->{'product'});
|
||||
unless ($prods[0]) {
|
||||
$self->respErrFatal("Invalid product: ".$self->{'sysconfig'}->{'product'});
|
||||
return 0;
|
||||
}
|
||||
$self->{'sysconfig'}->{'product'} = $prods[0];
|
||||
|
||||
my @platforms = Litmus::DB::Platform->search_ByProductAndName(
|
||||
$self->{'sysconfig'}->{'product'},
|
||||
$self->{'sysconfig'}->{'platform'});
|
||||
unless ($platforms[0]) {
|
||||
$self->respErrFatal("Invalid platform: ".$self->{'sysconfig'}->{'platform'});
|
||||
return 0;
|
||||
}
|
||||
$self->{'sysconfig'}->{'platform'} = $platforms[0];
|
||||
|
||||
my @opsyses = Litmus::DB::Opsys->search(
|
||||
name => $self->{'sysconfig'}->{'opsys'},
|
||||
platform => $self->{'sysconfig'}->{'platform'});
|
||||
unless ($opsyses[0]) {
|
||||
$self->respErrFatal("Invalid opsys: ".$self->{'sysconfig'}->{'opsys'});
|
||||
return 0;
|
||||
}
|
||||
$self->{'sysconfig'}->{'opsys'} = $opsyses[0];
|
||||
|
||||
my @branches = Litmus::DB::Branch->search(
|
||||
name => $self->{'sysconfig'}->{'branch'},
|
||||
product => $self->{'sysconfig'}->{'product'});
|
||||
unless ($branches[0]) {
|
||||
$self->respErrFatal("Invalid branch: ".$self->{'sysconfig'}->{'branch'});
|
||||
return 0;
|
||||
}
|
||||
$self->{'sysconfig'}->{'branch'} = $branches[0];
|
||||
|
||||
unless ($self->{'sysconfig'}->{'buildid'}) {
|
||||
$self->respErrFatal("Invalid build id: ".$self->{'sysconfig'}->{'buildid'});
|
||||
return 0;
|
||||
}
|
||||
|
||||
my @locales = Litmus::DB::Locale->search(
|
||||
locale => $self->{'sysconfig'}->{'locale'});
|
||||
unless ($locales[0]) {
|
||||
$self->respErrFatal("Invalid locale: ".$self->{'sysconfig'}->{'locale'});
|
||||
return 0;
|
||||
}
|
||||
$self->{'sysconfig'}->{'locale'} = $locales[0];
|
||||
|
||||
foreach my $log (@{$self->{'logs'}}) {
|
||||
my @types = Litmus::DB::LogType->search(name => $log->{'type'});
|
||||
unless ($types[0]) {
|
||||
$self->respErrFatal("Invalid log type: ".$log->{'type'});
|
||||
return 0;
|
||||
}
|
||||
$log->{'type'} = $types[0];
|
||||
}
|
||||
|
||||
foreach my $result (@{$self->{'results'}}) {
|
||||
my @tests = Litmus::DB::Testcase->search(
|
||||
test_id => $result->{'testid'});
|
||||
unless ($tests[0]) {
|
||||
$self->respErrResult('unknown', "Invalid test id");
|
||||
next;
|
||||
}
|
||||
$result->{'testid'} = $tests[0];
|
||||
|
||||
# assume it's an automated test result if not specified
|
||||
($result->{'isAutomated'} eq '0' || $result->{'isAutomated'} ne undef) ?
|
||||
$result->{'isAutomated'} = 0 : $result->{'isAutomated'} = 1;
|
||||
|
||||
my @results = Litmus::DB::ResultStatus->search(
|
||||
name => $result->{'resultstatus'});
|
||||
unless ($results[0]) {
|
||||
$self->respErrResult($result->{'testid'}, "Invalid resultstatus");
|
||||
next;
|
||||
}
|
||||
$result->{'resultstatus'} = $results[0];
|
||||
|
||||
my @es = Litmus::DB::ExitStatus->search(
|
||||
name => $result->{'exitstatus'});
|
||||
unless ($es[0]) {
|
||||
$self->respErrResult($result->{'testid'}, "Invalid exitstatus");
|
||||
next;
|
||||
}
|
||||
$result->{'exitstatus'} = $es[0];
|
||||
|
||||
# if there's no duration, then it's just 0:
|
||||
unless ($result->{'duration'}) {
|
||||
$result->{'duration'} = 0;
|
||||
}
|
||||
|
||||
# if there's no timestamp, then it's now:
|
||||
unless ($result->{'timestamp'}) {
|
||||
$result->{'timestamp'} = &Date::Manip::UnixDate("now","%q");
|
||||
}
|
||||
|
||||
foreach my $log (@{$result->{'logs'}}) {
|
||||
my @types = Litmus::DB::LogType->search(name => $log->{'type'});
|
||||
unless ($types[0]) {
|
||||
$self->respErrResult($result->{'testid'},
|
||||
"Invalid log type: ".$log->{'type'});
|
||||
next;
|
||||
}
|
||||
$log->{'type'} = $types[0];
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub response {
|
||||
my $self = shift;
|
||||
return $self->{'response'};
|
||||
}
|
||||
|
||||
|
||||
# ONLY NON-PUBLIC API BELOW THIS POINT
|
||||
|
||||
sub authenticate {
|
||||
my $self = shift;
|
||||
|
||||
my @users = Litmus::DB::User->search(email => $self->{'user'}->{'username'});
|
||||
my $user = $users[0];
|
||||
|
||||
unless ($user) { $self->respErrFatal("User does not exist"); return 0 }
|
||||
|
||||
unless ($user->enabled()) { $self->respErrFatal("User disabled"); return 0 }
|
||||
|
||||
if ($user->authtoken() ne $self->{'user'}->{'token'}) {
|
||||
respErrFatal("Invalid authentication token for user ".
|
||||
$self->{'user'}->{'username'});
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
sub respOk {
|
||||
my $self = shift;
|
||||
$self->{'response'} = 'ok';
|
||||
}
|
||||
|
||||
sub respErrFatal {
|
||||
my $self = shift;
|
||||
my $error = shift;
|
||||
$self->{'response'} = "Fatal error: $error\n";
|
||||
}
|
||||
|
||||
sub respErrResult {
|
||||
my $self = shift;
|
||||
my $testid = shift;
|
||||
my $error = shift;
|
||||
$self->{'response'} .= "Error processing result for test $testid: $error\n";
|
||||
}
|
||||
|
||||
# remove leading and trailing whitespace from logs and comments
|
||||
sub stripWhitespace {
|
||||
my $txt = shift;
|
||||
$txt =~ s/^\s+//;
|
||||
$txt =~ s/\s+$//;
|
||||
return $txt;
|
||||
}
|
||||
|
||||
|
||||
|
||||
1;
|
||||
56
mozilla/webtools/litmus/Makefile
Executable file
@@ -0,0 +1,56 @@
|
||||
# Litmus Makefile
|
||||
|
||||
PERL=perl
|
||||
|
||||
install: templates
|
||||
$(PERL) populatedb.pl
|
||||
|
||||
# precompile all templates with the Template Toolkit
|
||||
# to speed things up a good bit.
|
||||
# This ought to be done in a more "makelike" way, but
|
||||
# various difficulties prevent that unless we use a configure
|
||||
# script to generate the Makefile, at which point we could have
|
||||
# been done already...
|
||||
|
||||
%.tmpl:
|
||||
$(PERL) -e " \
|
||||
eval('use CGI qw(-no_debug)'); \
|
||||
use Litmus::Template;use diagnostics; \
|
||||
\$$template = Litmus::Template->create(); \
|
||||
\$$template->context()->template('$@'); \
|
||||
"
|
||||
|
||||
templates: index.html.tmpl
|
||||
$(PERL) -e " \
|
||||
use File::Find; \
|
||||
find({ wanted => sub { \
|
||||
\$$name = \$$File::Find::name; \
|
||||
return if (-d \$$name); \
|
||||
return if (\$$name =~ /\/CVS\//); \
|
||||
return if (\$$name !~ /\.tmpl\$$/); \
|
||||
\$$name =~ s/templates\/en\/default\///; \
|
||||
if (-M 'templates/en/default/'.\$$name < -M 'data/templates/en/default/'.\$$name \
|
||||
|| ! -e 'data/templates/en/default/'.\$$name \
|
||||
|| -M 'Litmus/Template.pm' < -M 'data/templates/en/default/'.\$$name) { \
|
||||
system("make", "\$$name"); \
|
||||
} \
|
||||
}, no_chdir => 1 }, 'templates/en/default'); \
|
||||
"
|
||||
|
||||
# tags: generate ctags style hints for ease of editing
|
||||
# requires Exuberant Ctags to be installed (http://ctags.sf.net/)
|
||||
ctags:
|
||||
`which ctags` --excmd=number --tag-relative=no --fields=+a+m+n+S -R `pwd`
|
||||
|
||||
tags: ctags
|
||||
|
||||
test:
|
||||
$(PERL) runtests.pl
|
||||
|
||||
cache:
|
||||
$(PERL) -MLitmus -MLitmus::Cache -e "Litmus::Cache::rebuildCache();"
|
||||
@echo "Done";
|
||||
|
||||
clean:
|
||||
rm -rf data
|
||||
make install
|
||||
47
mozilla/webtools/litmus/README
Executable file
@@ -0,0 +1,47 @@
|
||||
===Litmus===
|
||||
|
||||
If you're reading this, you've downloaded, received, or simply conjured
|
||||
out of thin air, a copy of the Litmus testcase management system.
|
||||
Presumably, you're reading this file because you have some sort of
|
||||
question about Litmus. Hopefully, if we've done our job right, this file
|
||||
ought to answer your questions.
|
||||
|
||||
Q: What is Litmus?
|
||||
A: Litmus is a testcase management system. Its goal is to allow users to
|
||||
enter software tests, run them, and view and manage the results. Along
|
||||
the way, users can expect to be able to do queries and reports and have
|
||||
access all the usual features they expect from a first-class web
|
||||
application. The reality may be somewhat different than this goal.
|
||||
Litmus is developed by mozilla.org.
|
||||
|
||||
Q: How do I install this dang thing?
|
||||
A: You probably want the file called INSTALL.
|
||||
|
||||
Q: Where is the real documentation?
|
||||
A: Hahahaha. What is this "documentation" you speak of? You might want
|
||||
to check out the Litmus Wiki, which may or may not contain useful
|
||||
information. See http://wiki.mozilla.org/Litmus.
|
||||
|
||||
Q: What needs to be done?
|
||||
A: See http://wiki.mozilla.org/Litmus:Todo
|
||||
|
||||
Q: How much does it cost?
|
||||
A: Nothing. Litmus is Free Software, licensed under the Mozilla Public
|
||||
License.
|
||||
|
||||
Q: Wait. Isn't "testcase" two words?
|
||||
A: Not here it isn't.
|
||||
|
||||
Q: Waaaaaaah. Why is Litmus written in Perl and not
|
||||
PHP/Python/Java/Objective Pascal/Latin?
|
||||
A: Because I know Perl. Duh. Also because Litmus uses some code from
|
||||
Bugzilla, and it wouldn't be able to do this if it was written in some
|
||||
other language. Camels are also some of the least buggy animals around,
|
||||
as they swat flies away with their tails.
|
||||
|
||||
Q: I'm still confused. You didn't answer my question. I don't know what
|
||||
to do. Help!
|
||||
A: First of all, that's not a question. In any case, your best bet is
|
||||
probably to email Zach Lipton <zach@zachlipton.com>, and if you ask
|
||||
nicely and don't make too much of a pest of yourself, he'd be glad to
|
||||
get you on the right track.
|
||||
246
mozilla/webtools/litmus/advanced_search.cgi
Executable file
@@ -0,0 +1,246 @@
|
||||
#!/usr/bin/perl -w
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
use strict;
|
||||
|
||||
use Litmus;
|
||||
use Litmus::Auth;
|
||||
use Litmus::Error;
|
||||
use Litmus::DB::Testresult;
|
||||
use Litmus::FormWidget;
|
||||
|
||||
use CGI;
|
||||
use Time::Piece::MySQL;
|
||||
|
||||
Litmus->init();
|
||||
my $c = Litmus->cgi();
|
||||
print $c->header();
|
||||
|
||||
|
||||
|
||||
# Hash refs for maintaining state in the search form.
|
||||
my $defaults = undef;
|
||||
my $order_bys = undef;
|
||||
|
||||
my $MAX_SORT_FIELDS = 10;
|
||||
my $MAX_SEARCH_FIELDS = 10;
|
||||
|
||||
my $criteria = "Custom<br/>";
|
||||
my $results;
|
||||
my @where;
|
||||
my @order_by;
|
||||
my $limit;
|
||||
my $where_criteria = "";
|
||||
my $order_by_criteria = "";
|
||||
my $limit_criteria = "";
|
||||
|
||||
if ($c->param) {
|
||||
|
||||
foreach my $param ($c->param) {
|
||||
next if ($c->param($param) eq '');
|
||||
|
||||
if ($param =~ /sort_field(\d+)/) {
|
||||
# We slot sort fields into the @order_by array based on their
|
||||
# field_num. Empty array slots will be ignored when the SQL
|
||||
# is built. We set an upper limit on the number of sort fields
|
||||
# we can handle to prevent abuse.
|
||||
my $field_num = $1;
|
||||
next if ($field_num > $MAX_SORT_FIELDS);
|
||||
my $sort_field = $c->param($param);
|
||||
my $sort_order = 'ASC';
|
||||
if ($c->param("sort_order$field_num")) {
|
||||
$sort_order = $c->param("sort_order$field_num");
|
||||
}
|
||||
$order_by[$field_num] = { field => $sort_field,
|
||||
direction => $sort_order};
|
||||
|
||||
} elsif ($param =~ /search_field(\d+)/) {
|
||||
# We set an upper limit on the number of search fields
|
||||
# we can handle to prevent abuse.
|
||||
my $field_num = $1;
|
||||
next if ($field_num > $MAX_SEARCH_FIELDS);
|
||||
my $search_field = $c->param($param);
|
||||
my $match_criteria = $c->param("match_criteria$field_num");
|
||||
my $value = $c->param("search_value$field_num");
|
||||
push @where, { 'field' => 'search_field',
|
||||
'search_field' => $search_field,
|
||||
'match_criteria' => $match_criteria,
|
||||
'value' => $value};
|
||||
$where_criteria .= "$search_field $match_criteria '$value'<br/>";
|
||||
|
||||
} elsif ($param eq 'start_date') {
|
||||
my $start_date = $c->param($param);
|
||||
$start_date =~ s/[^0-9A-Za-z ]/ /g;
|
||||
my $end_date;
|
||||
# Use 'now' as the default end date.
|
||||
if ($c->param('end_date') and $c->param('end_date') ne '') {
|
||||
$end_date = $c->param('end_date');
|
||||
$end_date =~ s/[^0-9A-Za-z ]/ /g;
|
||||
} else {
|
||||
$end_date = 'Now';
|
||||
}
|
||||
push @where, { field => 'start_date',
|
||||
value => $start_date};
|
||||
push @where, { field => 'end_date',
|
||||
value => $end_date};
|
||||
$where_criteria .= "Date between '$start_date' and '$end_date'<br/>";
|
||||
} elsif ($param eq 'trusted_only') {
|
||||
push @where, {field => 'trusted_only',
|
||||
value => 1};
|
||||
$limit_criteria .= "Display trusted results only<br/>";
|
||||
} elsif ($param eq "limit") {
|
||||
$limit = $c->param($param);
|
||||
next if ($limit == $Litmus::DB::Testresult::_num_results_default);
|
||||
$limit_criteria .= "Limit to $limit results<br/>";
|
||||
} elsif ($param eq 'branch') {
|
||||
my $value = $c->param($param);
|
||||
push @where, {field => $param,
|
||||
value => $value};
|
||||
$where_criteria .= "Branch is \'".$c->param($param)."\'<br/>";
|
||||
$defaults->{branch} = $c->param($param);
|
||||
} elsif ($param eq 'locale') {
|
||||
my $value = $c->param($param);
|
||||
push @where, {field => 'locale',
|
||||
value => $value};
|
||||
$where_criteria .= "Locale is \'".$c->param($param)."\'<br/>";
|
||||
$defaults->{locale} = $c->param($param);
|
||||
} elsif ($param eq 'email') {
|
||||
my $value = $c->param($param);
|
||||
push @where, {field => 'email',
|
||||
value => $value};
|
||||
$where_criteria .= "Submitted By is \'".$c->param($param)."\'<br/>";
|
||||
$defaults->{locale} = $c->param($param);
|
||||
} elsif ($param eq 'product') {
|
||||
my $value = $c->param($param);
|
||||
push @where, {field => $param,
|
||||
value => $value};
|
||||
$where_criteria .= "Product is \'".$c->param($param)."\'<br/>";
|
||||
$defaults->{product} = $c->param($param);
|
||||
} elsif ($param eq 'platform') {
|
||||
my $value = $c->param($param);
|
||||
push @where, {field => $param,
|
||||
value => $value};
|
||||
$where_criteria .= "Platform is \'".$c->param($param)."\'<br/>";
|
||||
$defaults->{platform} = $c->param($param);
|
||||
} elsif ($param eq 'test_group') {
|
||||
my $value = $c->param($param);
|
||||
push @where, {field => $param,
|
||||
value => $value};
|
||||
$where_criteria .= "Test group is \'".$c->param($param)."\'<br/>";
|
||||
$defaults->{test_group} = $c->param($param);
|
||||
} elsif ($param eq 'test_id') {
|
||||
my $value = $c->param($param);
|
||||
push @where, {field => $param,
|
||||
value => $value};
|
||||
$where_criteria .= "Testcase ID# is \'".$c->param($param)."\'<br/>";
|
||||
$defaults->{test_id} = $c->param($param);
|
||||
} elsif ($param eq 'summary') {
|
||||
my $value = $c->param($param);
|
||||
push @where, {field => $param,
|
||||
value => $value};
|
||||
$where_criteria .= "Summary like \'".$c->param($param)."\'<br/>";
|
||||
$defaults->{summary} = $c->param($param);
|
||||
} elsif ($param eq 'result_status') {
|
||||
my $value = $c->param($param);
|
||||
push @where, {field => $param,
|
||||
value => $value};
|
||||
$where_criteria .= "Status is \'".$c->param($param)."\'<br/>";
|
||||
$defaults->{result_status} = $c->param($param);
|
||||
} else {
|
||||
# Skip unknown field
|
||||
}
|
||||
}
|
||||
if ($where_criteria eq '' and
|
||||
scalar(@order_by) == 0 and
|
||||
$limit_criteria eq '') {
|
||||
($criteria,$results) =
|
||||
Litmus::DB::Testresult->getDefaultTestResults;
|
||||
} else {
|
||||
foreach my $order_by_field (@order_by) {
|
||||
next if (!$order_by_field);
|
||||
$order_by_criteria .= "Order by $order_by_field->{field} $order_by_field->{direction}<br/>";
|
||||
}
|
||||
|
||||
$criteria .= $where_criteria . $order_by_criteria . $limit_criteria;
|
||||
$criteria =~ s/_/ /g;
|
||||
$results = Litmus::DB::Testresult->getTestResults(\@where,
|
||||
\@order_by,
|
||||
$limit);
|
||||
}
|
||||
} else {
|
||||
($criteria,$results) =
|
||||
Litmus::DB::Testresult->getDefaultTestResults;
|
||||
}
|
||||
|
||||
# Populate each of our form widgets for select/input.
|
||||
# Set a default value as appropriate.
|
||||
my $products = Litmus::FormWidget->getProducts;
|
||||
my $platforms = Litmus::FormWidget->getUniquePlatforms;
|
||||
my $test_groups = Litmus::FormWidget->getTestgroups;
|
||||
my $testcases = Litmus::FormWidget->getTestcaseIDs;
|
||||
my $result_statuses = Litmus::FormWidget->getResultStatuses;
|
||||
my $branches = Litmus::FormWidget->getBranches;
|
||||
my $locales = Litmus::FormWidget->getLocales;
|
||||
my $users = Litmus::FormWidget->getUsers;
|
||||
|
||||
my $fields = Litmus::FormWidget->getFields;
|
||||
my $match_criteria = Litmus::FormWidget->getMatchCriteria;
|
||||
my $sort_fields = Litmus::FormWidget->getSortFields;
|
||||
|
||||
my $title = 'Advanced Search';
|
||||
|
||||
my $vars = {
|
||||
title => $title,
|
||||
criteria => $criteria,
|
||||
products => $products,
|
||||
platforms => $platforms,
|
||||
test_groups => $test_groups,
|
||||
testcases => $testcases,
|
||||
result_statuses => $result_statuses,
|
||||
branches => $branches,
|
||||
locales => $locales,
|
||||
users => $users,
|
||||
fields => $fields,
|
||||
match_criteria => $match_criteria,
|
||||
sort_fields => $sort_fields,
|
||||
};
|
||||
|
||||
# Only include results if we have them.
|
||||
if ($results and scalar @$results > 0) {
|
||||
$vars->{results} = $results;
|
||||
}
|
||||
|
||||
my $cookie = Litmus::Auth::getCookie();
|
||||
$vars->{"defaultemail"} = $cookie;
|
||||
$vars->{"show_admin"} = Litmus::Auth::istrusted($cookie);
|
||||
|
||||
Litmus->template()->process("reporting/advanced_search.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
|
||||
exit 0;
|
||||
92
mozilla/webtools/litmus/common_results.cgi
Executable file
@@ -0,0 +1,92 @@
|
||||
#!/usr/bin/perl -w
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
use strict;
|
||||
$|++;
|
||||
|
||||
use Litmus;
|
||||
use Litmus::Auth;
|
||||
use Litmus::Error;
|
||||
use Litmus::DB::Testresult;
|
||||
use Litmus::FormWidget;
|
||||
|
||||
|
||||
use CGI;
|
||||
use Time::Piece::MySQL;
|
||||
|
||||
Litmus->init();
|
||||
my $c = Litmus->cgi();
|
||||
print $c->header();
|
||||
|
||||
my $results;
|
||||
if ($c->param and $c->param('status')) {
|
||||
if ($c->param('status') =~ /pass/i or
|
||||
$c->param('status') =~ /fail/i or
|
||||
$c->param('status') =~ /unclear/i) {
|
||||
$results = Litmus::DB::Testresult->getCommonResults($c->param('status'));
|
||||
} else {
|
||||
internalError("You must provide a valid status type: pass|fail|unclear");
|
||||
exit 1;
|
||||
}
|
||||
} else {
|
||||
internalError("You must provide a status type: pass|fail|unclear");
|
||||
exit 1;
|
||||
}
|
||||
|
||||
my $title;
|
||||
if ($c->param('status') eq 'pass') {
|
||||
$title = "Most Commonly Passed Testcases";
|
||||
} elsif ($c->param('status') eq 'fail') {
|
||||
$title = "Most Common Failures";
|
||||
} elsif ($c->param('status') eq 'unclear') {
|
||||
$title = "Testcases Most Frequently Marked As Unclear";
|
||||
}
|
||||
|
||||
my $vars = {
|
||||
title => $title,
|
||||
status => $c->param('status'),
|
||||
};
|
||||
|
||||
# Only include results if we have them.
|
||||
if ($results and scalar @$results > 0) {
|
||||
$vars->{results} = $results;
|
||||
}
|
||||
|
||||
$vars->{"defaultemail"} = Litmus::Auth::getCookie();
|
||||
|
||||
Litmus->template()->process("reporting/common_results.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
|
||||
exit 0;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
BIN
mozilla/webtools/litmus/css/images/body_back.gif
Executable file
|
After Width: | Height: | Size: 791 B |
BIN
mozilla/webtools/litmus/css/images/box-gray-bottom-150.gif
Executable file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
mozilla/webtools/litmus/css/images/box-gray-bottom.gif
Executable file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
mozilla/webtools/litmus/css/images/box-gray-top-150.gif
Executable file
|
After Width: | Height: | Size: 261 B |
BIN
mozilla/webtools/litmus/css/images/box-gray-top.gif
Executable file
|
After Width: | Height: | Size: 249 B |
BIN
mozilla/webtools/litmus/css/images/mozilla-org.gif
Executable file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
mozilla/webtools/litmus/css/images/page-background.gif
Executable file
|
After Width: | Height: | Size: 396 B |
1270
mozilla/webtools/litmus/css/litmus.css
Executable file
105
mozilla/webtools/litmus/edit_users.cgi
Executable file
@@ -0,0 +1,105 @@
|
||||
#!/usr/bin/perl -w
|
||||
# -*- Mode: perl; indent-tabs-mode: nil -*-
|
||||
#
|
||||
# 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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Zach Lipton <zach@zachlipton.com>
|
||||
|
||||
use strict;
|
||||
|
||||
use Litmus;
|
||||
use Litmus::Error;
|
||||
use Litmus::DB::Product;
|
||||
use Litmus::DB::TestcaseSubgroup;
|
||||
use Litmus::Auth;
|
||||
use Litmus::Utils;
|
||||
|
||||
use CGI;
|
||||
use Time::Piece::MySQL;
|
||||
|
||||
Litmus->init();
|
||||
my $c = Litmus->cgi();
|
||||
|
||||
# obviously, you need to be an admin to edit users...
|
||||
Litmus::Auth::requireAdmin('edit_users.cgi');
|
||||
|
||||
if ($c->param('search_string')) {
|
||||
# search for users:
|
||||
my $users = Litmus::DB::User->search_FullTextMatches(
|
||||
$c->param('search_string'),
|
||||
$c->param('search_string'),
|
||||
$c->param('search_string'));
|
||||
my $vars = {
|
||||
users => $users,
|
||||
};
|
||||
print $c->header();
|
||||
Litmus->template()->process("admin/edit_users/search_results.html.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
} elsif ($c->param('id')) {
|
||||
# lookup a given user
|
||||
my $uid = $c->param('id');
|
||||
my $user = Litmus::DB::User->retrieve($uid);
|
||||
print $c->header();
|
||||
if (! $user) {
|
||||
invalidInputError("Invalid user id: $uid");
|
||||
}
|
||||
my $vars = {
|
||||
user => $user,
|
||||
};
|
||||
Litmus->template()->process("admin/edit_users/edit_user.html.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
} elsif ($c->param('user_id')) {
|
||||
# process changes to a user:
|
||||
my $user = Litmus::DB::User->retrieve($c->param('user_id'));
|
||||
print $c->header();
|
||||
if (! $user) {
|
||||
invalidInputError("Invalid user id: " . $c->param('user_id'));
|
||||
}
|
||||
$user->bugzilla_uid($c->param('bugzilla_uid'));
|
||||
$user->email($c->param('edit_email'));
|
||||
|
||||
if ($c->param('edit_password') ne 'unchanged') {
|
||||
# they changed the password, so let the auth folks know:
|
||||
Litmus::Auth::changePassword($user, $c->param('edit_password'));
|
||||
}
|
||||
$user->realname($c->param('realname'));
|
||||
$user->irc_nickname($c->param('irc_nickname'));
|
||||
if ($c->param('enabled')) {
|
||||
$user->enabled(1);
|
||||
}
|
||||
if ($c->param('is_admin')) {
|
||||
$user->is_admin(1);
|
||||
}
|
||||
$user->authtoken($c->param('authtoken'));
|
||||
$user->update();
|
||||
my $vars = {
|
||||
user => $user,
|
||||
};
|
||||
Litmus->template()->process("admin/edit_users/user_edited.html.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
} else {
|
||||
# we're here for the first time, so display the search form
|
||||
my $vars = {
|
||||
};
|
||||
print $c->header();
|
||||
Litmus->template()->process("admin/edit_users/search_users.html.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
}
|
||||
|
||||
|
||||
|
||||
82
mozilla/webtools/litmus/enter_test.cgi
Executable file
@@ -0,0 +1,82 @@
|
||||
#!/usr/bin/perl -w
|
||||
# -*- Mode: perl; indent-tabs-mode: nil -*-
|
||||
#
|
||||
# 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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is Netscape Communications
|
||||
# Corporation. Portions created by Netscape are
|
||||
# Copyright (C) 1998 Netscape Communications Corporation. All
|
||||
# Rights Reserved.
|
||||
#
|
||||
# Contributor(s): Zach Lipton <zach@zachlipton.com>
|
||||
|
||||
use strict;
|
||||
|
||||
use Litmus;
|
||||
use Litmus::Error;
|
||||
use Litmus::DB::Product;
|
||||
use Litmus::DB::TestcaseSubgroup;
|
||||
use Litmus::Auth;
|
||||
use Litmus::Utils;
|
||||
|
||||
use CGI;
|
||||
use Time::Piece::MySQL;
|
||||
use Date::Manip;
|
||||
|
||||
Litmus->init();
|
||||
my $c = Litmus->cgi();
|
||||
|
||||
# for the moment, you must be an admin to enter tests:
|
||||
Litmus::Auth::requireAdmin('enter_test.cgi');
|
||||
|
||||
# if we're here for the first time, display the enter testcase form,
|
||||
# otherwise, process the results:
|
||||
|
||||
if (! $c->param('enteringTestcase')) {
|
||||
my $vars = {
|
||||
|
||||
};
|
||||
|
||||
print $c->header();
|
||||
Litmus->template()->process("enter/enter.html.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
} else {
|
||||
requireField('product', $c->param('product'));
|
||||
requireField('test group', $c->param('testgroup'));
|
||||
requireField('subgroup', $c->param('subgroup'));
|
||||
requireField('summary', $c->param('summary'));
|
||||
|
||||
my $newtest = Litmus::DB::Testcase->create({
|
||||
product => $c->param('product'),
|
||||
summary => $c->param('summary'),
|
||||
steps => $c->param('steps') ? $c->param('steps') : '',
|
||||
expected_results => $c->param('expectedResults') ?
|
||||
$c->param('expectedResults') : '',
|
||||
author => Litmus::Auth::getCurrentUser(),
|
||||
creation_date => &Date::Manip::UnixDate("now","%q"),
|
||||
version => 1,
|
||||
});
|
||||
|
||||
my $newtsg = Litmus::DB::TestcaseSubgroup->create({
|
||||
test => $newtest,
|
||||
subgroup => $c->param('subgroup'),
|
||||
});
|
||||
|
||||
my $vars = {
|
||||
test => $newtest,
|
||||
};
|
||||
|
||||
print $c->header();
|
||||
Litmus->template()->process("enter/enterComplete.html.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
}
|
||||
BIN
mozilla/webtools/litmus/favicon.ico
Executable file
|
After Width: | Height: | Size: 580 B |
BIN
mozilla/webtools/litmus/images/close.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
mozilla/webtools/litmus/images/confirm.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
mozilla/webtools/litmus/images/info.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
mozilla/webtools/litmus/images/loading.gif
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
mozilla/webtools/litmus/images/star1.gif
Normal file
|
After Width: | Height: | Size: 332 B |
BIN
mozilla/webtools/litmus/images/title.png
Executable file
|
After Width: | Height: | Size: 18 KiB |
BIN
mozilla/webtools/litmus/images/warning.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
92
mozilla/webtools/litmus/index.cgi
Executable file
@@ -0,0 +1,92 @@
|
||||
#!/usr/bin/perl -w
|
||||
# -*- mode: cperl; c-basic-offset: 8; indent-tabs-mode: nil; -*-
|
||||
|
||||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# Version: MPL 1.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 Litmus.
|
||||
#
|
||||
# The Initial Developer of the Original Code is
|
||||
# the Mozilla Corporation.
|
||||
# Portions created by the Initial Developer are Copyright (C) 2006
|
||||
# the Initial Developer. All Rights Reserved.
|
||||
#
|
||||
# Contributor(s):
|
||||
# Chris Cooper <ccooper@deadsquid.com>
|
||||
# Zach Lipton <zach@zachlipton.com>
|
||||
#
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
use strict;
|
||||
$|++;
|
||||
|
||||
#use Time::HiRes qw( gettimeofday tv_interval );
|
||||
#my $t0 = [gettimeofday];
|
||||
|
||||
use Litmus;
|
||||
use Litmus::Auth;
|
||||
use Litmus::Error;
|
||||
use Litmus::DB::Testresult;
|
||||
use Litmus::FormWidget;
|
||||
|
||||
use Time::Piece::MySQL;
|
||||
|
||||
|
||||
|
||||
Litmus->init();
|
||||
|
||||
my ($criteria,$results) = Litmus::DB::Testresult->getDefaultTestResults;
|
||||
|
||||
my $products = Litmus::FormWidget->getProducts();
|
||||
my $platforms = Litmus::FormWidget->getUniquePlatforms();
|
||||
my $test_groups = Litmus::FormWidget->getTestgroups();
|
||||
my $result_statuses = Litmus::FormWidget->getResultStatuses;
|
||||
my $branches = Litmus::FormWidget->getBranches();
|
||||
|
||||
my $c = Litmus->cgi();
|
||||
print $c->header();
|
||||
|
||||
my $vars = {
|
||||
title => 'Main Page',
|
||||
products => $products,
|
||||
platforms => $platforms,
|
||||
test_groups => $test_groups,
|
||||
result_statuses => $result_statuses,
|
||||
branches => $branches,
|
||||
limit => $Litmus::DB::Testresult::_num_results_default,
|
||||
};
|
||||
|
||||
# Only include results if we have them.
|
||||
if ($results and scalar @$results > 0) {
|
||||
$vars->{results} = $results;
|
||||
}
|
||||
|
||||
my $user = Litmus::Auth::getCurrentUser();
|
||||
if ($user) {
|
||||
$vars->{"defaultemail"} = $user;
|
||||
$vars->{"show_admin"} = $user->is_admin();
|
||||
}
|
||||
|
||||
Litmus->template()->process("index.tmpl", $vars) ||
|
||||
internalError(Litmus->template()->error());
|
||||
|
||||
#my $elapsed = tv_interval ( $t0 );
|
||||
#printf "<div id='pageload'>Page took %f seconds to load.</div>", $elapsed;
|
||||
|
||||
exit 0;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
4
mozilla/webtools/litmus/js/AdvancedSearch.js
Normal file
@@ -0,0 +1,4 @@
|
||||
function adv_init() {
|
||||
advSearchFormHeight = new fx.Combo('advSearchForm', {opacity: true, height: true, duration: 1000});
|
||||
advSearchFormHeight.toggle();
|
||||
}
|
||||
144
mozilla/webtools/litmus/js/Comments.js
Executable file
@@ -0,0 +1,144 @@
|
||||
var noDHTML = false;
|
||||
if (parseInt(navigator.appVersion) < 4) {
|
||||
window.event = 0;
|
||||
noDHTML = true;
|
||||
} else if (navigator.userAgent.indexOf("MSIE") > 0 ) {
|
||||
noDHTML = true;
|
||||
}
|
||||
if (document.body && document.body.addEventListener) {
|
||||
document.body.addEventListener("click",maybeclosepopup,false);
|
||||
}
|
||||
setTimeout('location.reload()',900000);
|
||||
|
||||
function closepopup() {
|
||||
var p = document.getElementById("popup");
|
||||
if (p && p.parentNode) {
|
||||
p.parentNode.removeChild(p);
|
||||
}
|
||||
}
|
||||
|
||||
function maybeclosepopup(e) {
|
||||
var n = e.target;
|
||||
var close = true;
|
||||
while(close && n && (n != document)) {
|
||||
close = (n.id != "popup") && !(n.tagName && (n.tagName.toLowerCase() == "a"));
|
||||
n = n.parentNode;
|
||||
}
|
||||
if (close) closepopup();
|
||||
}
|
||||
|
||||
function who(d) {
|
||||
if (noDHTML) {
|
||||
return true;
|
||||
}
|
||||
if (typeof document.layers != 'undefined') {
|
||||
var l = document.layers['popup'];
|
||||
l.src = d.target.href;
|
||||
l.top = d.target.y - 6;
|
||||
l.left = d.target.x - 6;
|
||||
if (l.left + l.clipWidth > window.width) {
|
||||
l.left = window.width - l.clipWidth;
|
||||
}
|
||||
l.visibility="show";
|
||||
} else {
|
||||
var t = d.target;
|
||||
while (t.nodeType != 1) {
|
||||
t = t.parentNode;
|
||||
}
|
||||
closepopup()
|
||||
l = document.createElement("iframe");
|
||||
l.setAttribute("src", t.href);
|
||||
l.setAttribute("id", "popup");
|
||||
l.className = "who";
|
||||
t.appendChild(l);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function log_url(report_id) {
|
||||
return "display_report.pl?report_id=" + report_id;
|
||||
}
|
||||
|
||||
function comment(d,commentid,logfile) {
|
||||
if (noDHTML) {
|
||||
document.location = log_url(logfile);
|
||||
return false;
|
||||
}
|
||||
if (typeof document.layers != 'undefined') {
|
||||
var l = document.layers['popup'];
|
||||
l.document.write("<table border=1 cellspacing=1><tr><td>"
|
||||
+ comments[commentid] + "</tr></table>");
|
||||
l.document.close();
|
||||
l.top = d.y-10;
|
||||
var zz = d.x;
|
||||
if (zz + l.clip.right > window.innerWidth) {
|
||||
zz = (window.innerWidth-30) - l.clip.right;
|
||||
if (zz < 0) { zz = 0; }
|
||||
}
|
||||
l.left = zz;
|
||||
l.visibility="show";
|
||||
} else {
|
||||
var t = d.target;
|
||||
while (t.nodeType != 1) {
|
||||
t = t.parentNode;
|
||||
}
|
||||
closepopup()
|
||||
l = document.createElement("div");
|
||||
l.innerHTML = comments[commentid];
|
||||
l.setAttribute("id", "popup");
|
||||
l.style.position = "absolute";
|
||||
l.className = "comment";
|
||||
t.parentNode.parentNode.appendChild(l);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function log(e,buildindex,logfile) {
|
||||
var logurl = log_url(logfile);
|
||||
var commenturl = "add_comment.pl?log=" + buildtree + "/" + logfile;
|
||||
|
||||
if (noDHTML) {
|
||||
document.location = logurl;
|
||||
return false;
|
||||
}
|
||||
if (typeof document.layers != 'undefined') {
|
||||
var q = document.layers["logpopup"];
|
||||
q.top = e.target.y - 6;
|
||||
|
||||
var yy = e.target.x;
|
||||
if ( yy + q.clip.right > window.innerWidth) {
|
||||
yy = (window.innerWidth-30) - q.clip.right;
|
||||
if (yy < 0) { yy = 0; }
|
||||
}
|
||||
q.left = yy;
|
||||
q.visibility="show";
|
||||
q.document.write("<TABLE BORDER=1><TR><TD><B>"
|
||||
+ builds[buildindex] + "</B><BR>"
|
||||
+ "<A HREF=" + logurl + ">View Brief Log</A><BR>"
|
||||
+ "<A HREF=" + logurl + "&fulltext=1"+">View Full Log</A><BR>"
|
||||
+ "<A HREF=" + commenturl + ">Add a Comment</A>"
|
||||
+ "</TD></TR></TABLE>");
|
||||
q.document.close();
|
||||
} else {
|
||||
var t = e.target;
|
||||
while (t.nodeType != 1) {
|
||||
t = t.parentNode;
|
||||
}
|
||||
closepopup();
|
||||
var l = document.createElement("div");
|
||||
l.innerHTML = "<B>" + builds[buildindex] + "</B><BR>"
|
||||
+ "<A HREF=" + logurl + ">View Brief Log</A><BR>"
|
||||
+ "<A HREF=" + logurl + "&fulltext=1"+">View Full Log</A><BR>"
|
||||
+ "<A HREF=" + commenturl + ">Add a Comment</A><BR>";
|
||||
l.setAttribute("id", "popup");
|
||||
l.className = "log";
|
||||
t.parentNode.appendChild(l);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function empty_comparison_text() {
|
||||
if (document.buffalo_search.comparison_text.value == "Enter comparison text") {
|
||||
document.buffalo_search.comparison_text.value = "";
|
||||
}
|
||||
}
|
||||
11
mozilla/webtools/litmus/js/EditCategories.js
Normal file
@@ -0,0 +1,11 @@
|
||||
//the main function, call to the effect object
|
||||
function ec_init(){
|
||||
var myDivs = document.getElementsByClassName("collapsable");
|
||||
var myLinks = document.getElementsByClassName('collapse-link');
|
||||
|
||||
//then we create the effect.
|
||||
var myAccordion = new fx.Accordion(myLinks, myDivs, {opacity: true});
|
||||
myAccordion.fxa[0].toggle();
|
||||
}
|
||||
|
||||
|
||||
71
mozilla/webtools/litmus/js/EditTests.js
Executable file
@@ -0,0 +1,71 @@
|
||||
var editedtests = new Array();
|
||||
var fields = ["product", "summary", "testgroup", "subgroup",
|
||||
"steps", "results", "admin", "formatting"];
|
||||
|
||||
function MM_findObj(n) {
|
||||
var x = document.getElementById(n);
|
||||
return x;
|
||||
}
|
||||
|
||||
function showEdit(testid) {
|
||||
for (var i=0; i<fields.length; i++) {
|
||||
show(getField(fields[i]+"_edit",testid));
|
||||
hide(getField(fields[i]+"_text",testid));
|
||||
}
|
||||
|
||||
hide(getField("editlink", testid));
|
||||
show(getField("canceleditlink", testid));
|
||||
|
||||
document.getElementById("show_test_form").action = "show_test.cgi";
|
||||
|
||||
editedtests.push(testid);
|
||||
}
|
||||
|
||||
function findEdited() {
|
||||
MM_findObj("editingTestcases").value = editedtests.toString();
|
||||
}
|
||||
|
||||
function cancelEdit(testid) {
|
||||
for (var i=0; i<fields.length; i++) {
|
||||
hide(getField(fields[i]+"_edit",testid));
|
||||
show(getField(fields[i]+"_text",testid));
|
||||
}
|
||||
|
||||
show(getField("editlink", testid));
|
||||
hide(getField("canceleditlink", testid));
|
||||
|
||||
// remove testid from the editedtests array:
|
||||
var newarray = new Array();
|
||||
for (var i=0; i<editedtests.length; i++) {
|
||||
if (editedtests[i] != testid) {
|
||||
newarray.push(testid);
|
||||
}
|
||||
}
|
||||
editedtests=newarray;
|
||||
|
||||
document.getElementById("show_test_form").action = "process_test.cgi";
|
||||
}
|
||||
|
||||
// fields are in the format fieldname_testid
|
||||
function getField(fieldname, testid) {
|
||||
return MM_findObj(fieldname+"_"+testid);
|
||||
}
|
||||
|
||||
function show(obj) {
|
||||
if (obj) {
|
||||
obj.style.display = "";
|
||||
}
|
||||
}
|
||||
|
||||
function hide(obj) {
|
||||
if (obj) {
|
||||
obj.style.display = "none";
|
||||
}
|
||||
}
|
||||
|
||||
function tc_init() {
|
||||
if (document.getElementById("testconfig")) {
|
||||
testConfigHeight = new fx.Height('testconfig', {duration: 400});
|
||||
testConfigHeight.toggle();
|
||||
}
|
||||
}
|
||||
228
mozilla/webtools/litmus/js/FormPersist.js
Executable file
@@ -0,0 +1,228 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/*
|
||||
* FormPersist.js derived from CFormData.
|
||||
* See <http://devedge-temp.mozilla.org/toolbox/examples/2003/CFormData/>
|
||||
*/
|
||||
|
||||
/* ***** 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 Netscape code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2003
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s): Bob Clary <bclary@netscape.com>
|
||||
* Bob Clary <http://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 FormInit(/*HTMLFormElement */ aForm, /* String */ aQueryString)
|
||||
{
|
||||
var type;
|
||||
var options;
|
||||
|
||||
if (!aForm)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!aQueryString)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// empty out the form's values.
|
||||
var elements = aForm.elements;
|
||||
|
||||
for (var iElm = 0; iElm < elements.length; iElm++)
|
||||
{
|
||||
var element = elements[iElm];
|
||||
var nodeName = element.nodeName.toLowerCase();
|
||||
|
||||
switch(nodeName)
|
||||
{
|
||||
case 'input':
|
||||
type = element.type.toLowerCase();
|
||||
switch(type)
|
||||
{
|
||||
case 'text':
|
||||
element.value = '';
|
||||
break;
|
||||
case 'radio':
|
||||
case 'checkbox':
|
||||
element.checked = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'textarea':
|
||||
element.value = '';
|
||||
break;
|
||||
case 'select':
|
||||
options = element.options;
|
||||
for (iOpt = 0; iOpt < options.length; iOpt++)
|
||||
{
|
||||
options[iOpt].selected = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// fill in form from the query string
|
||||
|
||||
if (aQueryString.indexOf('?') == 0);
|
||||
{
|
||||
aQueryString = aQueryString.substring(1);
|
||||
}
|
||||
|
||||
aQueryString = decodeURIComponent(aQueryString);
|
||||
aQueryString = aQueryString.replace(/[\&]amp;/g, '&');
|
||||
var parmList = aQueryString.split('&');
|
||||
|
||||
for (var iParm = 0; iParm < parmList.length; iParm++)
|
||||
{
|
||||
var parms = parmList[iParm].split('=');
|
||||
var name = parms[0];
|
||||
var value;
|
||||
|
||||
if (parms.length == 1)
|
||||
{
|
||||
value = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
var tempValue = parms[1];
|
||||
value = tempValue.replace(/\+/g,' ');
|
||||
}
|
||||
|
||||
elements = aForm[name];
|
||||
|
||||
if (!elements) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof elements.nodeName != 'undefined')
|
||||
{
|
||||
elements = [elements];
|
||||
}
|
||||
|
||||
for (iElm = 0; iElm < elements.length; iElm++)
|
||||
{
|
||||
element = elements[iElm];
|
||||
nodeName = element.nodeName.toLowerCase();
|
||||
|
||||
switch(nodeName)
|
||||
{
|
||||
case 'input':
|
||||
type = element.type.toLowerCase();
|
||||
switch(type)
|
||||
{
|
||||
case 'text':
|
||||
element.value = value;
|
||||
break;
|
||||
case 'radio':
|
||||
case 'checkbox':
|
||||
if (element.value == value)
|
||||
{
|
||||
element.checked = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'textarea':
|
||||
element.value = value;
|
||||
break;
|
||||
case 'select':
|
||||
options = element.options;
|
||||
for (iOpt = 0; iOpt < options.length; iOpt++)
|
||||
{
|
||||
if (options[iOpt].value == value)
|
||||
{
|
||||
options[iOpt].selected = true;;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function FormDump(aForm)
|
||||
{
|
||||
var type;
|
||||
var s = '';
|
||||
var elements = aForm.elements;
|
||||
|
||||
for (var iElm = 0; iElm < elements.length; iElm++)
|
||||
{
|
||||
var element = elements[iElm];
|
||||
var nodeName = element.nodeName.toLowerCase();
|
||||
|
||||
switch(nodeName)
|
||||
{
|
||||
case 'input':
|
||||
type = element.type.toLowerCase();
|
||||
switch(type)
|
||||
{
|
||||
case 'text':
|
||||
if (element.value)
|
||||
{
|
||||
s += '&' + element.name + '=' + element.value;
|
||||
}
|
||||
break;
|
||||
case 'radio':
|
||||
case 'checkbox':
|
||||
if (element.checked)
|
||||
{
|
||||
s += '&' + element.name + '=' + element.value;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'textarea':
|
||||
if (element.value)
|
||||
{
|
||||
s += '&' + element.name + '=' + element.value;
|
||||
}
|
||||
break;
|
||||
case 'select':
|
||||
var options = element.options;
|
||||
for (iOpt = 0; iOpt < options.length; iOpt++)
|
||||
{
|
||||
if (options[iOpt].selected)
|
||||
{
|
||||
s += '&' + element.name + '=' + options[iOpt].value;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
s = '?' + encodeURIComponent(s.slice(1));
|
||||
|
||||
return s;
|
||||
};
|
||||
|
||||
469
mozilla/webtools/litmus/js/FormValidation.js
Normal file
@@ -0,0 +1,469 @@
|
||||
var iBugNumber = "This field must be a valid, positive integer (>0). Please re-enter it now.";
|
||||
var iNumber = iBugNumber;
|
||||
var iEmail = "This field must be a valid email address (like foo@bar.com). Please re-enter it now.";
|
||||
var iBuildId = "This field must be a valid build ID, which is a non-zero string of 10 digits. Please follow the 'How do I determine the build ID?' link for more information.";
|
||||
var iPasswordMismatch = "The passwords you entered did not match.";
|
||||
var iPasswordLength = "Your password must be longer than 4 characters.";
|
||||
var defaultEmptyOK = false;
|
||||
var mPrefix = "You did not enter a value into the ";
|
||||
var mSuffix = " field. This is a required field. Please enter it now.";
|
||||
var whitespace = " \t\n\r";
|
||||
|
||||
// Check whether string s is empty.
|
||||
function isEmpty(s)
|
||||
{
|
||||
return ((s == null) || (s.length == 0));
|
||||
}
|
||||
|
||||
// Returns true if string s is empty or
|
||||
// whitespace characters only.
|
||||
function isWhitespace (s)
|
||||
{
|
||||
var i;
|
||||
|
||||
// Is s empty?
|
||||
if (isEmpty(s)) return true;
|
||||
|
||||
// Search through string's characters one by one
|
||||
// until we find a non-whitespace character.
|
||||
// When we do, return false; if we don't, return true.
|
||||
|
||||
for (i = 0; i < s.length; i++) {
|
||||
// Check that current character isn't whitespace.
|
||||
var c = s.charAt(i);
|
||||
|
||||
if (whitespace.indexOf(c) == -1) return false;
|
||||
}
|
||||
|
||||
// All characters are whitespace.
|
||||
return true;
|
||||
}
|
||||
|
||||
// Returns true if character c is a digit
|
||||
// (0 .. 9).
|
||||
function isDigit (c)
|
||||
{
|
||||
return ((c >= "0") && (c <= "9"));
|
||||
}
|
||||
|
||||
// Notify user that required field theField is empty.
|
||||
// String s describes expected contents of theField.value.
|
||||
// Put focus in theField and return false.
|
||||
function warnEmpty (theField, s)
|
||||
{
|
||||
theField.focus();
|
||||
toggleMessage('failure',mPrefix + s + mSuffix);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Notify user that contents of field theField are invalid.
|
||||
// String s describes expected contents of theField.value.
|
||||
// Put select theField, put focus in it, and return false.
|
||||
function warnInvalid (theField, s)
|
||||
{
|
||||
theField.focus();
|
||||
if (!/select/.test(theField.type)) {
|
||||
theField.select();
|
||||
}
|
||||
toggleMessage('failure',s);
|
||||
return false;
|
||||
}
|
||||
|
||||
// isEmail (STRING s [, BOOLEAN emptyOK])
|
||||
//
|
||||
// Email address must be of form a@b.c -- in other words:
|
||||
// * there must be at least one character before the @
|
||||
// * there must be at least one character before and after the .
|
||||
// * the characters @ and . are both required
|
||||
//
|
||||
// For explanation of optional argument emptyOK,
|
||||
// see comments of function isInteger.
|
||||
function isEmail (s)
|
||||
{
|
||||
if (isEmpty(s)) {
|
||||
if (isEmail.arguments.length == 1) {
|
||||
return defaultEmptyOK;
|
||||
} else {
|
||||
return (isEmail.arguments[1] == true);
|
||||
}
|
||||
}
|
||||
|
||||
// is s whitespace?
|
||||
if (isWhitespace(s)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// there must be >= 1 character before @, so we
|
||||
// start looking at character position 1
|
||||
// (i.e. second character)
|
||||
var i = 1;
|
||||
var sLength = s.length;
|
||||
|
||||
// look for @
|
||||
while ((i < sLength) && (s.charAt(i) != "@")) {
|
||||
i++;
|
||||
}
|
||||
|
||||
if ((i >= sLength) || (s.charAt(i) != "@")) {
|
||||
return false;
|
||||
} else {
|
||||
i += 2;
|
||||
}
|
||||
|
||||
// look for .
|
||||
while ((i < sLength) && (s.charAt(i) != ".")) {
|
||||
i++;
|
||||
}
|
||||
|
||||
// there must be at least one character after the .
|
||||
if ((i >= sLength - 1) || (s.charAt(i) != ".")) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// checkString (TEXTFIELD theField, STRING s, [, BOOLEAN emptyOK==false])
|
||||
//
|
||||
// Check that string theField.value is not all whitespace.
|
||||
//
|
||||
// For explanation of optional argument emptyOK,
|
||||
// see comments of function isInteger.
|
||||
function checkString (theField, s, emptyOK)
|
||||
{
|
||||
// Next line is needed on NN3 to avoid "undefined is not a number" error
|
||||
// in equality comparison below.
|
||||
if (checkString.arguments.length == 2) {
|
||||
emptyOK = defaultEmptyOK;
|
||||
}
|
||||
if ((emptyOK == true) && (isEmpty(theField.value))) {
|
||||
return true;
|
||||
}
|
||||
if (isWhitespace(theField.value)) {
|
||||
return warnEmpty(theField, s);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// checkEmail (TEXTFIELD theField [, BOOLEAN emptyOK==false])
|
||||
//
|
||||
// Check that string theField.value is a valid Email.
|
||||
//
|
||||
// For explanation of optional argument emptyOK,
|
||||
// see comments of function isInteger.
|
||||
function checkEmail (theField, emptyOK)
|
||||
{
|
||||
if (checkEmail.arguments.length == 1) {
|
||||
emptyOK = defaultEmptyOK;
|
||||
}
|
||||
|
||||
if ((emptyOK == true) && (isEmpty(theField.value))) {
|
||||
return true;
|
||||
} else {
|
||||
if (!isEmail(theField.value, false)) {
|
||||
return warnInvalid (theField, iEmail);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function comparePasswords(password1, password2)
|
||||
{
|
||||
if (isWhitespace(password1.value)) {
|
||||
return warnEmpty(password1, "Password");
|
||||
}
|
||||
if (isWhitespace(password2.value)) {
|
||||
return warnEmpty(password2, "Confirm Password");
|
||||
}
|
||||
if (password1.value.length < 5) {
|
||||
return warnInvalid (password1, iPasswordLength);
|
||||
}
|
||||
|
||||
if (password1.value != password2.value) {
|
||||
password1.value="";
|
||||
password2.value="";
|
||||
return warnInvalid (password1, iPasswordMismatch);
|
||||
}
|
||||
}
|
||||
|
||||
// checkBuildId (TEXTFIELD theField [, BOOLEAN emptyOK==false])
|
||||
//
|
||||
// Check that string theField.value is a valid build id.
|
||||
//
|
||||
// For explanation of optional argument emptyOK,
|
||||
// see comments of function isInteger.
|
||||
function checkBuildId (theField, emptyOK)
|
||||
{
|
||||
if (checkBuildId.arguments.length == 1) {
|
||||
emptyOK = defaultEmptyOK;
|
||||
}
|
||||
|
||||
if ((emptyOK == true) && (isEmpty(theField.value))) {
|
||||
return true;
|
||||
} else {
|
||||
if (!/^\d{10,10}$/.test(theField.value) || theField.value == '0000000000') {
|
||||
return warnInvalid (theField, iBuildId);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// checkNumber (TEXTFIELD theField [, BOOLEAN emptyOK==false])
|
||||
//
|
||||
// Check that string theField.value is a valid, positive integer.
|
||||
//
|
||||
// For explanation of optional argument emptyOK,
|
||||
// see comments of function isInteger.
|
||||
function checkNumber (theField, emptyOK)
|
||||
{
|
||||
if (checkNumber.arguments.length == 1) {
|
||||
emptyOK = defaultEmptyOK;
|
||||
}
|
||||
|
||||
if (isPositiveInteger(theField.value,emptyOK)) {
|
||||
return true;
|
||||
} else {
|
||||
return warnInvalid (theField, iNumber);
|
||||
}
|
||||
}
|
||||
|
||||
// isInteger (STRING s [, BOOLEAN emptyOK])
|
||||
//
|
||||
// Returns true if all characters in string s are numbers.
|
||||
//
|
||||
// Accepts non-signed integers only. Does not accept floating
|
||||
// point, exponential notation, etc.
|
||||
//
|
||||
// We don't use parseInt because that would accept a string
|
||||
// with trailing non-numeric characters.
|
||||
//
|
||||
// By default, returns defaultEmptyOK if s is empty.
|
||||
// There is an optional second argument called emptyOK.
|
||||
// emptyOK is used to override for a single function call
|
||||
// the default behavior which is specified globally by
|
||||
// defaultEmptyOK.
|
||||
// If emptyOK is false (or any value other than true),
|
||||
// the function will return false if s is empty.
|
||||
// If emptyOK is true, the function will return true if s is empty.
|
||||
//
|
||||
// EXAMPLE FUNCTION CALL: RESULT:
|
||||
// isInteger ("5") true
|
||||
// isInteger ("") defaultEmptyOK
|
||||
// isInteger ("-5") false
|
||||
// isInteger ("", true) true
|
||||
// isInteger ("", false) false
|
||||
// isInteger ("5", false) true
|
||||
function isInteger (s)
|
||||
{
|
||||
var i;
|
||||
|
||||
if (isEmpty(s))
|
||||
if (isInteger.arguments.length == 1) return defaultEmptyOK;
|
||||
else return (isInteger.arguments[1] == true);
|
||||
|
||||
// Search through string's characters one by one
|
||||
// until we find a non-numeric character.
|
||||
// When we do, return false; if we don't, return true.
|
||||
|
||||
for (i = 0; i < s.length; i++)
|
||||
{
|
||||
// Check that current character is number.
|
||||
var c = s.charAt(i);
|
||||
|
||||
if (!isDigit(c)) return false;
|
||||
}
|
||||
|
||||
// All characters are numbers.
|
||||
return true;
|
||||
}
|
||||
|
||||
// isSignedInteger (STRING s [, BOOLEAN emptyOK])
|
||||
//
|
||||
// Returns true if all characters are numbers;
|
||||
// first character is allowed to be + or - as well.
|
||||
//
|
||||
// Does not accept floating point, exponential notation, etc.
|
||||
//
|
||||
// We don't use parseInt because that would accept a string
|
||||
// with trailing non-numeric characters.
|
||||
//
|
||||
// For explanation of optional argument emptyOK,
|
||||
// see comments of function isInteger.
|
||||
//
|
||||
// EXAMPLE FUNCTION CALL: RESULT:
|
||||
// isSignedInteger ("5") true
|
||||
// isSignedInteger ("") defaultEmptyOK
|
||||
// isSignedInteger ("-5") true
|
||||
// isSignedInteger ("+5") true
|
||||
// isSignedInteger ("", false) false
|
||||
// isSignedInteger ("", true) true
|
||||
function isSignedInteger (s)
|
||||
{
|
||||
if (isEmpty(s))
|
||||
if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
|
||||
else return (isSignedInteger.arguments[1] == true);
|
||||
|
||||
else {
|
||||
var startPos = 0;
|
||||
var secondArg = defaultEmptyOK;
|
||||
|
||||
if (isSignedInteger.arguments.length > 1)
|
||||
secondArg = isSignedInteger.arguments[1];
|
||||
|
||||
// skip leading + or -
|
||||
if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
|
||||
startPos = 1;
|
||||
return (isInteger(s.substring(startPos, s.length), secondArg));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// isPositiveInteger (STRING s [, BOOLEAN emptyOK])
|
||||
//
|
||||
// Returns true if string s is an integer > 0.
|
||||
//
|
||||
// For explanation of optional argument emptyOK,
|
||||
// see comments of function isInteger.
|
||||
function isPositiveInteger (s)
|
||||
{
|
||||
var secondArg = defaultEmptyOK;
|
||||
|
||||
if (isPositiveInteger.arguments.length > 1)
|
||||
secondArg = isPositiveInteger.arguments[1];
|
||||
|
||||
// The next line is a bit byzantine. What it means is:
|
||||
// a) s must be a signed integer, AND
|
||||
// b) one of the following must be true:
|
||||
// i) s is empty and we are supposed to return true for
|
||||
// empty strings
|
||||
// ii) this is a positive, not negative, number
|
||||
|
||||
return (isSignedInteger(s, secondArg)
|
||||
&& ( (isEmpty(s) && secondArg) || (parseInt (s) > 0) ) );
|
||||
}
|
||||
|
||||
function verifySelected(theField, fieldName) {
|
||||
if (theField.selectedIndex >= 0 &&
|
||||
theField.options[theField.selectedIndex].value != '' &&
|
||||
theField.options[theField.selectedIndex].value != '---') {
|
||||
return true;
|
||||
} else {
|
||||
return warnInvalid (theField, 'You must select an option for ' + fieldName + '. Please make a selection now.');
|
||||
}
|
||||
}
|
||||
|
||||
function toggleMessage(msgType,msg) {
|
||||
var em = document.getElementById("message");
|
||||
if (toggleMessage.arguments.length < 1) {
|
||||
em.innerHTML="";
|
||||
em.style.display = 'none';
|
||||
return;
|
||||
}
|
||||
|
||||
switch (msgType) {
|
||||
case "loading":
|
||||
if (!msg || msg == '') {
|
||||
msg = 'Loading...';
|
||||
}
|
||||
em.innerHTML = '<div class="loading">'+msg+'</div>';
|
||||
em.style.display = 'block';
|
||||
break;
|
||||
case "info":
|
||||
em.innerHTML = '<div class="info">'+msg+'</div>';
|
||||
em.style.display = 'block';
|
||||
setTimeout('toggleMessage()',5000);
|
||||
break;
|
||||
case "success":
|
||||
em.innerHTML = '<div class="success">'+msg+'</div>';
|
||||
em.style.display = 'block';
|
||||
setTimeout('toggleMessage()',5000);
|
||||
break;
|
||||
case "failure":
|
||||
em.innerHTML = '<div class="failure">'+msg+'</div>';
|
||||
em.style.display = 'block';
|
||||
setTimeout('toggleMessage()',5000);
|
||||
break;
|
||||
case "none":
|
||||
default:
|
||||
em.innerHTML="";
|
||||
em.style.display = 'none';
|
||||
return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function enableForm(formid) {
|
||||
var f = document.getElementById(formid);
|
||||
var ems = f.getElementsByTagName('input');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=false;
|
||||
}
|
||||
ems = f.getElementsByTagName('select');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=false;
|
||||
}
|
||||
ems = f.getElementsByTagName('textarea');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=false;
|
||||
}
|
||||
}
|
||||
|
||||
function disableForm(formid) {
|
||||
var f = document.getElementById(formid);
|
||||
var ems = f.getElementsByTagName('input');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=true;
|
||||
}
|
||||
ems = f.getElementsByTagName('select');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=true;
|
||||
}
|
||||
ems = f.getElementsByTagName('textarea');
|
||||
for (var i in ems) {
|
||||
ems[i].disabled=true;
|
||||
}
|
||||
}
|
||||
|
||||
function changeSelectedValue(selectid, optionvalue) {
|
||||
var em = document.getElementById(selectid)
|
||||
var options = em.getElementsByTagName('option');
|
||||
var found = 0;
|
||||
for (var i=0; i<options.length; i++) {
|
||||
if (options[i].value == optionvalue) {
|
||||
options[i].selected = true;
|
||||
found=1;
|
||||
} else {
|
||||
options[i].selected = false;
|
||||
}
|
||||
}
|
||||
if (found == 0) {
|
||||
options[0].selected = true;
|
||||
}
|
||||
}
|
||||
|
||||
function blankForm(formid) {
|
||||
var f = document.getElementById(formid);
|
||||
var ems = f.getElementsByTagName('input');
|
||||
for (var i in ems) {
|
||||
if (ems[i].type == 'submit' ||
|
||||
ems[i].value == 'Reset' ||
|
||||
ems[i].type == 'radio' ||
|
||||
ems[i].type == 'checkbox' ||
|
||||
ems[i].type == 'button') {
|
||||
continue;
|
||||
}
|
||||
ems[i].value='';
|
||||
ems[i].checked=false;
|
||||
}
|
||||
ems = f.getElementsByTagName('select');
|
||||
for (var i in ems) {
|
||||
ems[i].selectedIndex=0;
|
||||
}
|
||||
ems = f.getElementsByTagName('textarea');
|
||||
for (var i in ems) {
|
||||
ems[i].value='';
|
||||
}
|
||||
}
|
||||
15
mozilla/webtools/litmus/js/Help.js
Normal file
@@ -0,0 +1,15 @@
|
||||
function toggleHelp(helpTitle,helpText) {
|
||||
var em = document.getElementById("help");
|
||||
if (toggleHelp.arguments.length < 1) {
|
||||
em.innerHTML="";
|
||||
em.style.display = 'none';
|
||||
return;
|
||||
}
|
||||
|
||||
var closeLink = '<div class="closeLink"><a name="closeHelp" onClick="toggleHelp();"><img class="chrome" src="images/close.png" />Close Help</a></div>'
|
||||
em.innerHTML = '<div class="container"><div class="title">' + helpTitle + '</div><div class="content">' + helpText + '</div>' + closeLink + '</div>';
|
||||
em.style.display = 'block';
|
||||
}
|
||||
|
||||
|
||||
|
||||
7
mozilla/webtools/litmus/js/License-moo.fx.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
Copyright (c) 2005 Valerio Proietti, http://www.mad4milk.net
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
4802
mozilla/webtools/litmus/js/MochiKit/MochiKit.js
vendored
Executable file
2
mozilla/webtools/litmus/js/MochiKit/__package__.js
Executable file
@@ -0,0 +1,2 @@
|
||||
dojo.hostenv.conditionalLoadModule({"common": ["MochiKit.MochiKit"]});
|
||||
dojo.hostenv.moduleLoaded("MochiKit.*");
|
||||
16
mozilla/webtools/litmus/js/RunTests.js
Executable file
@@ -0,0 +1,16 @@
|
||||
function tc_init() {
|
||||
var divs = document.getElementsByClassName("testcase-content");
|
||||
allStretch = new fx.MultiFadeSize(divs, {height: true, opacity: true, duration: 400});
|
||||
|
||||
allStretch.hideAll();
|
||||
|
||||
testConfigHeight = new fx.Height('testconfig', {duration: 400});
|
||||
testConfigHeight.toggle();
|
||||
|
||||
allStretch.fxa[0].toggle();
|
||||
}
|
||||
|
||||
function confirmPartialSubmission() {
|
||||
msg = "Did you intend to only submit a single test result? (Hint: There is a 'Submit All Results' button at the bottom of the page.)";
|
||||
return confirm(msg);
|
||||
}
|
||||