Remove the buildbot stuff, we'll move away from it.

This commit is contained in:
Mitchell Hashimoto 2012-11-03 13:47:57 -07:00
parent 335d9fad1f
commit 5cf737d4fc
64 changed files with 0 additions and 3344 deletions

View File

@ -1,72 +0,0 @@
# Vagrant Buildbot System
This is the code for the Vagrant buildbot system. [Buildbot](http://buildbot.net)
is a continuous integration system that offers an extreme amount
of flexibility and power.
This directory contains a few subdirectories to setup this CI system:
* `buildbot_config` - This contains the custom Python code to setup the
various parts of the buildbot configuration.
* `master` - This is mostly auto-generated from Buildbot itself, however
the `master.cfg` file is the configuration used on the buildmaster.
* `slave`- This is mostly auto-generated from Buildbot, but the
`buildbot.tac` contains some custom code in it to connect to the Vagrant
buildmaster.
**NOTE:** One of the dependencies for the Vagrant CI system is currently
not public, and as such can't be setup by the general public. This will be
fixed in the next couple weeks.
## Contribute a CI Slave!
**NOTE:** The slave contribution process is still not completely setup and
will be ironed out very soon after the CI system is up and running.
Vagrant is an open source profit which doesn't have any income from support,
services, or otherwise. All Vagrant slave machines are donated by the
community. Donating a machine doesn't require anything more than installing
and running the slave software. Vagrant is specifically looking for slave
machines that provide a diverse set of operating systems and cpu architectures
for testing Vagrant.
## Setting up the Buildmaster
To set up the buildmaster, clone out this directory somewhere and install
the dependencies:
pip install -r requirements.txt
Once the dependencies are installed, create a configuration file with the
settings you want to use somewhere. The settings available for a master are
defined in `buildbot_config/config/master.py`. An example configuration file:
[master]
slaves=foo:password,bar:anotherpassword
web_port=8000
Execute the buildbot using:
BUILDBOT_CONFIG=/path/to/my/config.cfg buildbot start master/
## Setting up a Buildslave
To set up a slave, clone out this directory and install the dependencies:
pip install -r requirements.txt
Then, create a configuration file with the slave settings. The settings
available for a slave are defined in `buildbot_config/config/slave.py`.
An example configuration file:
[slave]
master_host=ci.vagrantup.com
master_port=9989
name=the-love-machine
password=foobarbaz
Note that the password above will be assigned to you as part of donating
any slave machine, since it must be setup on the buildmaster side as well.
Once the configuration is done, run the slave:
BUILDBOT_CONFIG=/path/to/my/config.cfg buildslave start slave/

View File

@ -1,24 +0,0 @@
"""
This module contains the configuration loader for a specific
choices instance. This is used internally to load the settings.
"""
import os
from choices import ConfigFileLoader
def load_settings(choices, type):
"""
This will load the proper settings for the given choices
instance.
:Parameters:
- `choices`: The choices instance to load.
- `type`: The type of configuration, either "master" or
"slave"
"""
if "BUILDBOT_CONFIG" not in os.environ:
raise ValueError, "BUILDBOT_CONFIG must be set to point to where the configuration file is."
choices.add_loader(ConfigFileLoader(os.environ["BUILDBOT_CONFIG"], type))
return choices.load()

View File

@ -1,24 +0,0 @@
"""
This module contains the choices definition for settings required
for the build master to run.
"""
from choices import Choices
from loader import load_settings
#----------------------------------------------------------------------
# Define the Settings
#----------------------------------------------------------------------
c = Choices()
c.define('title', type=str, help="Buildmaster title")
c.define('title_url', type=str, help="URL for title page")
c.define('buildbot_url', type=str, help="URL to the buildbot master.")
c.define('slaves', type=str, help="A list of the slave machines. The format should be name:password,name:password,...")
c.define('web_port', type=int, help="Port to listen on for web service.")
c.define('http_users', type=str, help="username:password list of users.")
#----------------------------------------------------------------------
# Load the Settings
#----------------------------------------------------------------------
options = load_settings(c, "master")

View File

@ -1,22 +0,0 @@
"""
This module contains the choices definition for settings required for the
build slave to run.
"""
from choices import Choices
from loader import load_settings
#----------------------------------------------------------------------
# Define the Settings
#----------------------------------------------------------------------
c = Choices()
c.define("master_host", type=str, help="Host of the build master.")
c.define("master_port", type=int, help="Port that is listening or build masters.")
c.define("name", type=str, help="Name of the slave machine.")
c.define("password", type=str, help="Password for the slave machine to communicate with the master.")
#----------------------------------------------------------------------
# Load the Settings
#----------------------------------------------------------------------
options = load_settings(c, "slave")

View File

@ -1,6 +0,0 @@
import buildsteps
from builders import get_builders
from change_sources import get_change_sources
from schedulers import get_schedulers
from slaves import get_slaves_from_config
from status import get_status

View File

@ -1,78 +0,0 @@
"""
This module contains the logic to create and return the various builders
that this buildmaster supports. The builders are responsible for taking
a set of changes and giving the steps necessary to build the project.
"""
from buildbot.config import BuilderConfig
from buildbot.process.factory import BuildFactory
from buildbot.process.properties import WithProperties
from buildbot.steps.source.git import Git
from buildbot_config.master import buildsteps
def get_builders(slaves):
"""
This returns a list of builder configurations for the given
slaves.
"""
return get_vagrant_builders("master", slaves)
def get_vagrant_builders(branch, slaves):
"""
This returns a list of the builders that represent the entire
chain for a given branch (unit, acceptance, packaging builds).
"""
platforms = ["linux", "osx", "win"]
builders = []
for platform in platforms:
platform_slaves = [s.slavename for s in slaves if platform in s.slavename]
if len(platform_slaves) > 0:
unit = BuilderConfig(
name="%s-%s-unit" % (platform, branch),
slavenames=platform_slaves,
factory=make_vagrant_unit_factory(branch))
acceptance = BuilderConfig(
name="%s-%s-acceptance" % (platform, branch),
slavenames=platform_slaves,
factory=make_vagrant_acceptance_factory(branch))
builders.extend([unit, acceptance])
return builders
def make_vagrant_unit_factory(branch):
"""
This returns the factory that runs the Vagrant unit tests.
"""
f = BuildFactory()
f.addStep(Git(repourl="git://github.com/mitchellh/vagrant.git",
branch=branch,
mode="full",
method="fresh",
shallow=True))
f.addStep(buildsteps.Bundler())
f.addStep(buildsteps.UnitTests())
return f
def make_vagrant_acceptance_factory(branch):
"""
This returns a build factory that knows how to run the Vagrant
acceptance tests.
"""
f = BuildFactory()
f.addStep(Git(repourl="git://github.com/mitchellh/vagrant.git",
branch=branch,
mode="full",
method="fresh",
shallow=True))
f.addStep(buildsteps.Bundler())
f.addStep(buildsteps.AcceptanceBoxes())
f.addStep(buildsteps.AcceptanceConfig())
f.addStep(buildsteps.AcceptanceTests())
return f

View File

@ -1,100 +0,0 @@
"""
Contains various buildsteps that the build master uses.
"""
import os
from buildbot.steps.shell import ShellCommand
from buildbot.process.properties import WithProperties
class Bundler(ShellCommand):
"""
Runs bundler to get the dependencies for a Ruby project.
"""
name = "bundler"
description = "bundle install"
descriptionDone = "bundler install complete"
command = ["bundle", "install"]
flunkOnFailure = True
haltOnFailure = True
class UnitTests(ShellCommand):
"""
Runs the unit tests via a rake command.
"""
name = "unit tests"
description = "unit tests"
descriptionDone = "passed unit tests"
command = ["rake", "test:unit"]
flunkOnFailure = True
haltOnFailure = True
class AcceptanceBoxes(ShellCommand):
"""
This step will download all the boxes required for the tests.
"""
name = "acceptance test boxes"
description = "downloading required boxes"
descriptionDone = description
flunkOnFailure = True
haltOnFailure = True
# Make some of our variables renderable with build properties
renderables = ShellCommand.renderables + ["box_dir"]
def __init__(self, **kwargs):
self.box_dir = WithProperties("%(workdir)s/boxes")
ShellCommand.__init__(self, **kwargs)
def start(self):
# Set the property of the box directory so that later steps
# can use it.
self.setProperty("box_dir", self.box_dir, self.name)
# Set the command to be correct
self.setCommand(["rake", "acceptance:boxes[%s]" % self.box_dir])
# Run the actual start method
ShellCommand.start(self)
class AcceptanceConfig(ShellCommand):
"""
This step generates the configuration for the acceptance test.
"""
name = "acceptance test config"
description = "generating config"
descriptionDone = "config generated"
command = ["rake", WithProperties("acceptance:config[%(box_dir)s]")]
flunkOnFailure = True
haltOnFailure = True
def commandComplete(self, cmd):
# Set a property with the location of the config file
config_path = os.path.join(self.getProperty("workdir"),
self.getWorkdir(), "acceptance_config.yml")
self.setProperty("acceptance_config_path", config_path, self.name)
ShellCommand.commandComplete(self, cmd)
class AcceptanceTests(ShellCommand):
"""
This step runs the actual acceptance tests.
"""
name = "acceptance tests"
description = "running"
descriptionDone = "done"
command = ["rake", "test:acceptance"]
flunkOnFailure = True
haltOnFailure = True
def __init__(self, **kwargs):
# Make sure that the proper environment variables for the test
# get passed through to the slave
kwargs["env"] = { "ACCEPTANCE_CONFIG": WithProperties("%(acceptance_config_path)s") }
kwargs["timeout"] = 3600
ShellCommand.__init__(self, **kwargs)

View File

@ -1,8 +0,0 @@
"""
Contains the logic to build and return the change sources for
the build master.
"""
def get_change_sources():
# Currently no sources since we're using a GitHub hook
return []

View File

@ -1,32 +0,0 @@
"""
This module contains the logic which returns the set of
schedulers to use for the build master.
"""
from buildbot.changes.filter import ChangeFilter
from buildbot.schedulers.basic import (
Dependent,
SingleBranchScheduler)
def get_schedulers(builders):
platforms = ["linux", "osx", "win"]
schedulers = []
for platform in platforms:
platform_builders = [b for b in builders if platform in b.name]
# Unit tests for this platform
unit_builders = [b.name for b in platform_builders if "unit" in b.name]
master_unit = SingleBranchScheduler(name="%s-master-unit" % platform,
change_filter=ChangeFilter(branch="master"),
treeStableTimer=60,
builderNames=unit_builders)
acceptance_builders = [b.name for b in platform_builders if "acceptance" in b.name]
master_acceptance = Dependent(name="%s-master-acceptance" % platform,
upstream=master_unit,
builderNames=acceptance_builders)
schedulers.extend([master_unit, master_acceptance])
return schedulers

View File

@ -1,60 +0,0 @@
"""
This module contains the classes and methods which help load the
list of available build slaves based on the configuration.
"""
from buildbot.buildslave import BuildSlave
class BuildSlavesFromSlaveConfigs(list):
"""
This object turns the ``SlaveConfig`` objects into actual
``BuildSlave`` objects. This list can be directly used as the
setting.
"""
def __init__(self, configs):
for config in configs:
self.append(BuildSlave(config.name, config.password))
class SlaveListFromConfig(list):
"""
This object knows how to parse the slave configuration settings
and load them into ``SlaveConfig`` value objects. The results
can be read directly from this list.
"""
def __init__(self, config):
for config in self._slave_configs(config):
self.append(config)
def _slave_configs(self, config):
"""
Returns an array of all the slaves that were configured
with the given configuration string.
"""
results = []
for single in config.split(","):
results.append(SlaveConfig(*single.split(":")))
return results
class SlaveConfig(object):
"""
This is a value class, meant to be immutable, representing
the configuration of a single slave.
"""
def __init__(self, name, password):
self.name = name
self.password = password
def __eq__(self, other):
"""
Provides equality tests for slave configurations, specifically
for tests.
"""
return self.__dict__ == other.__dict__
# Shortcut methods to make things a bit nicer
def get_slaves_from_config(config):
return BuildSlavesFromSlaveConfigs(SlaveListFromConfig(config))

View File

@ -1,52 +0,0 @@
"""
This module returns the given status handlers to enable for the
buildbot master.
"""
from buildbot.status import html, words
from buildbot.status.web.authz import Authz
from buildbot.status.web.auth import BasicAuth
def get_status(options):
"""
Returns a list of status targets for the build master.
"""
# Load the users that are allowed to perform authenticated
# actions from the configuration
auth_users = []
if options.http_users is not None:
for pair in options.http_users.split(","):
user, password = pair.split(":")
auth_users.append((user, password))
# Setup the rules for who can do what to the WebStatus
authz = Authz(
auth = BasicAuth(auth_users),
gracefulShutdown = False,
forceBuild = 'auth',
forceAllBuilds = 'auth',
pingBuilder = True,
stopBuild = 'auth',
stopAllBuilds = 'auth',
cancelPendingBuild = 'auth',
stopChange = 'auth',
cleanShutdown= False
)
# The web status gives us the nice web interface to our buildbot
web_status = html.WebStatus(
http_port = options.web_port,
authz = authz,
order_console_by_time = True,
change_hook_dialects=dict(github=True)
)
# Hook up an IRC bot into our channel
irc = words.IRC("irc.freenode.net", "vagrant-ci",
channels=[{"channel": "#vagrant"}],
notify_events={
'exception': 1,
'successToFailure': 1,
'failureToSuccess': 1})
return [web_status, irc]

View File

@ -1,28 +0,0 @@
# -*- makefile -*-
# This is a simple makefile which lives in a buildmaster
# directory (next to the buildbot.tac file). It allows you to start/stop the
# master by doing 'make start' or 'make stop'.
# The 'reconfig' target will tell a buildmaster to reload its config file.
start:
twistd --no_save -y buildbot.tac
stop:
if [ -e twistd.pid ]; \
then kill `cat twistd.pid`; \
else echo "Nothing to stop."; \
fi
reconfig:
if [ -e twistd.pid ]; \
then kill -HUP `cat twistd.pid`; \
else echo "Nothing to reconfig."; \
fi
log:
if [ -e twistd.log ]; \
then tail -f twistd.log; \
else echo "Nothing to tail."; \
fi

View File

@ -1,36 +0,0 @@
import os
from twisted.application import service
from buildbot.master import BuildMaster
basedir = r'.'
rotateLength = 10000000
maxRotatedFiles = 10
# if this is a relocatable tac file, get the directory containing the TAC
if basedir == '.':
import os.path
basedir = os.path.abspath(os.path.dirname(__file__))
# note: this line is matched against to check that this is a buildmaster
# directory; do not edit it.
application = service.Application('buildmaster')
try:
from twisted.python.logfile import LogFile
from twisted.python.log import ILogObserver, FileLogObserver
logfile = LogFile.fromFullPath(os.path.join(basedir, "twistd.log"), rotateLength=rotateLength,
maxRotatedFiles=maxRotatedFiles)
application.setComponent(ILogObserver, FileLogObserver(logfile).emit)
except ImportError:
# probably not yet twisted 8.2.0 and beyond, can't set log yet
pass
configfile = r'master.cfg'
m = BuildMaster(basedir, configfile)
m.setServiceParent(application)
m.log_rotation.rotateLength = rotateLength
m.log_rotation.maxRotatedFiles = maxRotatedFiles

View File

@ -1,67 +0,0 @@
# -*- python -*-
# ex: set syntax=python:
from buildbot_config.config.master import options
from buildbot_config.master import (
get_builders,
get_change_sources,
get_schedulers,
get_slaves_from_config,
get_status)
# This is the special key that Buildbot looks for. We use
# an alias to ``c`` to save us a lot of typing.
c = BuildmasterConfig = {}
#----------------------------------------------------------------------
# Project Identity and Basic Configuration
#----------------------------------------------------------------------
# Title and URL of project
c['title'] = options.title
c['titleURL'] = options.title_url
# URL to the actual buildbot installation
c['buildbotURL'] = options.buildbot_url
# This specifies what database buildbot uses to store change and scheduler
# state. You can leave this at its default for all but the largest
# installations.
c['db_url'] = "sqlite:///state.sqlite"
#----------------------------------------------------------------------
# Data Storage and Caching
#----------------------------------------------------------------------
# Time horizons. These specify the number of items that are kept
# persisted on disk before being pruned away. See the buildbot
# documentation for more information on each horizon setting.
c['changeHorizon'] = 0
c['buildHorizon'] = 0
c['eventHorizon'] = 0
c['logHorizon'] = 0
# Cache sizes. These are the number of the respective objects to
# hold in memory while buildbot is running. By default buildbot
# only stores 1, so all the numbers are greatly increased.
c['caches'] = {
'Changes' : 100,
'chdicts' : 100,
'BuildRequests' : 10,
'SourceStamps' : 20,
'ssdicts' : 20,
'objectids' : 10,
'usdicts' : 100,
}
c['buildCacheSize'] = 500
#----------------------------------------------------------------------
# Build Slaves
#----------------------------------------------------------------------
# The port that the buildmaster listens for buildslaves on.
c['slavePortnum'] = 9989
# The actual list of slave machines we have.
c['slaves'] = get_slaves_from_config(options.slaves)
c['status'] = get_status(options)
c['builders'] = get_builders(c['slaves'])
c['schedulers'] = get_schedulers(c['builders'])
c['change_source'] = get_change_sources()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -1,545 +0,0 @@
body.interface {
margin-left: 30px;
margin-right: 30px;
margin-top: 20px;
margin-bottom: 50px;
padding: 0;
background: url(bg_gradient.jpg) repeat-x;
font-family: Verdana, sans-serif;
font-size: 10px;
background-color: #fff;
color: #333;
}
a:link,a:visited,a:active {
color: #444;
}
table {
border-spacing: 1px 1px;
}
table td {
padding: 3px 4px 3px 4px;
text-align: center;
}
.Project {
min-width: 6em;
}
.LastBuild,.Activity {
padding: 0 0 0 4px;
}
.LastBuild,.Activity,.Builder,.BuildStep {
min-width: 5em;
}
/* Chromium Specific styles */
div.BuildResultInfo {
color: #444;
}
div.Announcement {
margin-bottom: 1em;
}
div.Announcement>a:hover {
color: black;
}
div.Announcement>div.Notice {
background-color: #afdaff;
padding: 0.5em;
font-size: 16px;
text-align: center;
}
div.Announcement>div.Open {
border: 3px solid #8fdf5f;
padding: 0.5em;
font-size: 16px;
text-align: center;
}
div.Announcement>div.Closed {
border: 5px solid #e98080;
padding: 0.5em;
font-size: 24px;
font-weight: bold;
text-align: center;
}
td.Time {
color: #000;
border-bottom: 1px solid #aaa;
background-color: #eee;
}
td.Activity,td.Change,td.Builder {
color: #333333;
background-color: #CCCCCC;
}
td.Change {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
}
td.Event {
color: #777;
background-color: #ddd;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
}
td.Activity {
border-top-left-radius: 10px;
-webkit-border-top-left-radius: 10px;
-moz-border-radius-topleft: 10px;
min-height: 20px;
padding: 2px 0 2px 0;
}
td.idle,td.waiting,td.offline,td.building {
border-top-left-radius: 0px;
-webkit-border-top-left-radius: 0px;
-moz-border-radius-topleft: 0px;
}
.LastBuild {
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
border-top-right-radius: 5px;
-webkit-border-top-right-radius: 5px;
-moz-border-radius-topright: 5px;
}
/* Console view styles */
td.DevRev {
padding: 4px 8px 4px 8px;
color: #333333;
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
background-color: #eee;
width: 1%;
}
td.DevRevCollapse {
border-bottom-left-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
-moz-border-radius-bottomleft: 5px;
}
td.DevName {
padding: 4px 8px 4px 8px;
color: #333333;
background-color: #eee;
width: 1%;
text-align: left;
}
td.DevStatus {
padding: 4px 4px 4px 4px;
color: #333333;
background-color: #eee;
}
td.DevSlave {
padding: 4px 4px 4px 4px;
color: #333333;
background-color: #eee;
}
td.first {
border-top-left-radius: 5px;
-webkit-border-top-left-radius: 5px;
-moz-border-radius-topleft: 5px;
}
td.last {
border-top-right-radius: 5px;
-webkit-border-top-right-radius: 5px;
-moz-border-radius-topright: 5px;
}
td.DevStatusCategory {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-width: 1px;
border-style: solid;
}
td.DevStatusCollapse {
border-bottom-right-radius: 5px;
-webkit-border-bottom-right-radius: 5px;
-moz-border-radius-bottomright: 5px;
}
td.DevDetails {
font-weight: normal;
padding: 8px 8px 8px 8px;
color: #333333;
background-color: #eee;
text-align: left;
}
td.DevDetails li a {
padding-right: 5px;
}
td.DevComment {
font-weight: normal;
padding: 8px 8px 8px 8px;
color: #333333;
border-bottom-right-radius: 5px;
-webkit-border-bottom-right-radius: 5px;
-moz-border-radius-bottomright: 5px;
border-bottom-left-radius: 5px;
-webkit-border-bottom-left-radius: 5px;
-moz-border-radius-bottomleft: 5px;
background-color: #eee;
text-align: left;
}
td.Alt {
background-color: #ddd;
}
.legend {
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
width: 100px;
max-width: 100px;
text-align: center;
padding: 2px 2px 2px 2px;
height: 14px;
white-space: nowrap;
}
.DevStatusBox {
text-align: center;
height: 20px;
padding: 0 2px;
line-height: 0;
white-space: nowrap;
}
.DevStatusBox a {
opacity: 0.85;
border-width: 1px;
border-style: solid;
border-radius: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
display: block;
width: 90%;
height: 20px;
line-height: 20px;
margin-left: auto;
margin-right: auto;
}
.DevSlaveBox {
text-align: center;
height: 10px;
padding: 0 2px;
line-height: 0;
white-space: nowrap;
}
.DevSlaveBox a {
opacity: 0.85;
border-width: 1px;
border-style: solid;
border-radius: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
display: block;
width: 90%;
height: 10px;
line-height: 20px;
margin-left: auto;
margin-right: auto;
}
a.noround {
border-radius: 0px;
-webkit-border-radius: 0px;
-moz-border-radius: 0px;
position: relative;
margin-top: -8px;
margin-bottom: -8px;
height: 36px;
border-top-width: 0;
border-bottom-width: 0;
}
a.begin {
border-top-width: 1px;
position: relative;
margin-top: 0px;
margin-bottom: -7px;
height: 27px;
border-top-left-radius: 4px;
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-right-radius: 4px;
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
}
a.end {
border-bottom-width: 1px;
position: relative;
margin-top: -7px;
margin-bottom: 0px;
height: 27px;
border-bottom-left-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-right-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
}
.center_align {
text-align: center;
}
.right_align {
text-align: right;
}
.left_align {
text-align: left;
}
div.BuildWaterfall {
border-radius: 7px;
-webkit-border-radius: 7px;
-moz-border-radius: 7px;
position: absolute;
left: 0px;
top: 0px;
background-color: #FFFFFF;
padding: 4px 4px 4px 4px;
float: left;
display: none;
border-width: 1px;
border-style: solid;
}
/* LastBuild, BuildStep states */
.success {
color: #000;
background-color: #8d4;
border-color: #4F8530;
}
.failure {
color: #000;
background-color: #e88;
border-color: #A77272;
}
.warnings {
color: #FFFFFF;
background-color: #fa3;
border-color: #C29D46;
}
.skipped {
color: #000;
background: #AADDEE;
border-color: #AADDEE;
}
.exception,.retry {
color: #FFFFFF;
background-color: #c6c;
border-color: #ACA0B3;
}
.start {
color: #000;
background-color: #ccc;
border-color: #ccc;
}
.running,.waiting,td.building {
color: #000;
background-color: #fd3;
border-color: #C5C56D;
}
.offline,td.offline {
color: #FFFFFF;
background-color: #777777;
border-color: #dddddd;
}
.start {
border-bottom-left-radius: 10px;
-webkit-border-bottom-left-radius: 10px;
-moz-border-radius-bottomleft: 10px;
border-bottom-right-radius: 10px;
-webkit-border-bottom-right-radius: 10px;
-moz-border-radius-bottomright: 10px;
}
.notstarted {
border-width: 1px;
border-style: solid;
border-color: #aaa;
background-color: #fff;
}
.closed {
background-color: #ff0000;
}
.closed .large {
font-size: 1.5em;
font-weight: bolder;
}
td.Project a:hover,td.start a:hover {
color: #000;
}
.mini-box {
text-align: center;
height: 20px;
padding: 0 2px;
line-height: 0;
white-space: nowrap;
}
.mini-box a {
border-radius: 0;
-webkit-border-radius: 0;
-moz-border-radius: 0;
display: block;
width: 100%;
height: 20px;
line-height: 20px;
margin-top: -30px;
}
.mini-closed {
-box-sizing: border-box;
-webkit-box-sizing: border-box;
border: 4px solid red;
}
/* grid styles */
table.Grid {
border-collapse: collapse;
}
table.Grid tr td {
padding: 0.2em;
margin: 0px;
text-align: center;
}
table.Grid tr td.title {
font-size: 90%;
border-right: 1px gray solid;
border-bottom: 1px gray solid;
}
table.Grid tr td.sourcestamp {
font-size: 90%;
}
table.Grid tr td.builder {
text-align: right;
font-size: 90%;
}
table.Grid tr td.build {
border: 1px gray solid;
}
/* column container */
div.column {
margin: 0 2em 2em 0;
float: left;
}
/* info tables */
table.info {
border-spacing: 1px;
}
table.info td {
padding: 0.1em 1em 0.1em 1em;
text-align: center;
}
table.info th {
padding: 0.2em 1.5em 0.2em 1.5em;
text-align: center;
}
table.info td.left {
text-align: left
}
.alt {
background-color: #f6f6f6;
}
li {
padding: 0.1em 1em 0.1em 1em;
}
.result {
padding: 0.3em 1em 0.3em 1em;
}
/* log view */
.log * {
vlink: #800080;
font-family: "Courier New", courier, monotype, monospace;
}
span.stdout {
color: black;
}
span.stderr {
color: red;
}
span.header {
color: blue;
}
/* revision & email */
.revision .full {
display: none;
}
.user .email {
display: none;
}
/* change comments (use regular colors here) */
pre.comments>a:link,pre.comments>a:visited {
color: blue;
}
pre.comments>a:active {
color: purple;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,10 +0,0 @@
User-agent: *
Disallow: /waterfall
Disallow: /builders
Disallow: /changes
Disallow: /buildslaves
Disallow: /schedulers
Disallow: /one_line_per_build
Disallow: /builders
Disallow: /grid
Disallow: /tgrid

View File

@ -1,356 +0,0 @@
html,body{margin:0;padding:0;}
h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,cite,code,del,dfn,em,img,q,s,samp,small,strike,strong,sub,sup,tt,var,dd,dl,dt,li,ol,ul,fieldset,form,label,legend,button,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;font-weight:normal;font-style:normal;font-size:100%;line-height:1;font-family:inherit;}
table{border-collapse:collapse;border-spacing:0;}
ol,ul{list-style:none;}
q:before,q:after,blockquote:before,blockquote:after{content:"";}
html{overflow-y:scroll;font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
a:focus{outline:thin dotted;}
a:hover,a:active{outline:0;}
article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
audio:not([controls]){display:none;}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}
sup{top:-0.5em;}
sub{bottom:-0.25em;}
img{border:0;-ms-interpolation-mode:bicubic;}
button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;}
button,input{line-height:normal;*overflow:visible;}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}
button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}
textarea{overflow:auto;vertical-align:top;}
body{background-color:#ffffff;margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;color:#404040;}
.container{width:940px;margin-left:auto;margin-right:auto;zoom:1;}.container:before,.container:after{display:table;content:"";zoom:1;}
.container:after{clear:both;}
.container-fluid{position:relative;min-width:940px;padding-left:20px;padding-right:20px;zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";zoom:1;}
.container-fluid:after{clear:both;}
.container-fluid>.sidebar{position:absolute;top:0;left:20px;width:220px;}
.container-fluid>.content{margin-left:240px;}
a{color:#0069d6;text-decoration:none;line-height:inherit;font-weight:inherit;}a:hover{color:#00438a;text-decoration:underline;}
.pull-right{float:right;}
.pull-left{float:left;}
.hide{display:none;}
.show{display:block;}
.row{zoom:1;margin-left:-20px;}.row:before,.row:after{display:table;content:"";zoom:1;}
.row:after{clear:both;}
.row>[class*="span"]{display:inline;float:left;margin-left:20px;}
.span1{width:40px;}
.span2{width:100px;}
.span3{width:160px;}
.span4{width:220px;}
.span5{width:280px;}
.span6{width:340px;}
.span7{width:400px;}
.span8{width:460px;}
.span9{width:520px;}
.span10{width:580px;}
.span11{width:640px;}
.span12{width:700px;}
.span13{width:760px;}
.span14{width:820px;}
.span15{width:880px;}
.span16{width:940px;}
.span17{width:1000px;}
.span18{width:1060px;}
.span19{width:1120px;}
.span20{width:1180px;}
.span21{width:1240px;}
.span22{width:1300px;}
.span23{width:1360px;}
.span24{width:1420px;}
.row>.offset1{margin-left:80px;}
.row>.offset2{margin-left:140px;}
.row>.offset3{margin-left:200px;}
.row>.offset4{margin-left:260px;}
.row>.offset5{margin-left:320px;}
.row>.offset6{margin-left:380px;}
.row>.offset7{margin-left:440px;}
.row>.offset8{margin-left:500px;}
.row>.offset9{margin-left:560px;}
.row>.offset10{margin-left:620px;}
.row>.offset11{margin-left:680px;}
.row>.offset12{margin-left:740px;}
.span-one-third{width:300px;}
.span-two-thirds{width:620px;}
.row>.offset-one-third{margin-left:340px;}
.row>.offset-two-thirds{margin-left:660px;}
p{font-size:13px;font-weight:normal;line-height:18px;margin-bottom:9px;}p small{font-size:11px;color:#bfbfbf;}
h1,h2,h3,h4,h5,h6{font-weight:bold;color:#404040;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#bfbfbf;}
h1{margin-bottom:18px;font-size:30px;line-height:36px;}h1 small{font-size:18px;}
h2{font-size:24px;line-height:36px;}h2 small{font-size:14px;}
h3,h4,h5,h6{line-height:36px;}
h3{font-size:18px;}h3 small{font-size:14px;}
h4{font-size:16px;}h4 small{font-size:12px;}
h5{font-size:14px;}
h6{font-size:13px;color:#bfbfbf;text-transform:uppercase;}
ul,ol{margin:0 0 18px 25px;}
ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
ul{list-style:disc;}
ol{list-style:decimal;}
li{line-height:18px;color:#808080;}
ul.unstyled{list-style:none;margin-left:0;}
dl{margin-bottom:18px;}dl dt,dl dd{line-height:18px;}
dl dt{font-weight:bold;}
dl dd{margin-left:9px;}
hr{margin:20px 0 19px;border:0;border-bottom:1px solid #eee;}
strong{font-style:inherit;font-weight:bold;}
em{font-style:italic;font-weight:inherit;line-height:inherit;}
.muted{color:#bfbfbf;}
blockquote{margin-bottom:18px;border-left:5px solid #eee;padding-left:15px;}blockquote p{font-size:14px;font-weight:300;line-height:18px;margin-bottom:0;}
blockquote small{display:block;font-size:12px;font-weight:300;line-height:18px;color:#bfbfbf;}blockquote small:before{content:'\2014 \00A0';}
address{display:block;line-height:18px;margin-bottom:18px;}
code,pre{padding:0 3px 2px;font-family:Monaco, Andale Mono, Courier New, monospace;font-size:12px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
code{background-color:#fee9cc;color:rgba(0, 0, 0, 0.75);padding:1px 3px;}
pre{background-color:#f5f5f5;display:block;padding:8.5px;margin:0 0 18px;line-height:18px;font-size:12px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;white-space:pre;white-space:pre-wrap;word-wrap:break-word;}
form{margin-bottom:18px;}
fieldset{margin-bottom:18px;padding-top:18px;}fieldset legend{display:block;padding-left:150px;font-size:19.5px;line-height:1;color:#404040;*padding:0 0 5px 145px;*line-height:1.5;}
form .clearfix{margin-bottom:18px;zoom:1;}form .clearfix:before,form .clearfix:after{display:table;content:"";zoom:1;}
form .clearfix:after{clear:both;}
label,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:normal;}
label{padding-top:6px;font-size:13px;line-height:18px;float:left;width:130px;text-align:right;color:#404040;}
form .input{margin-left:150px;}
input[type=checkbox],input[type=radio]{cursor:pointer;}
input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;font-size:13px;line-height:18px;color:#808080;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
select{padding:initial;}
input[type=checkbox],input[type=radio]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;border:none;}
input[type=file]{background-color:#ffffff;padding:initial;border:initial;line-height:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
input[type=button],input[type=reset],input[type=submit]{width:auto;height:auto;}
select,input[type=file]{height:27px;*height:auto;line-height:27px;*margin-top:4px;}
select[multiple]{height:inherit;background-color:#ffffff;}
textarea{height:auto;}
.uneditable-input{background-color:#ffffff;display:block;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
:-moz-placeholder{color:#bfbfbf;}
::-webkit-input-placeholder{color:#bfbfbf;}
input,textarea{-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);}
input:focus,textarea:focus{outline:0;border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);}
input[type=file]:focus,input[type=checkbox]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:1px dotted #666;}
form .clearfix.error>label,form .clearfix.error .help-block,form .clearfix.error .help-inline{color:#b94a48;}
form .clearfix.error input,form .clearfix.error textarea{color:#b94a48;border-color:#ee5f5b;}form .clearfix.error input:focus,form .clearfix.error textarea:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
form .clearfix.error .input-prepend .add-on,form .clearfix.error .input-append .add-on{color:#b94a48;background-color:#fce6e6;border-color:#b94a48;}
form .clearfix.warning>label,form .clearfix.warning .help-block,form .clearfix.warning .help-inline{color:#c09853;}
form .clearfix.warning input,form .clearfix.warning textarea{color:#c09853;border-color:#ccae64;}form .clearfix.warning input:focus,form .clearfix.warning textarea:focus{border-color:#be9a3f;-webkit-box-shadow:0 0 6px #e5d6b1;-moz-box-shadow:0 0 6px #e5d6b1;box-shadow:0 0 6px #e5d6b1;}
form .clearfix.warning .input-prepend .add-on,form .clearfix.warning .input-append .add-on{color:#c09853;background-color:#d2b877;border-color:#c09853;}
form .clearfix.success>label,form .clearfix.success .help-block,form .clearfix.success .help-inline{color:#468847;}
form .clearfix.success input,form .clearfix.success textarea{color:#468847;border-color:#57a957;}form .clearfix.success input:focus,form .clearfix.success textarea:focus{border-color:#458845;-webkit-box-shadow:0 0 6px #9acc9a;-moz-box-shadow:0 0 6px #9acc9a;box-shadow:0 0 6px #9acc9a;}
form .clearfix.success .input-prepend .add-on,form .clearfix.success .input-append .add-on{color:#468847;background-color:#bcddbc;border-color:#468847;}
.input-mini,input.mini,textarea.mini,select.mini{width:60px;}
.input-small,input.small,textarea.small,select.small{width:90px;}
.input-medium,input.medium,textarea.medium,select.medium{width:150px;}
.input-large,input.large,textarea.large,select.large{width:210px;}
.input-xlarge,input.xlarge,textarea.xlarge,select.xlarge{width:270px;}
.input-xxlarge,input.xxlarge,textarea.xxlarge,select.xxlarge{width:530px;}
textarea.xxlarge{overflow-y:auto;}
input.span1,textarea.span1{display:inline-block;float:none;width:30px;margin-left:0;}
input.span2,textarea.span2{display:inline-block;float:none;width:90px;margin-left:0;}
input.span3,textarea.span3{display:inline-block;float:none;width:150px;margin-left:0;}
input.span4,textarea.span4{display:inline-block;float:none;width:210px;margin-left:0;}
input.span5,textarea.span5{display:inline-block;float:none;width:270px;margin-left:0;}
input.span6,textarea.span6{display:inline-block;float:none;width:330px;margin-left:0;}
input.span7,textarea.span7{display:inline-block;float:none;width:390px;margin-left:0;}
input.span8,textarea.span8{display:inline-block;float:none;width:450px;margin-left:0;}
input.span9,textarea.span9{display:inline-block;float:none;width:510px;margin-left:0;}
input.span10,textarea.span10{display:inline-block;float:none;width:570px;margin-left:0;}
input.span11,textarea.span11{display:inline-block;float:none;width:630px;margin-left:0;}
input.span12,textarea.span12{display:inline-block;float:none;width:690px;margin-left:0;}
input.span13,textarea.span13{display:inline-block;float:none;width:750px;margin-left:0;}
input.span14,textarea.span14{display:inline-block;float:none;width:810px;margin-left:0;}
input.span15,textarea.span15{display:inline-block;float:none;width:870px;margin-left:0;}
input.span16,textarea.span16{display:inline-block;float:none;width:930px;margin-left:0;}
input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;}
.actions{background:#f5f5f5;margin-top:18px;margin-bottom:18px;padding:17px 20px 18px 150px;border-top:1px solid #ddd;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;}.actions .secondary-action{float:right;}.actions .secondary-action a{line-height:30px;}.actions .secondary-action a:hover{text-decoration:underline;}
.help-inline,.help-block{font-size:13px;line-height:18px;color:#bfbfbf;}
.help-inline{padding-left:5px;*position:relative;*top:-5px;}
.help-block{display:block;max-width:600px;}
.inline-inputs{color:#808080;}.inline-inputs span{padding:0 2px 0 1px;}
.input-prepend input,.input-append input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
.input-prepend .add-on,.input-append .add-on{position:relative;background:#f5f5f5;border:1px solid #ccc;z-index:2;float:left;display:block;width:auto;min-width:16px;height:18px;padding:4px 4px 4px 5px;margin-right:-1px;font-weight:normal;line-height:18px;color:#bfbfbf;text-align:center;text-shadow:0 1px 0 #ffffff;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
.input-prepend .active,.input-append .active{background:#a9dba9;border-color:#46a546;}
.input-prepend .add-on{*margin-top:1px;}
.input-append input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
.input-append .add-on{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;margin-right:0;margin-left:-1px;}
.inputs-list{margin:0 0 5px;width:100%;}.inputs-list li{display:block;padding:0;width:100%;}
.inputs-list label{display:block;float:none;width:auto;padding:0;margin-left:20px;line-height:18px;text-align:left;white-space:normal;}.inputs-list label strong{color:#808080;}
.inputs-list label small{font-size:11px;font-weight:normal;}
.inputs-list .inputs-list{margin-left:25px;margin-bottom:10px;padding-top:0;}
.inputs-list:first-child{padding-top:6px;}
.inputs-list li+li{padding-top:2px;}
.inputs-list input[type=radio],.inputs-list input[type=checkbox]{margin-bottom:0;margin-left:-20px;float:left;}
.form-stacked{padding-left:20px;}.form-stacked fieldset{padding-top:9px;}
.form-stacked legend{padding-left:0;}
.form-stacked label{display:block;float:none;width:auto;font-weight:bold;text-align:left;line-height:20px;padding-top:0;}
.form-stacked .clearfix{margin-bottom:9px;}.form-stacked .clearfix div.input{margin-left:0;}
.form-stacked .inputs-list{margin-bottom:0;}.form-stacked .inputs-list li{padding-top:0;}.form-stacked .inputs-list li label{font-weight:normal;padding-top:0;}
.form-stacked div.clearfix.error{padding-top:10px;padding-bottom:10px;padding-left:10px;margin-top:0;margin-left:-10px;}
.form-stacked .actions{margin-left:-20px;padding-left:20px;}
table{width:100%;margin-bottom:18px;padding:0;font-size:13px;border-collapse:collapse;}table th,table td{padding:10px 10px 9px;line-height:18px;text-align:left;}
table th{padding-top:9px;font-weight:bold;vertical-align:middle;}
table td{vertical-align:top;border-top:1px solid #ddd;}
table tbody th{border-top:1px solid #ddd;vertical-align:top;}
.condensed-table th,.condensed-table td{padding:5px 5px 4px;}
.bordered-table{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.bordered-table th+th,.bordered-table td+td,.bordered-table th+td{border-left:1px solid #ddd;}
.bordered-table thead tr:first-child th:first-child,.bordered-table tbody tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;}
.bordered-table thead tr:first-child th:last-child,.bordered-table tbody tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;}
.bordered-table tbody tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;}
.bordered-table tbody tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;}
table .span1{width:20px;}
table .span2{width:60px;}
table .span3{width:100px;}
table .span4{width:140px;}
table .span5{width:180px;}
table .span6{width:220px;}
table .span7{width:260px;}
table .span8{width:300px;}
table .span9{width:340px;}
table .span10{width:380px;}
table .span11{width:420px;}
table .span12{width:460px;}
table .span13{width:500px;}
table .span14{width:540px;}
table .span15{width:580px;}
table .span16{width:620px;}
.zebra-striped tbody tr:nth-child(odd) td,.zebra-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
.zebra-striped tbody tr:hover td,.zebra-striped tbody tr:hover th{background-color:#f5f5f5;}
table .header{cursor:pointer;}table .header:after{content:"";float:right;margin-top:7px;border-width:0 4px 4px;border-style:solid;border-color:#000 transparent;visibility:hidden;}
table .headerSortUp,table .headerSortDown{background-color:rgba(141, 192, 219, 0.25);text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);}
table .header:hover:after{visibility:visible;}
table .headerSortDown:after,table .headerSortDown:hover:after{visibility:visible;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;}
table .headerSortUp:after{border-bottom:none;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000;visibility:visible;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;}
table .blue{color:#049cdb;border-bottom-color:#049cdb;}
table .headerSortUp.blue,table .headerSortDown.blue{background-color:#ade6fe;}
table .green{color:#46a546;border-bottom-color:#46a546;}
table .headerSortUp.green,table .headerSortDown.green{background-color:#cdeacd;}
table .red{color:#9d261d;border-bottom-color:#9d261d;}
table .headerSortUp.red,table .headerSortDown.red{background-color:#f4c8c5;}
table .yellow{color:#ffc40d;border-bottom-color:#ffc40d;}
table .headerSortUp.yellow,table .headerSortDown.yellow{background-color:#fff6d9;}
table .orange{color:#f89406;border-bottom-color:#f89406;}
table .headerSortUp.orange,table .headerSortDown.orange{background-color:#fee9cc;}
table .purple{color:#7a43b6;border-bottom-color:#7a43b6;}
table .headerSortUp.purple,table .headerSortDown.purple{background-color:#e2d5f0;}
.topbar{height:40px;position:fixed;top:0;left:0;right:0;z-index:10000;overflow:visible;}.topbar a{color:#bfbfbf;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
.topbar h3 a:hover,.topbar .brand:hover,.topbar ul .active>a{background-color:#333;background-color:rgba(255, 255, 255, 0.05);color:#ffffff;text-decoration:none;}
.topbar h3{position:relative;}
.topbar h3 a,.topbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;color:#ffffff;font-size:20px;font-weight:200;line-height:1;}
.topbar p{margin:0;line-height:40px;}.topbar p a:hover{background-color:transparent;color:#ffffff;}
.topbar form{float:left;margin:5px 0 0 0;position:relative;filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;}
.topbar form.pull-right{float:right;}
.topbar input{background-color:#444;background-color:rgba(255, 255, 255, 0.3);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:normal;font-weight:13px;line-height:1;padding:4px 9px;color:#ffffff;color:rgba(255, 255, 255, 0.75);border:1px solid #111;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.topbar input:-moz-placeholder{color:#e6e6e6;}
.topbar input::-webkit-input-placeholder{color:#e6e6e6;}
.topbar input:hover{background-color:#bfbfbf;background-color:rgba(255, 255, 255, 0.5);color:#ffffff;}
.topbar input:focus,.topbar input.focused{outline:0;background-color:#ffffff;color:#404040;text-shadow:0 1px 0 #ffffff;border:0;padding:5px 10px;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);}
.topbar-inner,.topbar .fill{background-color:#222;background-color:#222222;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);}
.topbar div>ul,.nav{display:block;float:left;margin:0 10px 0 0;position:relative;left:0;}.topbar div>ul>li,.nav>li{display:block;float:left;}
.topbar div>ul a,.nav a{display:block;float:none;padding:10px 10px 11px;line-height:19px;text-decoration:none;}.topbar div>ul a:hover,.nav a:hover{color:#ffffff;text-decoration:none;}
.topbar div>ul .active>a,.nav .active>a{background-color:#222;background-color:rgba(0, 0, 0, 0.5);}
.topbar div>ul.secondary-nav,.nav.secondary-nav{float:right;margin-left:10px;margin-right:0;}.topbar div>ul.secondary-nav .menu-dropdown,.nav.secondary-nav .menu-dropdown,.topbar div>ul.secondary-nav .dropdown-menu,.nav.secondary-nav .dropdown-menu{right:0;border:0;}
.topbar div>ul a.menu:hover,.nav a.menu:hover,.topbar div>ul li.open .menu,.nav li.open .menu,.topbar div>ul .dropdown-toggle:hover,.nav .dropdown-toggle:hover,.topbar div>ul .dropdown.open .dropdown-toggle,.nav .dropdown.open .dropdown-toggle{background:#444;background:rgba(255, 255, 255, 0.05);}
.topbar div>ul .menu-dropdown,.nav .menu-dropdown,.topbar div>ul .dropdown-menu,.nav .dropdown-menu{background-color:#333;}.topbar div>ul .menu-dropdown a.menu,.nav .menu-dropdown a.menu,.topbar div>ul .dropdown-menu a.menu,.nav .dropdown-menu a.menu,.topbar div>ul .menu-dropdown .dropdown-toggle,.nav .menu-dropdown .dropdown-toggle,.topbar div>ul .dropdown-menu .dropdown-toggle,.nav .dropdown-menu .dropdown-toggle{color:#ffffff;}.topbar div>ul .menu-dropdown a.menu.open,.nav .menu-dropdown a.menu.open,.topbar div>ul .dropdown-menu a.menu.open,.nav .dropdown-menu a.menu.open,.topbar div>ul .menu-dropdown .dropdown-toggle.open,.nav .menu-dropdown .dropdown-toggle.open,.topbar div>ul .dropdown-menu .dropdown-toggle.open,.nav .dropdown-menu .dropdown-toggle.open{background:#444;background:rgba(255, 255, 255, 0.05);}
.topbar div>ul .menu-dropdown li a,.nav .menu-dropdown li a,.topbar div>ul .dropdown-menu li a,.nav .dropdown-menu li a{color:#999;text-shadow:0 1px 0 rgba(0, 0, 0, 0.5);}.topbar div>ul .menu-dropdown li a:hover,.nav .menu-dropdown li a:hover,.topbar div>ul .dropdown-menu li a:hover,.nav .dropdown-menu li a:hover{background-color:#191919;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));background-image:-moz-linear-gradient(top, #292929, #191919);background-image:-ms-linear-gradient(top, #292929, #191919);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));background-image:-webkit-linear-gradient(top, #292929, #191919);background-image:-o-linear-gradient(top, #292929, #191919);background-image:linear-gradient(top, #292929, #191919);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);color:#ffffff;}
.topbar div>ul .menu-dropdown .active a,.nav .menu-dropdown .active a,.topbar div>ul .dropdown-menu .active a,.nav .dropdown-menu .active a{color:#ffffff;}
.topbar div>ul .menu-dropdown .divider,.nav .menu-dropdown .divider,.topbar div>ul .dropdown-menu .divider,.nav .dropdown-menu .divider{background-color:#222;border-color:#444;}
.topbar ul .menu-dropdown li a,.topbar ul .dropdown-menu li a{padding:4px 15px;}
li.menu,.dropdown{position:relative;}
a.menu:after,.dropdown-toggle:after{width:0;height:0;display:inline-block;content:"↓";text-indent:-99999px;vertical-align:top;margin-top:8px;margin-left:4px;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #ffffff;filter:alpha(opacity=50);-khtml-opacity:0.5;-moz-opacity:0.5;opacity:0.5;}
.menu-dropdown,.dropdown-menu{background-color:#ffffff;float:left;display:none;position:absolute;top:40px;z-index:900;min-width:160px;max-width:220px;_width:160px;margin-left:0;margin-right:0;padding:6px 0;zoom:1;border-color:#999;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:0 1px 1px;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);box-shadow:0 2px 4px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.menu-dropdown li,.dropdown-menu li{float:none;display:block;background-color:none;}
.menu-dropdown .divider,.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#eee;border-bottom:1px solid #ffffff;}
.topbar .dropdown-menu a,.dropdown-menu a{display:block;padding:4px 15px;clear:both;font-weight:normal;line-height:18px;color:#808080;text-shadow:0 1px 0 #ffffff;}.topbar .dropdown-menu a:hover,.dropdown-menu a:hover,.topbar .dropdown-menu a.hover,.dropdown-menu a.hover{background-color:#dddddd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));background-image:-moz-linear-gradient(top, #eeeeee, #dddddd);background-image:-ms-linear-gradient(top, #eeeeee, #dddddd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(top, #eeeeee, #dddddd);background-image:-o-linear-gradient(top, #eeeeee, #dddddd);background-image:linear-gradient(top, #eeeeee, #dddddd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);color:#404040;text-decoration:none;-webkit-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 0 rgba(0, 0, 0, 0.025),inset 0 -1px rgba(0, 0, 0, 0.025);}
.open .menu,.dropdown.open .menu,.open .dropdown-toggle,.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);}
.open .menu-dropdown,.dropdown.open .menu-dropdown,.open .dropdown-menu,.dropdown.open .dropdown-menu{display:block;}
.tabs,.pills{margin:0 0 18px;padding:0;list-style:none;zoom:1;}.tabs:before,.pills:before,.tabs:after,.pills:after{display:table;content:"";zoom:1;}
.tabs:after,.pills:after{clear:both;}
.tabs>li,.pills>li{float:left;}.tabs>li>a,.pills>li>a{display:block;}
.tabs{border-color:#ddd;border-style:solid;border-width:0 0 1px;}.tabs>li{position:relative;margin-bottom:-1px;}.tabs>li>a{padding:0 15px;margin-right:2px;line-height:34px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.tabs>li>a:hover{text-decoration:none;background-color:#eee;border-color:#eee #eee #ddd;}
.tabs .active>a,.tabs .active>a:hover{color:#808080;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
.tabs .menu-dropdown,.tabs .dropdown-menu{top:35px;border-width:1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
.tabs a.menu:after,.tabs .dropdown-toggle:after{border-top-color:#999;margin-top:15px;margin-left:5px;}
.tabs li.open.menu .menu,.tabs .open.dropdown .dropdown-toggle{border-color:#999;}
.tabs li.open a.menu:after,.tabs .dropdown.open .dropdown-toggle:after{border-top-color:#555;}
.pills a{margin:5px 3px 5px 0;padding:0 15px;line-height:30px;text-shadow:0 1px 1px #ffffff;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}.pills a:hover{color:#ffffff;text-decoration:none;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);background-color:#00438a;}
.pills .active a{color:#ffffff;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);background-color:#0069d6;}
.pills-vertical>li{float:none;}
.tab-content>.tab-pane,.pill-content>.pill-pane,.tab-content>div,.pill-content>div{display:none;}
.tab-content>.active,.pill-content>.active{display:block;}
.breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#f5f5f5;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline;text-shadow:0 1px 0 #ffffff;}
.breadcrumb .divider{padding:0 5px;color:#bfbfbf;}
.breadcrumb .active a{color:#404040;}
.hero-unit{background-color:#f5f5f5;margin-bottom:30px;padding:60px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;}
.hero-unit p{font-size:18px;font-weight:200;line-height:27px;}
footer{margin-top:17px;padding-top:17px;border-top:1px solid #eee;}
.page-header{margin-bottom:17px;border-bottom:1px solid #ddd;-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}.page-header h1{margin-bottom:8px;}
.btn.danger,.alert-message.danger,.btn.danger:hover,.alert-message.danger:hover,.btn.error,.alert-message.error,.btn.error:hover,.alert-message.error:hover,.btn.success,.alert-message.success,.btn.success:hover,.alert-message.success:hover,.btn.info,.alert-message.info,.btn.info:hover,.alert-message.info:hover{color:#ffffff;}
.btn .close,.alert-message .close{font-family:Arial,sans-serif;line-height:18px;}
.btn.danger,.alert-message.danger,.btn.error,.alert-message.error{background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
.btn.success,.alert-message.success{background-color:#57a957;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#57a957 #57a957 #3d773d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
.btn.info,.alert-message.info{background-color:#339bb9;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#339bb9 #339bb9 #22697d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
.btn{cursor:pointer;display:inline-block;background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);padding:5px 14px 6px;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);color:#333;font-size:13px;line-height:normal;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;-ms-transition:0.1s linear all;-o-transition:0.1s linear all;transition:0.1s linear all;}.btn:hover{background-position:0 -15px;color:#333;text-decoration:none;}
.btn:focus{outline:1px dotted #666;}
.btn.primary{color:#ffffff;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
.btn.active,.btn:active{-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.25),0 1px 2px rgba(0, 0, 0, 0.05);}
.btn.disabled{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
.btn[disabled]{cursor:default;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
.btn.large{font-size:15px;line-height:normal;padding:9px 14px 9px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
.btn.small{padding:7px 9px 7px;font-size:11px;}
:root .alert-message,:root .btn{border-radius:0 \0;}
button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0;}
.close{float:right;color:#000000;font-size:20px;font-weight:bold;line-height:13.5px;text-shadow:0 1px 0 #ffffff;filter:alpha(opacity=25);-khtml-opacity:0.25;-moz-opacity:0.25;opacity:0.25;}.close:hover{color:#000000;text-decoration:none;filter:alpha(opacity=40);-khtml-opacity:0.4;-moz-opacity:0.4;opacity:0.4;}
.alert-message{position:relative;padding:7px 15px;margin-bottom:18px;color:#404040;background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);}.alert-message .close{margin-top:1px;*margin-top:0;}
.alert-message a{font-weight:bold;color:#404040;}
.alert-message.danger p a,.alert-message.error p a,.alert-message.success p a,.alert-message.info p a{color:#ffffff;}
.alert-message h5{line-height:18px;}
.alert-message p{margin-bottom:0;}
.alert-message div{margin-top:5px;margin-bottom:2px;line-height:28px;}
.alert-message .btn{-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);}
.alert-message.block-message{background-image:none;background-color:#fdf5d9;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);padding:14px;border-color:#fceec1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}.alert-message.block-message ul,.alert-message.block-message p{margin-right:30px;}
.alert-message.block-message ul{margin-bottom:0;}
.alert-message.block-message li{color:#404040;}
.alert-message.block-message .alert-actions{margin-top:5px;}
.alert-message.block-message.error,.alert-message.block-message.success,.alert-message.block-message.info{color:#404040;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
.alert-message.block-message.error{background-color:#fddfde;border-color:#fbc7c6;}
.alert-message.block-message.success{background-color:#d1eed1;border-color:#bfe7bf;}
.alert-message.block-message.info{background-color:#ddf4fb;border-color:#c6edf9;}
.alert-message.block-message.danger p a,.alert-message.block-message.error p a,.alert-message.block-message.success p a,.alert-message.block-message.info p a{color:#404040;}
.pagination{height:36px;margin:18px 0;}.pagination ul{float:left;margin:0;border:1px solid #ddd;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
.pagination li{display:inline;}
.pagination a{float:left;padding:0 14px;line-height:34px;border-right:1px solid;border-right-color:#ddd;border-right-color:rgba(0, 0, 0, 0.15);*border-right-color:#ddd;text-decoration:none;}
.pagination a:hover,.pagination .active a{background-color:#c7eefe;}
.pagination .disabled a,.pagination .disabled a:hover{background-color:transparent;color:#bfbfbf;}
.pagination .next a{border:0;}
.well{background-color:#f5f5f5;margin-bottom:20px;padding:19px;min-height:20px;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
.modal-backdrop{background-color:#000000;position:fixed;top:0;left:0;right:0;bottom:0;z-index:10000;}.modal-backdrop.fade{opacity:0;}
.modal-backdrop,.modal-backdrop.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}
.modal{position:fixed;top:50%;left:50%;z-index:11000;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal .close{margin-top:7px;}
.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
.modal.fade.in{top:50%;}
.modal-header{border-bottom:1px solid #eee;padding:5px 15px;}
.modal-body{padding:15px;}
.modal-body form{margin-bottom:0;}
.modal-footer{background-color:#f5f5f5;padding:14px 15px 15px;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;zoom:1;margin-bottom:0;}.modal-footer:before,.modal-footer:after{display:table;content:"";zoom:1;}
.modal-footer:after{clear:both;}
.modal-footer .btn{float:right;margin-left:5px;}
.modal .popover,.modal .twipsy{z-index:12000;}
.twipsy{display:block;position:absolute;visibility:visible;padding:5px;font-size:11px;z-index:1000;filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}.twipsy.fade.in{filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}
.twipsy.above .twipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
.twipsy.left .twipsy-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
.twipsy.below .twipsy-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
.twipsy.right .twipsy-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
.twipsy-inner{padding:3px 8px;background-color:#000000;color:white;text-align:center;max-width:200px;text-decoration:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
.twipsy-arrow{position:absolute;width:0;height:0;}
.popover{position:absolute;top:0;left:0;z-index:1000;padding:5px;display:none;}.popover.above .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
.popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;}
.popover.below .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;}
.popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;}
.popover .arrow{position:absolute;width:0;height:0;}
.popover .inner{background:#000000;background:rgba(0, 0, 0, 0.8);padding:3px;overflow:hidden;width:280px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);}
.popover .title{background-color:#f5f5f5;padding:9px 15px;line-height:1;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;border-bottom:1px solid #eee;}
.popover .content{background-color:#ffffff;padding:14px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover .content p,.popover .content ul,.popover .content ol{margin-bottom:0;}
.fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;}
.label{padding:1px 3px 2px;font-size:9.75px;font-weight:bold;color:#ffffff;text-transform:uppercase;white-space:nowrap;background-color:#bfbfbf;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.label.important{background-color:#c43c35;}
.label.warning{background-color:#f89406;}
.label.success{background-color:#46a546;}
.label.notice{background-color:#62cffc;}
.media-grid{margin-left:-20px;margin-bottom:0;zoom:1;}.media-grid:before,.media-grid:after{display:table;content:"";zoom:1;}
.media-grid:after{clear:both;}
.media-grid li{display:inline;}
.media-grid a{float:left;padding:4px;margin:0 0 18px 20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);}.media-grid a img{display:block;}
.media-grid a:hover{border-color:#0069d6;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}

View File

@ -1,97 +0,0 @@
.com { color: #93a1a1; }
.lit { color: #195f91; }
.pun, .opn, .clo { color: #93a1a1; }
.fun { color: #dc322f; }
.str, .atv { color: #268bd2; }
.kwd, .tag { color: #195f91; }
.typ, .atn, .dec, .var { color: #CB4B16; }
.pln { color: #444; }
.prettyprint {
background-color: #fefbf3;
padding: 9px;
border: 1px solid rgba(0,0,0,.2);
-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.1);
-moz-box-shadow: 0 1px 2px rgba(0,0,0,.1);
box-shadow: 0 1px 2px rgba(0,0,0,.1);
}
/* Specify class=linenums on a pre to get line numbering */
ol.linenums {
margin: 0 0 0 40px;
}
/* IE indents via margin-left */
ol.linenums li {
padding: 0 5px;
color: rgba(0,0,0,.15);
line-height: 20px;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
}
/* Alternate shading for lines */
li.L1, li.L3, li.L5, li.L7, li.L9 { }
/*
$base03: #002b36;
$base02: #073642;
$base01: #586e75;
$base00: #657b83;
$base0: #839496;
$base1: #93a1a1;
$base2: #eee8d5;
$base3: #fdf6e3;
$yellow: #b58900;
$orange: #cb4b16;
$red: #dc322f;
$magenta: #d33682;
$violet: #6c71c4;
$blue: #268bd2;
$cyan: #2aa198;
$green: #859900;
*/
/*
#1d1f21 Background
#282a2e Current Line
#373b41 Selection
#c5c8c6 Foreground
#969896 Comment
#cc6666 Red
#de935f Orange
#f0c674 Yellow
#b5bd68 Green
#8abeb7 Aqua
#81a2be Blue
#b294bb Purple
*/
/* DARK THEME */
/* ---------- */
.prettyprint-dark {
background-color: #1d1f21;
border: 0;
padding: 10px;
}
.prettyprint-dark .linenums li {
color: #444;
}
.prettyprint-dark .linenums li:hover {
background-color: #282a2e;
}
/* tags in html */
.prettyprint-dark .kwd,
.prettyprint-dark .tag { color: #cc6666; }
/* html attr */
.prettyprint-dark .typ,
.prettyprint-dark .atn,
.prettyprint-dark .dec,
.prettyprint-dark .var { color: #de935f; }
/* html attr values */
.prettyprint-dark .str,
.prettyprint-dark .atv { color: #b5bd68; }
/*
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}*/

View File

@ -1,60 +0,0 @@
.highlight { background: #ffffff; }
.highlight .c { color: #999988; font-style: italic } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #195f91; } /* Keyword */
.highlight .o { color: #93a1a1; } /* Operator */
.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #999999 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { font-weight: bold } /* Keyword.Constant */
.highlight .kd { font-weight: bold } /* Keyword.Declaration */
.highlight .kp { } /* Keyword.Pseudo */
.highlight .kr { font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #009999 } /* Literal.Number */
.highlight .s { color: #d14 } /* Literal.String */
.highlight .na { color: #008080 } /* Name.Attribute */
.highlight .nb { color: #195F91 } /* Name.Builtin */
.highlight .nc { color: #CB4B16 } /* Name.Class */
.highlight .no { color: #CB4B16 } /* Name.Constant */
.highlight .ni { color: #800080 } /* Name.Entity */
.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #444444 } /* Name.Function */
.highlight .nn { color: #555555 } /* Name.Namespace */
.highlight .nt { color: #000080 } /* Name.Tag */
.highlight .nv { color: #008080 } /* Name.Variable */
.highlight .ow { font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mf { color: #009999 } /* Literal.Number.Float */
.highlight .mh { color: #009999 } /* Literal.Number.Hex */
.highlight .mi { color: #009999 } /* Literal.Number.Integer */
.highlight .mo { color: #009999 } /* Literal.Number.Oct */
.highlight .sb { color: #d14 } /* Literal.String.Backtick */
.highlight .sc { color: #d14 } /* Literal.String.Char */
.highlight .sd { color: #d14 } /* Literal.String.Doc */
.highlight .s2 { color: #268bd2 } /* Literal.String.Double */
.highlight .se { color: #d14 } /* Literal.String.Escape */
.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
.highlight .si { color: #d14 } /* Literal.String.Interpol */
.highlight .sx { color: #d14 } /* Literal.String.Other */
.highlight .sr { color: #009926 } /* Literal.String.Regex */
.highlight .s1 { color: #268bd2 } /* Literal.String.Single */
.highlight .ss { color: #444 } /* Literal.String.Symbol */
.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #008080 } /* Name.Variable.Class */
.highlight .vg { color: #008080 } /* Name.Variable.Global */
.highlight .vi { color: #008080 } /* Name.Variable.Instance */
.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */

View File

@ -1,205 +0,0 @@
body {
font-size: 16px;
line-height: 1.6em;
}
h1, h2, h3, h4, h5, h6 {
font-family: Georgia, "bitstream vera serif", Times, serif;
letter-spacing: -0.03em;
color: #000;
font-weight: normal;
line-height: 100%;
}
h1 {
font-size: 220%;
margin: 0 0 0.5em 0;
}
h2 {
font-size: 160%;
margin: 0 0 .5em 0;
}
h3 {
font-size: 130%;
margin: 0 0 .35em 0;
}
h4 {
font-size: 110%;
margin: 0 0 .35em 0;
}
h5 {
font-size: 110%;
margin: 0;
}
h6 {
font-size: 100%;
margin: 0;
}
h3 > code {
background-color: inherit;
color: black;
}
li {
color: #404040;
line-height: 1.6em;
}
/* Vagrant font is a little larger than normal. We like it that way. */
p {
font-size: 16px;
line-height: 25px;
}
/* Make all <pre> blocks pretty looking. No plain grey! */
pre {
background-color: #fefbf3;
v padding: 9px;
border: 1px solid rgba(0,0,0,.2);
-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.1);
-moz-box-shadow: 0 1px 2px rgba(0,0,0,.1);
box-shadow: 0 1px 2px rgba(0,0,0,.1);
}
pre, code {
font-size: 90%;
line-height: 1.6em;
}
pre > code {
background-color: #fefbf3;
}
.alert-message a {
font-weight: normal;
color: #0069D6;
}
.alert-message.block-message.grey {
background-color: whiteSmoke;
border-color: #CCC;
}
.alert-message.block-message.grey p {
margin-bottom: 9px;
}
.alert-message.block-message.notice {
background-image: url(/static/images/icons/error.png);
background-position: 10px 10px;
background-repeat: no-repeat;
padding-left: 52px;
font-size: 0.8em;
}
.right {
float: right;
}
.Header {
padding-bottom: 10px;
margin-bottom: 20px;
margin-top: 10px;
border-bottom: 1px solid #DDD;
}
.Footer {
text-align: center;
padding: 1em 0;
}
/*************************************************************
* Modules
*************************************************************/
.Module.logo h1 a {
color: #000;
}
.Module.logo h1 a:hover {
text-decoration: none;
}
.Module.logo h1 {
font-family: Helvetica, Arial, Verdana, sans-serif;
font-size: 60px;
font-weight: bold;
letter-spacing: -0.05em;
color: #111;
margin: 0;
}
.Module.logo h1 span.subtype {
color: #777;
}
.Module.navigation {
font-size: 1.1em;
font-variant: small-caps;
float: right;
margin-top: 8px;
}
.Module.navigation ul {
list-style-type: none;
}
.Module.navigation ul li {
float: left;
border-right: 1px dotted #DDD;
padding: 0.35em 0.75em;
}
.Module.sidebar ul, .Module.sidebar ol {
margin-bottom: 0;
}
.Module.steps li div.result {
padding: 3px;
}
.Module.steps li .running {
background-color: #FDF5D9;
}
.Module.steps li .success {
background-color: #D1EED1;
}
.Module.steps li .failure {
background-color: #FDDFDE;
}
.Module.buildtable tbody td.success,
.Module.waterfall thead th.success,
.Module.waterfall tbody td.success {
background-color: #D1EED1;
border-color: #BFE7BF;
}
.Module.buildtable tbody td.failure,
.Module.waterfall thead th.failure,
.Module.waterfall tbody td.failure {
background-color: #FDDFDE;
}
.Module.waterfall .BuildStep.running {
background-color: #FDF5D9;
}
.Module.waterfall .BuildStep.start {
background-color: #CCC;
}
.Module.builders tbody td.success {
background-color: #D1EED1;
}
.Module.builders tbody td.failure {
background-color: #FDDFDE;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

View File

@ -1,80 +0,0 @@
/* ========================================================
* bootstrap-tabs.js v1.4.0
* http://twitter.github.com/bootstrap/javascript.html#tabs
* ========================================================
* Copyright 2011 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ======================================================== */
!function( $ ){
"use strict"
function activate ( element, container ) {
container
.find('> .active')
.removeClass('active')
.find('> .dropdown-menu > .active')
.removeClass('active')
element.addClass('active')
if ( element.parent('.dropdown-menu') ) {
element.closest('li.dropdown').addClass('active')
}
}
function tab( e ) {
var $this = $(this)
, $ul = $this.closest('ul:not(.dropdown-menu)')
, href = $this.attr('href')
, previous
, $href
if ( /^#\w+/.test(href) ) {
e.preventDefault()
if ( $this.parent('li').hasClass('active') ) {
return
}
previous = $ul.find('.active a').last()[0]
$href = $(href)
activate($this.parent('li'), $ul)
activate($href, $href.parent())
$this.trigger({
type: 'change'
, relatedTarget: previous
})
}
}
/* TABS/PILLS PLUGIN DEFINITION
* ============================ */
$.fn.tabs = $.fn.pills = function ( selector ) {
return this.each(function () {
$(this).delegate(selector || '.tabs li > a, .pills > li > a', 'click', tab)
})
}
$(document).ready(function () {
$('body').tabs('ul[data-tabs] li > a, ul[data-pills] > li > a')
})
}( window.jQuery || window.ender );

File diff suppressed because one or more lines are too long

View File

@ -1,9 +0,0 @@
{% extends "layouts/base.html" %}
{% block content %}
<h1>Authentication Failed</h1>
<p>The username or password you entered were not correct.
Please go back and try again.
</p>
{% endblock %}

View File

@ -1,205 +0,0 @@
{% extends "layouts/base.html" %}
{% import 'macros/forms.html' as forms %}
{% from "macros/change.html" import change with context %}
{% block content %}
<h1>
Builder: <a href="{{ path_to_builder }}">{{ b.getBuilder().getName() }}</a>
Build #{{ b.getNumber() }}
</h1>
<ul class="tabs" data-tabs="tabs">
<li class="active"><a href="#steps">Steps</a></li>
<li><a href="#info">Build Info</a></li>
{% if ss.changes %}
<li><a href="#changes">Changes</a></li>
{% endif %}
<li><a href="#properties">Properties</a></li>
<li><a href="#resubmit">Resubmit Build</a></li>
</ul>
<div class="tab-content">
<div class="active" id="steps">
<h3>Steps and Logfiles:</h3>
<div class="Module steps">
<ol>
{% for s in steps %}
<li>
<div class="{{ s.css_class }} result">
<a href="{{ s.link }}">{{ s.name }}</a>
{{ s.text }}&nbsp;<span style="float:right">{{ '( ' + s.time_to_run + ' )' if s.time_to_run else '' }}</span>
</div>
<ul>
{% set item_class = cycler('alt', '') %}
{% for l in s.logs %}
<li class="{{ item_class.next() }}"><a href="{{ l.link }}">{{ l.name }}</a></li>
{% else %}
<li class="{{ item_class.next() }}">- no logs -</li>
{% endfor %}
{% for u in s.urls %}
<li class="{{ item_class.next() }}"><a href="{{ u.url }}">{{ u.logname }}</a></li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ol>
</div>
</div>
<div id="info">
{% if not b.isFinished() %}
<h3>Build In Progress:</h3>
{% if when_time %}
<p>ETA: {{ when_time }} [{{ when }}]</p>
{% endif %}
{{ current_step }}
{% if authz.advertiseAction('stopBuild') %}
<h3>Stop Build</h3>
{{ forms.stop_build(build_url+"/stop", authz, on_all=False, short=False, label='This Build') }}
{% endif %}
{% else %}
<h3>Results:</h3>
<p class="{{ result_css }} result">
{{ b.getText()|join(' ')|capitalize }}
</p>
{% if b.getTestResults() %}
<h3><a href="{{ tests_link }}"/></h3>
{% endif %}
{% endif %}
<h3>SourceStamp:</h3>
<table class="zebra-striped">
{% set ss_class = cycler('alt','') %}
{% if ss.project %}
<tr class="{{ ss_class.next() }}"><td class="left">Project</td><td>{{ ss.project|projectlink }}</td></tr>
{% endif %}
{% if ss.repository %}
<tr class="{{ ss_class.next() }}"><td class="left">Repository</td><td>{{ ss.repository|repolink }}</td></tr>
{% endif %}
{% if ss.branch %}
<tr class="{{ ss_class.next() }}"><td class="left">Branch</td><td>{{ ss.branch|e }}</td></tr>
{% endif %}
{% if ss.revision %}
<tr class="{{ ss_class.next() }}"><td class="left">Revision</td><td>{{ ss.revision|revlink(ss.repository) }}</td></tr>
{% endif %}
{% if got_revision %}
<tr class="{{ ss_class.next() }}"><td class="left">Got Revision</td><td>{{ got_revision|revlink(ss.repository) }}</td></tr>
{% endif %}
{% if ss.patch %}
<tr class="{{ ss_class.next() }}"><td class="left">Patch</td><td>YES</td></tr>
{% endif %}
{% if ss.changes %}
<tr class="{{ ss_class.next() }}"><td class="left">Changes</td><td>see below</td></tr>
{% endif %}
{% if most_recent_rev_build %}
<tr class="{{ ss_class.next() }}"><td class="left" colspan="2">Build of most recent revision</td></tr>
{% endif %}
</table>
<h3>BuildSlave:</h3>
{% if slave_url %}
<a href="{{ slave_url|e }}">{{ b.getSlavename()|e }}</a>
{% else %}
{{ b.getSlavename()|e }}
{% endif %}
<h3>Reason:</h3>
<p>
{{ b.getReason()|e }}
</p>
<h3>Blamelist:</h3>
{% if responsible_users %}
<ol>
{% for u in responsible_users %}
<li class="{{ loop.cycle('alt', '') }}">{{ u|user }}</li>
{% endfor %}
</ol>
{% else %}
<p>no responsible users</p>
{% endif %}
<h3>Timing:</h3>
<table>
<tr class="alt"><td class="left">Start</td><td>{{ start }}</td></tr>
{% if end %}
<tr><td class="left">End</td><td>{{ end }}</td></tr>
{% endif %}
<tr {{ 'class="alt"' if end else '' }}><td class="left">Elapsed</td><td>{{ elapsed }}</td></tr>
</table>
</div>
<div id="properties">
<h3>Build Properties:</h3>
<table class="zebra-striped">
<thead>
<tr>
<th>Name</th>
<th>Value</th>
<th>Source</th>
</tr>
</thead>
<tbody>
{% for p in properties %}
<tr class="{{ loop.cycle('alt', '') }}">
<td class="left">{{ p.name|e }}</td>
{% if p.short_value %}
<td>{{ p.short_value|e }} .. [property value too long]</td>
{% else %}
<td>{{ p.value|e }}</td>
{% endif %}
<td>{{ p.source|e }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div id="resubmit">
{% if authz.advertiseAction('forceBuild') %}
<h3>Resubmit Build</h3>
{{ forms.rebuild_build(build_url+"/rebuild", authz, exactly, ss) }}
{% endif %}
</div>
{% if ss.changes %}
<div id="changes">
<div class="span16">
<h3>All Changes:</h3>
<ol>
{% for c in ss.changes %}
<li><h3>Change #{{ c.number }}</h3>
{{ change(c.asDict()) }}
</li>
{% else %}
<li>no changes</li>
{% endfor %}
</ol>
</div>
</div>
{% endif %}
</div>
{% endblock %}

View File

@ -1,118 +0,0 @@
{% import 'macros/forms.html' as forms %}
{% from 'macros/build_line.html' import build_table %}
{% extends "layouts/base.html" %}
{% block content %}
<h1>Builder: {{ name }}</h1>
<ul class="tabs" data-tabs="tabs">
<li class="active"><a href="#builds">Builds</a></li>
<li><a href="#slaves">Build Slaves</a></li>
<li><a href="#force-build">Force Build</a></li>
</ul>
<div class="tab-content">
<div class="active" id="builds">
<h3>Current Builds:</h3>
{% if current %}
<ul>
{% for b in current %}
<li><a href="{{ b.link }}">{{ b.num }}</a>
{% if b.when %}
ETA: {{ b.when_time }} [{{ b.when }}]
{% endif %}
{{ b.current_step }}
{% if authz.advertiseAction('stopBuild') %}
{{ forms.stop_build(b.stop_url, authz, on_all=False, short=True, label='Build') }}
{% endif %}
</li>
{% endfor %}
</ul>
{% else %}
<p>No current builds.</p>
{% endif %}
<h3>Pending Build Requests:</h3>
{% if pending %}
<ul>
{% for b in pending %}
<li>{{ b.when }}, waiting {{ b.delay }}
{% if authz.advertiseAction('cancelPendingBuild') %}
{{ forms.cancel_pending_build(builder_url+"/cancelbuild", authz, short=True, id=b.id) }}
{% endif %}
{% if b.num_changes < 4 %}
{% for c in b.changes %}{{ c.revision|shortrev(c.repo) }}
(<a href="{{ c.url }}">{{ c.who }}</a>){% if not loop.last %},{% endif %}
{% endfor %}
{% else %}
({{ b.num_changes }} changes)
{% endif %}
</li>
{% endfor %}
</ul>
{% if authz.advertiseAction('cancelPendingBuild') %}
{{ forms.cancel_pending_build(builder_url+"/cancelbuild", authz, short=False, id='all') }}
{% endif %}
{% else %}
<p>
No pending build requests.
</p>
{% endif %}
<h3>Recent Builds:</h3>
{{ build_table(recent) }}
</div>
<div id="slaves">
<h3>Buildslaves:</h3>
<table class="info">
{% if slaves %}
<thead>
<tr>
<th>Name</th>
<th>Status</th>
<th>Admin</th>
</tr>
</thead>
{% endif %}
<tbody>
{% for s in slaves %}
<tr class="{{ loop.cycle('alt', '') }}">
<td><b><a href="{{ s.link|e }}">{{ s.name|e }}</a></b></td>
{% if s.connected %}
<td class="idle">connected</td>
<td>{{ s.admin|email if s.admin else ""}}</td>
{% else %}
<td class="offline">offline</td>
<td/>
{% endif %}
</tr>
{% else %}
<td>no slaves attached</td>
{% endfor %}
</tbody>
</table>
{% if authz.advertiseAction('pingBuilder') %}
<h3>Ping slaves</h3>
{{ forms.ping_builder(builder_url+"/ping", authz) }}
{% endif %}
</div>
<div id="force-build">
{% if authz.advertiseAction('forceBuild') %}
<h3>Force build</h3>
{{ forms.force_build(builder_url+"/force", authz, False) }}
{% endif %}
</div>
</div>
{% endblock %}

View File

@ -1,33 +0,0 @@
{% extends "layouts/base.html" %}
{% from "macros/box.html" import box %}
{% block content %}
<h1>Builders</h1>
<table class="Module builders">
<thead>
<tr>
<th>Builder Name</th>
<th>Last Build</th>
<th>Current Status</th>
</tr>
</thead>
<tbody>
{% for b in builders %}
<tr>
<td class="box"><a href="{{ b.link }}">{{ b.name|e }}</a></td>
{% if b.build_url %}
<td class="LastBuild box {{ b.build_css_class }}">
<a href="{{ b.build_url }}">{{ b.build_label }}</a>
<br/>{{ b.build_text }}
</td>
{% else %}
<td class="LastBuild box">no build</td>
{% endif %}
{{ box(**b.current_box) }}
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

View File

@ -1,72 +0,0 @@
{% import 'macros/forms.html' as forms %}
{% from 'macros/build_line.html' import build_table, build_line %}
{% extends "layouts/base.html" %}
{% block content %}
<h1>Buildslave: {{ slavename|e }}</h1>
<ul class="tabs" data-tabs="tabs">
<li class="active"><a href="#current">Current Builds</a></li>
<li><a href="#recent">Recent Builds</a></li>
<li><a href="#info">Slave Info</a></li>
</ul>
<div class="tab-content">
<div class="active" id="current">
{% if current %}
<h3>Currently building:</h3>
<ul>
{% for b in current %}
<li>{{ build_line(b, True) }}
<form method="post" action="{{ b.buildurl }}/stop" class="command stopbuild" style="display:inline">
<input type="submit" value="Stop Build" />
<input type="hidden" name="url" value="{{ this_url }}" />
</form>
</li>
{% endfor %}
</ul>
{% else %}
<h3>No current builds</h3>
{% endif %}
</div>
<div id="recent">
<h3>Recent builds</h3>
{{ build_table(recent, True) }}
</div>
<div id="info">
{% if access_uri %}
<a href="{{ access_uri|e }}">Click to Access Slave</a>
{% endif %}
{% if admin %}
<h3>Administrator</h3>
<p>{{ admin|email }}</p>
{% endif %}
{% if host %}
<h3>Slave information</h3>
Buildbot-Slave {{ slave_version }}
<pre>{{ host|e }}</pre>
{% endif %}
<h2>Connection Status</h3>
<p>
{{ connect_count }} connection(s) in the last hour
{% if not slave.isConnected() %}
(not currently connected)
{% else %}
</p>
{% if authz.advertiseAction('gracefulShutdown') %}
<h2>Graceful Shutdown</h2>
{% if slave.getGraceful() %}
<p>Slave will shut down gracefully when it is idle.</p>
{% else %}
{{ forms.graceful_shutdown(shutdown_url, authz) }}
{% endif %}
{% endif %}
{% endif %}
</div>
</div>
{% endblock %}

View File

@ -1,70 +0,0 @@
{% extends "layouts/base.html" %}
{% block content %}
<h1>Buildslaves</h1>
<table class="zebra-striped">
<thead>
<tr>
<th>Name</th>
{%- if show_builder_column %}
<th>Builders</th>
{%- endif %}
<th>BuildBot</th>
<th>Admin</th>
<th>Last heard from</th>
<th>Connects/Hour</th>
<th>Status</th>
</tr>
</thead>
<tbody>
{% for s in slaves %}
<tr class="{{ loop.cycle('alt','') }}">
<td><b><a href="{{ s.link }}">{{ s.name }}</a></b></td>
{%- if show_builder_column %}
<td>
{%- if s.builders %}
{%- for b in s.builders %}
<a href="{{ b.link }}">{{ b.name }}</a><br />
{%- endfor %}
{%- else %}
<span class="Warning">no builders</span>
{%- endif -%}
</td>
{%- endif %}
<td>{{ (s.version or '-')|e }}</td>
{%- if s.admin -%}
<td>{{ s.admin|email }}</td>
{%- else -%}
<td>-</td>
{%- endif -%}
<td>
{%- if s.last_heard_from_age -%}
{{ s.last_heard_from_age }}
{%- endif -%}
</td>
<td>
{{ s.connectCount }}
</td>
{% if s.connected %}
{% if s.running_builds %}
<td class="building">Running {{ s.running_builds }} build(s)</td>
{% else %}
<td class="idle">Idle</td>
{% endif %}
{% else %}
<td class="offline">Not connected</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

View File

@ -1,15 +0,0 @@
{% import 'macros/forms.html' as forms %}
{% from "macros/change.html" import change with context %}
{% extends "layouts/base.html" %}
{% block content %}
<h1>{{ pageTitle }}</h1>
{{ change(c) }}
{% if authz.advertiseAction('stopChange') %}
<h3>Cancel Builds For Change:</h3>
{{ forms.stop_change_builds("/builders/_all/stopchangeall", c.number, authz) }}
{% endif %}
{% endblock %}

View File

@ -1,58 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Vagrant CI</title>
<meta name="description" content="CI website for Vagrant, a tool for creating and distributing virtualized environments.">
<link rel="stylesheet" href="/static/css/bootstrap-1.4.0.min.css" type="text/css" media="screen" />
<link rel="stylesheet" href="/static/css/syntax.css" type="text/css" media="screen" />
<link rel="stylesheet" href="/static/css/vagrant.base.css" type="text/css" media="screen" />
<script src="/static/js/jquery-1.7.min.js" type="text/javascript" charset="utf-8"></script>
<script src="/static/js/bootstrap-tabs.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div class="container">
<div class="row Header">
<div class="span4 Module logo">
<h1><a href="/">Vagrant&nbsp;<span class="subtype">CI</span></a></h1>
</div>
<div class="span12">
<div class="Module navigation">
<ul>
<li><a href="/">home</a></li>
<li><a href="/builders">builders</a></li>
<li><a href="/waterfall">waterfall</a></li>
<li><a href="/buildslaves">build slaves</a></li>
</ul>
</div>
</div>
</div>
<div class="row">
<div class="span16">
{%- block content -%}
{%- endblock -%}
</div>
</div>
<div class="row Footer">
<div class="span16">
Copyright <a href="/license.html">&copy;</a> 2009-2011. <a href="http://mitchellhashimoto.com">Mitchell Hashimoto</a> and <a href="http://nickelcode.com">John Bender</a>. Design by <a href="http://www.simonecarletti.com/">Simone Carletti</a>.
</div>
</div>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-15091924-1");
pageTracker._trackPageview();
} catch(err) {}
</script>
</div>
</body>
</html>

View File

@ -1,37 +0,0 @@
{% macro box(text=[], comment=None) -%}
{%- if comment -%}<!-- {{ comment }} -->{%- endif -%}
<td class="{{ kwargs.class or kwargs.class_ or "" }}"
{%- for prop in ("align", "colspan", "rowspan", "border", "valign", "halign") -%}
{%- if prop in kwargs %} {{ prop }}="{{ kwargs[prop] }}"{% endif -%}
{%- endfor -%}>
{%- if text is string -%}
{{ text }}
{%- else -%}
{{- text|join("<br/>") -}}
{%- endif -%}
</td>
{% endmacro %}
{# this is currently just the text part of the boxes #}
{% macro build_box(reason, url, number) -%}
<a title="Reason: {{ reason|e }}" href="{{ url }}">Build {{ number }}</a>
{%- endmacro %}
{% macro step_box(text, logs, urls) -%}
{%- if text is string -%}
{{ text }}
{%- else -%}
{{- text|join("<br/>") -}}
{%- endif -%}
<br/>
{%- for l in logs %}
<a {% if l.url %}href="{{ l.url }}"{% endif %}>{{ l.name|e }}</a><br/>
{%- endfor -%}
{%- for u in urls %}
[<a href="{{ u.link }}" class="BuildStep external">{{ u.name|e }}</a>]<br/>
{%- endfor -%}
{%- endmacro %}

View File

@ -1,50 +0,0 @@
{% macro build_line(b, include_builder=False) %}
<small>({{ b.time }})</small>
Rev: {{ b.rev|shortrev(b.rev_repo) }}
<span class="{{ b.class }}">{{ b.results }}</span>
{% if include_builder %}
<a href="{{ b.builderurl }}">{{ b.builder_name }}</a>
{% endif %}
<a href="{{ b.buildurl }}">#{{ b.buildnum }}</a> -
{{ b.text|capitalize }}
{% endmacro %}
{% macro build_tr(b, include_builder=False, loop=None) %}
<tr class="{{ loop.cycle('alt', '') if loop }}">
<td>{{ b.time }}</td>
<td>{{ b.rev|shortrev(b.rev_repo) }}</td>
<td class="results {{ b.class }}">{{ b.results }}</td>
{%- if include_builder %}
<td><a href="{{ b.builderurl }}">{{ b.builder_name }}</a></td>
{% endif %}
<td><a href="{{ b.buildurl }}">#{{ b.buildnum }}</a></td>
<td class="left">{{ b.text|capitalize }}</td>
</tr>
{% endmacro %}
{% macro build_table(builds, include_builder=False) %}
{% if builds %}
<table class="zebra-striped Module buildtable">
<thead>
<tr>
<th>Time</th>
<th>Revision</th>
<th>Result</th>
{%- if include_builder %}
<th>Builder</th>
{% endif %}
<th>Build #</th>
<th>Info</th>
</tr>
</thead>
<tbody>
{% for b in builds %}
{{ build_tr(b, include_builder, loop) }}
{% endfor %}
</tbody>
</table>
{% else %}
No matching builds found
{% endif %}
{% endmacro %}

View File

@ -1,81 +0,0 @@
{% macro change(c) %}
<table class="zebra-striped">
<tbody>
<tr>
<td class="left">Changed by</td>
<td><b>{{ c.who|email }}</b></td>
</tr>
<tr>
<td class="left">Changed at</td>
<td><b>{{ c.at }}</b></td>
</tr>
{% if c.repository %}
<tr>
<td class="left">Repository</td>
<td><b>{{ c.repository|repolink }}</b></td>
</tr>
{% endif %}
{% if c.project %}
<tr>
<td class="left">Project</td>
<td><b>{{ c.project|projectlink }}</b></td>
</tr>
{% endif %}
{% if c.branch %}
<tr>
<td class="left">Branch</td>
<td><b>{{ c.branch|e }}</b></td>
</tr>
{% endif %}
{% if c.rev %}
<tr>
<td class="left">Revision</td>
<td>{%- if c.revlink -%}<a href="{{ c.revlink }}">{{ c.rev|e }}</a>
{%- else -%}{{ c.rev|revlink(c.repository) }} {%- endif -%}</td>
</tr>
{% endif %}
</tbody>
</table>
{% if c.comments %}
<h3>Comments</h3>
<pre>{{ c.comments|changecomment(c.project) }}</pre>
{% endif %}
<h3>Changed files</h3>
<ul>
{% for f in c.files -%}
<li>
{%- if f.url %}
<a href="{{ f.url }}">{{ f.name|e }}</a>
{%- else %}
{{ f.name|e }}
{%- endif -%}
</li>
{% else %}
<li>no files</li>
{% endfor %}
</ul>
{% if c.properties %}
<h3>Properties</h3>
<table class="zebra-striped">
{% for p in c.properties %}
<tr>
<td class="left">{{ p[0]|capitalize|e }}</td>
<td>{{ p[1]|e }}</td>
</tr>
{% endfor %}
</table>
{% endif %}
{%- endmacro %}
{% macro box_contents(who, url, pageTitle) -%}
<a href="{{ url }}" title="{{ pageTitle|e }}">{{ who|user }}</a>
{%- endmacro %}

View File

@ -1,300 +0,0 @@
{% macro auth() %}
<div class="clearfix">
<label for="username">Your username:</label>
<div class="input">
<input type="text" name="username"/>
</div>
</div>
<div class="clearfix">
<label for="password">Your password:</label>
<div class="input">
<input type="password" name="passwd"/>
</div>
</div>
{% endmacro %}
{% macro cancel_pending_build(cancel_url, authz, short=False, id='all') %}
{% if not short or not authz.needAuthForm('cancelPendingBuild') %}
<form method="post" name="cancel" action="{{ cancel_url }}" class='command cancelbuild'
{{ 'style="display:inline"' if short else '' }}>
{% if not short %}
{% if on_all %}
<p>To cancel all builds, fill out the following fields and
push the 'Cancel' button</p>
{% else %}
<p>To cancel this build, fill out the following fields and
push the 'Cancel' button</p>
{% endif %}
{% endif %}
{% if authz.needAuthForm('cancelPendingBuild') %}
{{ auth() }}
{% elif not short %}
<p>To cancel individual builds, click the 'Cancel' buttons above.</p>
{% endif %}
<input type="hidden" name="id" value="{{ id }}" />
<div class="actions">
<input type="submit" class="btn" value="Cancel" />
</div>
</form>
{% endif %}
{% endmacro %}
{% macro stop_change_builds(stopchange_url, changenum, authz) %}
{% if not changenum or not authz.needAuthForm('stopChange') %}
<form method="post" action="{{ stopchange_url }}" class='command stopchange'>
{% if changenum %}
<p>To cancel all builds for this change, push the 'Cancel' button</p>
{% else %}
<p>To cancel builds for this builder for a given change, fill out all
fields and push the 'Cancel' button</p>
{% endif %}
{% if authz.needAuthForm('cancelPendingBuild') %}
{{ auth() }}
{% endif %}
{% if changenum %}
<input type="hidden" name="change" value="{{ changenum }}" />
{% else %}
<div class="row">
<span class="label">Change #:</span>
<input type="text" name="change"/>
</div>
{% endif %}
<input type="submit" value="Cancel" />
</form>
{% endif %}
{% endmacro %}
{% macro stop_build(stop_url, authz, on_all=False, on_selected=False, builders=[], short=False, label="Build") %}
{% if not short or not authz.needAuthForm('stopBuild') %}
<form method="post" name="stop_build" action="{{ stop_url }}" class='command stopbuild'
{{ 'style="display:inline"' if short else '' }}>
{% if not short %}
{% if on_all %}
<p>To stop all builds, fill out the following field and
push the <i>Stop {{ label }}</i> button</p>
{% elif on_selected %}
<p>To stop selected builds, select the builders, fill out the
following field and push the <i>Stop {{ label }}</i> button</p>
<table>
{% for b in builders %}
<tr>
<td align="center"><input type="checkbox" name="selected" value="{{ b.name }}"></td>
<td class="box"><a href="{{ b.link }}">{{ b.name|e }}</a></td>
</tr>
{% endfor %}
</table>
{% else %}
<p>To stop this build, fill out the following field and
push the <i>Stop {{ label }}</i> button</p>
{% endif %}
{% endif %}
{% if authz.needAuthForm('stopBuild') %}
{{ auth() }}
{% endif %}
{% if not short %}
<div class="clearfix">
<label for="comments">Reason</label>
<div class="input">
<input type="text" name="comments" />
</div>
</div>
{% endif %}
<div class="actions">
<input type="submit" class="btn primary" value="Stop" />
</div>
</form>
{% endif %}
{% endmacro %}
{% macro force_build(force_url, authz, on_all=False, on_selected=False, builders=[]) %}
<form method="post" name="force_build" action="{{ force_url }}" class="command forcebuild">
{% if on_all %}
<p>To force a build on <strong>all Builders</strong>, fill out the following fields
and push the 'Force Build' button</p>
{% elif on_selected %}
<p>To force a build on <strong>certain Builders</strong>, select the
builders, fill out the following fields and push the
'Force Build' button</p>
<table>
{% for b in builders %}
<tr>
<td align="center"><input type="checkbox" name="selected" value="{{ b.name }}"></td>
<td class="box"><a href="{{ b.link }}">{{ b.name|e }}</a></td>
</tr>
{% endfor %}
</table>
{% else %}
<p>To force a build, fill out the following fields and
push the 'Force Build' button</p>
{% endif %}
{% if authz.needAuthForm('forceBuild') %}
{{ auth() }}
{% else %}
<div class="clearfix">
<label for="username">Your name</label>
<div class="input">
<input type="text" name="username" />
</div>
</div>
{% endif %}
<div class="clearfix">
<label for="comments">Reason for build</label>
<div class="input">
<input type="text" name="comments" />
</div>
</div>
<div class="clearfix">
<label for="branch">Branch to build</label>
<div class="input">
<input type="text" name="branch" />
</div>
</div>
<div class="clearfix">
<label for="revision">Revision to build</label>
<div class="input">
<input type="text" name="revision" />
</div>
</div>
<div class="clearfix">
<label for="repository">Repository to build</label>
<div class="input">
<input type="text" name="repository" />
</div>
</div>
<div class="clearfix">
<label for="project">Project to build</label>
<div class="input">
<input type="text" name="project" />
</div>
</div>
<div class="actions">
<input type="submit" class="btn" value="Force Build" />
</div>
</form>
{% endmacro %}
{% macro graceful_shutdown(shutdown_url, authz) %}
<form method="post" action="{{ shutdown_url }}" class='command graceful_shutdown'>
<p>To cause this slave to shut down gracefully when it is idle,
push the 'Graceful Shutdown' button</p>
{% if authz.needAuthForm('gracefulShutdown') %}
{{ auth() }}
{% endif %}
<input type="submit" value="Graceful Shutdown" />
</form>
{% endmacro %}
{% macro clean_shutdown(shutdown_url, authz) %}
<form method="post" action="{{ shutdown_url }}" class='command clean_shutdown'>
<p>To cause this master to shut down cleanly, push the 'Clean Shutdown' button.</p>
<p>No other builds will be started on this master, and the master will
stop once all current builds are finished.</p>
{% if authz.needAuthForm('gracefulShutdown') %}
{{ auth() }}
{% endif %}
<input type="submit" value="Clean Shutdown" />
</form>
{% endmacro %}
{% macro cancel_clean_shutdown(cancel_shutdown_url, authz) %}
<form method="post" action="{{ cancel_shutdown_url }}" class='command cancel_clean_shutdown'>
<p>To cancel a previously initiated shutdown, push the 'Cancel Shutdown' button.</p>
{% if authz.needAuthForm('gracefulShutdown') %}
{{ auth() }}
{% endif %}
<input type="submit" value="Cancel Shutdown" />
</form>
{% endmacro %}
{% macro ping_builder(ping_url, authz) %}
<form method="post" action="{{ ping_url }}" class='command ping_builder'>
<p>To ping the buildslave(s), push the 'Ping' button</p>
{% if authz.needAuthForm('gracefulShutdown') %}
{{ auth() }}
{% endif %}
<input type="submit" class="btn" value="Ping Builder" />
</form>
{% endmacro %}
{% macro rebuild_build(rebuild_url, authz, exactly, ss) %}
<form method="post" action="{{ rebuild_url }}" class="command rebuild">
{% if exactly %}
<p>This tree was built from a specific set of
source files, and can be rebuilt exactly</p>
{% else %}
<p>This tree was built from the most recent revision
{% if ss.branch %}
(along branch {{ ss.branch }})
{% endif %}
and thus it might not be possible to rebuild it
exactly. <br/>Any changes that have been committed
after this build was started <b>will</b> be
included in a rebuild.</p>
{% endif %}
{% if on_all %}
<p>To force a build on <strong>all Builders</strong>, fill out the following fields
and push the 'Force Build' button</p>
{% else %}
<p>To force a build, fill out the following fields and
push the 'Force Build' button</p>
{% endif %}
{% if authz.needAuthForm('forceBuild') %}
{{ auth() }}
{% endif %}
<div class="clearfix">
<label for="comments">Reason for build</label>
<div class="input">
<input type="text" name="comments" />
</div>
</div>
<div class="actions">
<input type="submit" class="btn primary" value="Rebuild" />
</div>
</form>
{% endmacro %}
{% macro show_users(users_url, authz) %}
<form method="post" action="{{ users_url }}" class='command show_users'>
<p>To show users, press the 'Show Users' button</p>
{% if authz.needAuthForm('showUsersPage') %}
{{ auth() }}
{% endif %}
<input type="submit" value="Show Users" />
</form>
{% endmacro %}

View File

@ -1,42 +0,0 @@
{% extends "layouts/base.html" %}
{% block content %}
<div class="alert-message warning">
<strong>Vagrant CI is under construction!</strong> This site is still
brand new and the exact builders, build slaves, and stability of the CI
will be in flux for the next few weeks.
</div>
<img src="/static/images/vagrant_looking.png" class="right" />
<p>
<strong>Vagrant CI, keeping Vagrant stable every step of the way.</strong>
</p>
<p>
Welcome to the CI for <a href="http://vagrantup.com">Vagrant</a>, a tool
for building and distributing virtualized environments. In order to maintain
the level of stability that users of Vagrant have come to expect, this
CI system will run a wide range of tests against all commits to the
<a href="https://github.com/mitchellh/vagrant">Vagrant project</a>.
</p>
<p>
Here is a brief overview of the pages you may be interested in:
</p>
<ul>
<li>
<a href="/waterfall">Waterfall</a> - This page will show you the status
of all the builders in reverse chronological order so you can see what
the CI is up to at this moment.
</li>
<li>
<a href="/builders">Builders</a> - This page will show you the various
builders. Builders are the things which know how to perform one kind of
build (unit tests, acceptance tests, etc.). From here you can also see the
status of the last build for each builder as well as the current status
of the builder.
</li>
</ul>
{% endblock %}

View File

@ -1,53 +0,0 @@
{% extends "layouts/base.html" %}
{% from "macros/box.html" import box %}
{% block content %}
<p>
This is the Waterfall page. It shows the status of various builders in
reverse chronological order. This allows you to see the most recent builds
and their current status. You can additionally see the commits as they come
in to the project.
</p>
<table class="bordered-table Module waterfall">
<thead>
<tr>
<th colspan="2">Builder</th>
{% for b in builders %}
<th class="{{ b.top_class }}">
<a href="{{ b.url }}">{{ b.name }}</a><br />
{{ " ".join(b.top) }}
</th>
{% endfor %}
</tr>
</thead>
<tbody>
<tr>
<th colspan="2">Current Activity</th>
{% for b in builders %}
<td class="{{ b.status_class }}">
{{ "<br />".join(b.status) }}
</td>
{% endfor %}
</tr>
<tr>
<th>Time ({{ tz }})</th>
<th>Changes</th>
{% for b in builders %}
<td>&nbsp;</td>
{% endfor %}
</tr>
{% for i in range(gridlen) -%}
<tr>
{% for strip in grid -%}
{%- if strip[i] -%}{{ box(**strip[i]) }}
{%- elif no_bubble -%}{{ box() }}
{%- endif -%}
{%- endfor -%}
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

View File

@ -1,4 +0,0 @@
buildbot==0.8.5
buildbot-slave==0.8.5
pytest==2.1.0
vendor/choices-0.4.0.tar.gz

View File

@ -1,38 +0,0 @@
#!/bin/sh
#
# This shell script deploys the buildmaster by downloading an
# up-to-date tar.gz from GitHub and setting up the proper environment.
#----------------------------------------------------------------------
# Update the source
#----------------------------------------------------------------------
# Download the Vagrant source, extract it
cd /tmp
rm -rf vagrant
rm -rf mitchellh-vagrant-*
wget https://github.com/mitchellh/vagrant/tarball/master -O vagrant.tar.gz
tar xvzf vagrant.tar.gz
mv mitchellh-vagrant-* vagrant
# Move the code into place
cp -R vagrant/test/buildbot/* /srv/buildmaster/
# Setup the virtualenv
cd /srv/buildmaster
virtualenv --no-site-packages env
# Activate the environment
. env/bin/activate
# Install dependencies
pip install -r requirements.txt
#----------------------------------------------------------------------
# Update the buildmaster
#----------------------------------------------------------------------
# Setup environmental variables that are required
export BUILDBOT_CONFIG=/etc/buildmaster/master.cfg
export PYTHONPATH=/srv/buildmaster
# Restart the buildmaster
buildbot restart master/

View File

@ -1,107 +0,0 @@
#!/bin/sh
#
# This shell script installs and prepares all the software necessary
# to run the build master. This script is expected to be run as root.
# This script is made to be run only on Ubuntu 10.04 LTS at the moment.
# Update the source list
apt-get update
# Install the basic sysadmin stuff
apt-get install -y htop
# Fix the mountall bug in the AMI
sed -i -e 's/nobootwait,//' /etc/fstab
#----------------------------------------------------------------------
# Python Setup
#----------------------------------------------------------------------
# Install Python and pip
apt-get install -y python python-dev python-setuptools
easy_install pip
# Install virtualenv
pip install virtualenv
#----------------------------------------------------------------------
# Deploy Setup
#----------------------------------------------------------------------
# Install Git, which is used for all the deploys of the build master
apt-get install -y git-core
# Create the user/group for the buildmaster
groupadd buildmaster
useradd -d /home/buildmaster -g buildmaster -s /bin/bash buildmaster
mkdir /home/buildmaster
chown -R buildmaster:buildmaster /home/buildmaster
# Make the folder which will contain the buildmaster code
mkdir -p /srv/buildmaster
chown buildmaster:buildmaster /srv/buildmaster
# Make the folder which will contain the configuration for the
# buildmaster
mkdir -p /etc/buildmaster
chown buildmaster:buildmaster /etc/buildmaster
#----------------------------------------------------------------------
# Nginx Setup
#----------------------------------------------------------------------
# Install Nginx
apt-get install -y nginx
# Setup the basic directories
mkdir -p /etc/nginx/conf.d
mkdir -p /etc/nginx/sites-available
mkdir -p /etc/nginx/sites-enabled
# Setup the configuration
cat <<EOF > /etc/nginx/nginx.conf
user www-data;
worker_processes 1;
# Raise the limit on open file descriptors
worker_rlimit_nofile 30000;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
EOF
# Setup the buildbot site
cat <<EOF > /etc/nginx/sites-available/buildmaster.conf
server {
listen 80;
location / {
proxy_pass http://localhost:8000;
}
}
EOF
# Activate the buildbot site, remove the default
rm /etc/nginx/sites-enabled/default
ln -f -s /etc/nginx/sites-available/buildmaster.conf /etc/nginx/sites-enabled/buildmaster.conf
# Restart nginx
/etc/init.d/nginx restart

View File

@ -1,43 +0,0 @@
import os
from twisted.application import service
from buildslave.bot import BuildSlave
from buildbot_config.config.slave import options
basedir = r'.'
rotateLength = 10000000
maxRotatedFiles = 10
# if this is a relocatable tac file, get the directory containing the TAC
if basedir == '.':
import os.path
basedir = os.path.abspath(os.path.dirname(__file__))
# note: this line is matched against to check that this is a buildslave
# directory; do not edit it.
application = service.Application('buildslave')
try:
from twisted.python.logfile import LogFile
from twisted.python.log import ILogObserver, FileLogObserver
logfile = LogFile.fromFullPath(os.path.join(basedir, "twistd.log"), rotateLength=rotateLength,
maxRotatedFiles=maxRotatedFiles)
application.setComponent(ILogObserver, FileLogObserver(logfile).emit)
except ImportError:
# probably not yet twisted 8.2.0 and beyond, can't set log yet
pass
buildmaster_host = options.master_host
port = options.master_port
slavename = options.name
passwd = options.password
keepalive = 600
usepty = 0
umask = None
maxdelay = 300
s = BuildSlave(buildmaster_host, port, slavename, passwd, basedir,
keepalive, usepty, umask=umask, maxdelay=maxdelay)
s.setServiceParent(application)

View File

@ -1 +0,0 @@
Buildslave Admin <foo@bar.com>

View File

@ -1 +0,0 @@
Please put a description of this build host here

View File

@ -1,41 +0,0 @@
from buildbot.buildslave import BuildSlave
from buildbot_config.master.slaves import (
BuildSlavesFromSlaveConfigs,
SlaveConfig,
SlaveListFromConfig)
class TestSlaveListFromConfig(object):
Klass = SlaveListFromConfig
def test_parse_single(self):
"""
Tests that the config parser can parse a single
slave.
"""
instance = self.Klass("foo:bar")
assert 1 == len(instance)
assert SlaveConfig("foo", "bar") == instance[0]
def test_parse_multiple(self):
"""
Tests that the config parser can parse multiple
slaves.
"""
instance = self.Klass("foo:bar,bar:baz")
expected = [SlaveConfig("foo", "bar"), SlaveConfig("bar", "baz")]
assert 2 == len(instance)
assert expected == instance
class TestBuildSlavesFromSlaveConfig(object):
Klass = BuildSlavesFromSlaveConfigs
def test_returns_build_slaves(self):
"""
Tests that build slaves are properly returned for each
slave configuration.
"""
instance = self.Klass([SlaveConfig("foo", "bar")])
assert 1 == len(instance)
assert isinstance(instance[0], BuildSlave)

Binary file not shown.